繁体   English   中英

RSA解密公式的问题

[英]problems with RSA decryption formula

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

输出如下:

讯息: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()不会产生精确的结果,因为58 29太大而无法处理。 这最终会破坏您的算法。 实际上,RSA密钥比这大得多,并且计算b ^ e根本不可行。

PowerMod() JavaScript函数使用从右到左的二进制方法执行模幂运算( b ^ e % m ),而不会损失精度,这就是它起作用的原因。

您可以在Wikipedia文章上了解有关模块化指数的更多信息。

密文为58,您的解密密钥为29。

58 ^ 29 =真的非常巨大。 约1.378516 * 10 ^ 51

我认为您的直接方法超出了Math.Pow中使用的double数据类型的精度。 对于模数除法,最不重要的位才是最重要的,而这些正是被忽略/丢失的位。

在我看来,javascript算法正在使power操作和mod操作崩溃,因此数据始终保持在基础数据类型的精度范围之内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM