Encryption RSA过程密码学

Encryption RSA过程密码学,encryption,rsa,maple,prime-factoring,greatest-common-divisor,Encryption,Rsa,Maple,Prime Factoring,Greatest Common Divisor,您好,我想知道是否有人可以帮助我使用maple完成以下步骤 下面是rsa解密/加密方法的协议,下面是我尝试解决的问题,下面是我的尝试,我将非常感谢您的帮助。谢谢 我目前的尝试如下 rsa := proc (key::rsakey, msg::(list(rsascii))) local ct, pe, pm, i; pm := 26271227347; pe := key[2]; ct := []; for i to nops(msg) do ct := [op(ct), `mod`

您好,我想知道是否有人可以帮助我使用maple完成以下步骤

下面是rsa解密/加密方法的协议,下面是我尝试解决的问题,下面是我的尝试,我将非常感谢您的帮助。谢谢

我目前的尝试如下

rsa := proc (key::rsakey, msg::(list(rsascii))) 
local ct, pe, pm, i; 
 pm := 26271227347; 
pe := key[2]; 
ct := [];
for i to nops(msg) do ct := [op(ct), `mod`(message[i]^pe, pm)] 
end do; 
RETURN(ct) 
end proc;

这是通过使用maple网站获得的
n
e
,您需要找到相应的
d
,然后才能解码。我不明白你为什么要用
e
解码

您的过程至少包含一种类型,使用
message[i]
而不是
msg[i]
。另请参见下面代码中的注释

在找到
d
之后,我得到编码的整数11393739244解码为整数87,它对应于ASCII字符“W”(不是您建议的“wha”或“wha”)

我不明白你们打算对区块大小做什么,所以我不得不猜测。下面我展示了A)一次一个字符,或B)一次使用三个字符的编码/解码。我相信你会意识到一次编码一个字符不是一个好主意。另外,在另一个论坛上的一篇重复文章中,您写道,您不关心攻击的安全性。(你在那里还写道这不是家庭作业,但在这里看起来更像是家庭作业。)

如果您在编写和使用
rsa
过程时遇到困难,那么您可能会发现各种拆分/合并/填充操作也很困难

您在一条评论中写道,当您尝试使用您在过程
rsa
中的初始尝试时,“它没有任何回报”。如果它以未计算调用的形式返回,那么您创建proc并分配它的尝试可能实际上不起作用。如果在文档中使用Maple默认的2D输入模式有问题,那么考虑将您的首选项切换到工作表中的1D Maple符号输入。这是Maple标准Java GUI的两个首选项

注意。我使用Maple的
numtheory[lambda]
命令来查找“最小整数I,这样对于所有g互质到n,g^I与1模n全等”。在最新的Maple版本中,这也可用作命令
NumberThoery:-CarmichaelLambda
。另见

重启;
#下面的“rsa”过程可用于编码或
#解码一个整数。
#
#从/到ASCII的转换在之前/之后分别完成。
rsa:=proc(key::list(posint),msg::list(posint))
局部ct、pe、pm、i;
pm:=键[1];
pe:=键[2];
##原文使用了“message”而不是“msg”,后者是
##粗心的打字错误。但是像这样的迭代列表连接
##效率低下。最好只使用'seq',如下所示。
##另外,在调用'mod'时使用惰性的`&^`而不是`^``
##因为后者计算功率效率很低
##显式(取模前)。
#ct:=[];
#对于i-to-nops(msg)do-ct:=[op(ct),`mod`(msg[i]&^pe,pm)]
#结束do;
ct:=地图(u->`mod`(u&^pe,pm),msg);
返回ct;
结束程序:
#您提供了(n,e),需要找到d才能解码。
n:=26271227347;
n:=26271227347
L:=numtheory[lambda](n);
L:=13135445468
e:=11546465;
e:=11546465
evalb(econvert(map(解析)[LengthSplit(转换(u,字符串),3)]),
字节,%);
“Wha”
newsb:=[cat(op(map(SubstituteAll,map(PadLeft,sb,3),”,“0”))];
新闻B:=[“087104097”]
newsbn:=映射(解析,newsb);
newsbn:=[87104097]
编码:=rsa([n,e],newsbn);
编码:=[15987098394]
解码:=rsa([n,d],%);
已解码:=[87104097]
映射(pad、映射(转换、解码、字符串));
["087104097"]
cat(op(map(u->convert(map(解析)[LengthSplit(转换(u,字符串),3)]),
字节,%);
“Wha”

和。。。?有问题吗?是的,它会运行,但当我尝试使用公钥和一点ASCII格式的密文进行计算时,它不会返回任何内容。一个这么小的公钥只允许3个字符的ASCII消息。是的,密文的第一位是11393739244,在纯文本中,我认为是wha或wha,如果使用2D数学(排版)输入模式,然后确保
rsa
和开头括号
当您像
rsa(…)一样调用它时,它们之间没有额外的空间
。加上一个额外的空格,它将被解析为乘法。嗨,我完全忘记了需要计算d,谢谢你,因为每次解密一个字符的消息会花费太多时间,所以我使用了下面的block1:=rsa([n,d],[要解密的第一个数字,第二个,第三个,等等])你能给我解释一下什么是ct:=map(proc(u)options操作符,箭头;
mod
&^
(u,pe),
restart;

# The procedure `rsa` below can be used to both encode or
# decode an integer.
#
# Conversion from/to ASCII is done separately, before/after.

rsa := proc(key::list(posint), msg::list(posint)) 
  local ct, pe, pm, i; 
  pm := key[1]; 
  pe := key[2];

  ## The original used `message` instead of `msg`, which was
  ## a careless typo. But iterated list concatenation like this
  ## is inefficient. Better to just use `seq`, as below.
  ## Also, use inert `&^` instead of `^` in the call to `mod`
  ## since the latter inefficiently computes the power
  ## explicitly (before taking the modulus).

  #ct := [];
  #  for i to nops(msg) do ct := [op(ct), `mod`(msg[i] &^ pe, pm)] 
  #end do;

  ct := map(u->`mod`(u &^ pe, pm), msg);

  return ct; 
end proc:

# You supplied (n,e) and you'll need to find d in order to decode.

n:=26271227347;
                          n := 26271227347

L := numtheory[lambda](n);
                          L := 13135445468

e:=11546465;
                            e := 11546465

evalb( e < L ); # a requirement
                                true

evalb( gcd(e, L) = 1); # a requirement
                                true

d := 1/e mod L;
                           d := 7567915453

# Now decode the number you supplied.

res := rsa([n,d],[11393739244]);
                             res := [87]

with(StringTools):
# So what ASCII character is that?

convert(res,bytes);

                                 "W"

s := "Wha":
sb := map(convert,convert(s,bytes),string);
                      sb := ["87", "104", "97"]

sbn := map(parse,sb);
                        sbn := [87, 104, 97]

encoded := rsa([n,e],sbn);
          encoded := [11393739244, 9911682959, 21087186892]

decoded := rsa([n,d],encoded);
                      decoded := [87, 104, 97]

pad := proc(str::string)
  local r;
  r := irem(length(str),3);
  cat(seq("0",i=1..`if`(r=0,0,3-r)), str);
end proc:

map(pad, map(convert,decoded,string));
                        ["087", "104", "097"]

cat(op(map(u->convert(map(parse,[LengthSplit(convert(u,string),3)]),
                      bytes), %)));
                                "Wha"

newsb := [cat(op(map(SubstituteAll,map(PadLeft,sb,3)," ","0")))];
                           newsb := ["087104097"]

newsbn := map(parse,newsb);
                        newsbn := [87104097]

encoded := rsa([n,e],newsbn);
                      encoded := [15987098394]

decoded := rsa([n,d],%);
                        decoded := [87104097]

map(pad, map(convert,decoded,string));
                            ["087104097"]

cat(op(map(u->convert(map(parse,[LengthSplit(convert(u,string),3)]),
                      bytes), %)));
                                "Wha"