C# RSA解密公式的问题

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()

我正在尝试解密使用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() 
                   + " 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