Encryption RSA过程密码学
您好,我想知道是否有人可以帮助我使用maple完成以下步骤 下面是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`
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"