我试图在Octave中实现一个简单的RSA计算示例,但是当使用大于9900(素数)的p和q时,我遇到了问题。 我怀疑它是因为Octave中的数字大小限制?
我可以尝试另一种方法吗?感谢
我使用此算法生成密钥:
function [n,Phi,d,e] = rsa (p,q)
x=2;i=1;
n=p*q; %to calculate n
Phi=(p-1)*(q-1); %to calculate Phi
e=(Phi/4);
while x > 1
e--; %to calculate e (I know it should be random)
x = gcd(Phi, e);
end
val1=0;
d=Phi-e;
while(val1!=1);
d--; %to calculate d (this is really nasty way, anyone can help?)
val1=mod(d*e,Phi);
end
endfunction
然后我读取消息,将其编码为ASCII并通过
加密function result = modexp (base, exponent, modulus)
result = 1;
base = mod(base, modulus);
while (exponent > 0)
if (mod(exponent, 2) == 1)
result = mod((result * base) ,modulus);
end
exponent = bitshift(exponent,-1);
base = mod((base * base) ,modulus);
end
endfunction
致电
Msg = toascii(Msg,x); %my function to convert message to ASCII
for j= 1:x
cipher(j)= modexp(Msg(j),e,n); %message encryption
end
display(cipher);
for j= 1:x
message(j)= modexp(cipher(j),d,n); %message decryption
end
display(message)
正如我所说,这个代码在p和q大于9900时失败。
非常感谢任何帮助,谢谢。
PS:整个代码可以在这里找到: https://dl.dropboxusercontent.com/u/20809963/rsa.m 但它是用捷克语写的。
答案 0 :(得分:1)
好的,我重写了生成代码,现在它可以使用更大的数字(p和q,最高可达~45000)
function [n,Phi,d,e] = rsa (p,q)
x=2;i=1;
n=0;Phi=0;e=0;d=0;
n=uint64(n); Phi=uint64(Phi); d=uint64(d); e=uint64(e);
n=p*q;
Phi=(p-1)*(q-1);
e = input('e:');
if(gcd(Phi,e) > 1)
while gcd(Phi, e) > 1
if(e<=2)
e = Phi/4;
else
e--;
end
end
printf('e = %i', e);
end
if gcd(e,Phi) ~= 1
error('d can't be calculated')
end
[c,a,b] = gcd(e,Phi);
d = mod(a,Phi);
endfunction
其余代码类似,我只是将所有内容都转换为uint64:)
我的代码放在这里,如果有人想试试https://dl.dropboxusercontent.com/u/20809963/rsa.m