nil*_*ock 8 wolfram-mathematica
我从未在Mathematica中出现溢出错误,发生了以下情况.
我演示了RSA加密的原理如下:
n = 11*13
m = EulerPhi[n]
e = 7
GCD[e, m]
d = PowerMod[e, -1, m]
cipher2[m_String] := Map[Mod[#^e, n] &, ToCharacterCode[m]]
decipher2[x_Integer] := FromCharacterCode[Map[Mod[#^d, n] &, x]]
In[207]:= cipher2["StackOverflow"]
decipher2[cipher2["StackOverflow"]]
Out[207]= {8,129,59,44,68,40,79,62,49,119,4,45,37}
Out[208]= StackOverflow
Run Code Online (Sandbox Code Playgroud)
没有问题.
然后我将质数更改为更现实,但仍然非常适中.
n = 252097800611*252097800629
In[236]:= cipher2["StackOverflow"]
decipher2[cipher2["StackOverflow"]]
Out[236]= {27136050989627, 282621973446656, 80798284478113, \
93206534790699, 160578147647843, 19203908986159, 318547390056832, \
107213535210701, 250226879128704, 114868566764928, 171382426877952, \
207616015289871, 337931541778439}
During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >>
During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >>
Out[237]= FromCharacterCode[{Overflow[], Overflow[], Overflow[],
Overflow[], Overflow[], Overflow[], Overflow[], Overflow[],
Overflow[], Overflow[], Overflow[], Overflow[], Overflow[]}]
Run Code Online (Sandbox Code Playgroud)
问题:我是否已经完成了Mathematica的限制?我使用了不正确的方法吗?什么是旁路,如果有的话?
尝试PowerMod
在decyphering操作中使用:
n = 252097800611*252097800629;
m = EulerPhi[n];
e = 7;
Print[GCD[e, m]];
d = PowerMod[e, -1, m];
Print[{"n" -> n, "m" -> m, "e" -> e, "d" -> d}];
Grid[
Join[{
{"Input", "Encrypted", "Decrypt with Mod", "Decrypt with PowerMod"}},
Table[{i, (j = Mod[i^e, n]), Mod[j^d, n], PowerMod[j, d, n]}, {i, 40}]],
Frame -> All]
Run Code Online (Sandbox Code Playgroud)
是的,你已经完成了Mathematica的限制.可以在特定版本的Mathematica中的系统上表示的最大数量显示为$MaxNumber
.在你的第二个例子中,d=18158086021982021938023
因此27136050989627^d
比大于$MaxNumber
.
您可以PowerMod
在第二步中使用,就像您所做的那样d
,它将a^b mod n
比计算更有效Mod
.有了decipher2[x_List] := FromCharacterCode[Map[PowerMod[#, d, n] &, x]]
,你得到:
cipher2["StackOverflow"]
decipher2[cipher2["StackOverflow"]]
Out[1]= {27136050989627, 282621973446656, 80798284478113, \
93206534790699, 160578147647843, 19203908986159, 318547390056832, \
107213535210701, 250226879128704, 114868566764928, 171382426877952, \
207616015289871, 337931541778439}
Out[2]= "StackOverflow"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3324 次 |
最近记录: |