c# - RSA解密公式的问题

标签 c# javascript cryptography rsa

我正在尝试解密使用 RSA 算法加密的消息

enter image description here

上面的例子取自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/

相关文章:

c# - 使用 .NET 库 ECDsaCng 验证 BouncyCaSTLe ECDsa 签名

c# - 在 .NET (C#) 中按键/值对的位置随机访问

c# - 将 JSON 数据发布到 ASP.NET MVC

Javascript 'Every' 函数,返回 false 无效,EJS CH 5 问题

javascript - 逗号仅适用于多个的第一个输入字段

go - 如何使用 golang.org/x/crypto/bn256 计算 e(g1^x,g1^x)?

c - 维吉尼亚密码错误输出

c# - 格式化 TimeSpan 字符串

c# - WPF 数据网格样式

javascript - SVG 平移和缩放不起作用