RSA变量通过乘法溢出

时间:2017-01-27 15:20:11

标签: matlab

我正在尝试为RSA算法编写代码,我的代码正确生成(e,d,n),但是当我计算密码时会出现问题。 cipher =(plain ^ e)mod n。 因为(plain ^ e)是一个非常大的数字。 计算器给出了正确的结果,而Matlab却没有。谁有想法?

clc
e=61;
d=21;
n= 187;
Neuler=160;
Plain='ABCD';
Plain=uint64(Plain);
%%Encrypting Progress
for i=1:length (Plain);
Cypher(i)=mod((Plain(i)^e),n);
end
Numeri_Cypher=uint64(Cypher);
for i=1:length (Numeri_Cypher);
RPlain(i)=mod((Numeri_Cypher(i)^d),n);
end
Result=char(RPlain)

1 个答案:

答案 0 :(得分:2)

内置函数mod无法处理大整数。所以我创建了一个模幂运算的小实现,如果你使用这个函数你应该没有问题。

function result = modpow(base,exp,m) 
   result = 1;
   while (exp > 0) 
      if bitand(exp,1) > 0
         result = mod((result * base),m);
      end
      exp = bitshift(exp,-1);
      base = mod(base^2,m);
   end
end

示例:

内置mod功能:

mod(3^233249,4)

ans = 0 %incorrect result

使用modpow功能

modpow(3,233249,4) 

ans = 1 %correct result