我正在尝试解密使用 RSA 算法加密的消息
上面的例子取自Website ,所以我尝试用 C# 实现它:
int msg = 67;
int Ee = 5;
int Nn = 91;
int Dd = 29;
var cipher = Math.Pow(msg, Ee) % Nn;
var msg2 = Math.Pow(cipher, Dd) % Nn;
MessageBox.Show("Msg: " + msg.ToString() + " cipher: " + cipher.ToString()
+ " msg: " + msg2.ToString());
输出如下:
Msg: 67 cipher: 58 msg: 45
如您所见 - 加密工作正常,但解密却不行!
所以我去检查该网站,结果发现 Javaspript 使用了另一个公式:
function mod( m, n )
{
return m - n*Math.floor(m/n)
}
function PowerMod(x,p,N)
// Compute x^p mod N
{
var A = 1
var m = p
var t = x
while( m > 0 )
{
k = Math.floor( m/2 )
r = m - 2*k
if( r == 1 )
A = mod( A*t, N )
t = mod( t*t, N )
m = k
}
return A
}
var temp = ""
var e = form.e.value
var d = form.d.value
var N = form.N.value
var M = form.Msg.value
form.Cipher.value = PowerMod(M,e,N)
var C = form.Cipher.value
form.Decipher.value = PowerMod(C,d,N)
而不是复制和粘贴现成的公式 - 我想知道为什么我的方法不起作用,我宁愿修复我的公式而不是重写 JS。关于如何修复解密有什么想法吗?
最佳答案
您的逻辑是正确的,但 Math.Pow()
不会产生精确的结果,因为 5829 太大而无法处理。这就是最终破坏你的算法的原因。实际上,RSA key 远大于此,计算 b ^ e
根本不可行。
PowerMod()
JavaScript 函数使用从右到左的二进制方法执行模幂运算 (b ^ e % m
),而不会损失精度,这就是为什么它有效。
您可以在维基百科文章 modular exponentiation 上阅读更多相关信息。 .
关于c# - RSA解密公式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525309/