C# RSA解密公式的问题
我正在尝试解密使用RSA算法加密的消息 上面的示例取自,因此我尝试用C实现它:C# RSA解密公式的问题,c#,javascript,cryptography,rsa,C#,Javascript,Cryptography,Rsa,我正在尝试解密使用RSA算法加密的消息 上面的示例取自,因此我尝试用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()
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());
输出如下:
消息:67密码:58消息: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密钥要大得多,计算b^e根本不可行 PowerMod JavaScript函数使用从右到左的二进制方法执行模块求幂b^e%m而不损失精度,这就是它工作的原因
您可以在Wikipedia的文章中阅读更多关于它的信息。您的逻辑是正确的,但是Math.Pow不会产生精确的结果,因为5829太大,无法处理。这就是最终破坏您的算法的原因。实际上,RSA密钥要大得多,计算b^e根本不可行 PowerMod JavaScript函数使用从右到左的二进制方法执行模块求幂b^e%m而不损失精度,这就是它工作的原因
你可以在维基百科的文章中阅读更多关于它的信息。密文是58,解密密钥是29 58^29=非常非常大。大约1.378516*10^51 我认为您的直接方法超出了Math.Pow中使用的双数据类型的精度。对于模数除法,最重要的是最低有效位,而这些正是被忽略/丢失的位
在我看来,javascript算法将幂运算和mod运算折叠在一起,因此数据始终保持在基础数据类型精度的范围内。密码文本为58,解密密钥为29 58^29=非常非常大。大约1.378516*10^51 我认为您的直接方法超出了Math.Pow中使用的双数据类型的精度。对于模数除法,最重要的是最低有效位,而这些正是被忽略/丢失的位
在我看来,javascript算法将power操作和mod操作折叠在一起,因此数据始终保持在基础数据类型精度的范围内。易于实现但不安全的解决方案是biginger.ModPow易于实现但不安全的解决方案是biginger.ModPow