在幼稚的RSA实现中将字母转换为数字的好方法

本文关键字:转换 数字 方法 RSA 实现 | 更新日期: 2023-09-27 18:18:28

我正在实现一个简短的RSA程序,并有以下代码:

private string Encrypt(string data)
{
    BigInteger dataAsBigInteger = new BigInteger(Encoding.UTF8.GetBytes(data));
    BigInteger remainder = BigInteger.ModPow(dataAsBigInteger, exponentE, CalculatePublicKey());
    return Convert.ToBase64String(remainder.ToByteArray());
}
private string Decrypt(string data)
{
    BigInteger dataAsBigInteger = new BigInteger(Convert.FromBase64String(data));
    BigInteger remainder = BigInteger.ModPow(dataAsBigInteger, CalculatePrivateKey(), CalculatePublicKey());
    return Encoding.UTF8.GetString(remainder.ToByteArray());
}

不幸的是,我似乎得到奇怪的ASCII值的结果。我尝试使用数字而不是文本和Decrypt(Encrypt(number)) == number,所以我知道算法很好,所以我认为它是混乱的,因为转换到字节数组和从字节数组执行操作。

如果这不起作用,我正在考虑一个更好的将字母转换为数字的公式。我不能用A = 1, B = 2, etc.因为11和K (11th letter)有歧义。也许如果每个字母的位置(A = 1, B = 2, etc.)首先乘以10,然后你就会知道下一个字母从一个非零的值开始?

这样做是可取的还是可以挽救字节数组?

在幼稚的RSA实现中将字母转换为数字的好方法

原则上,只要得到的BigInteger不为负或大于模数,您的方案就可以工作。


如果使用加密安全的RSA实现(如OAEP),则还需要减去填充的开销。通常情况下,您应该只加密对称密钥,并使用混合加密来允许几乎任意的消息大小。

你想做的事情没有意义。RSA只能加密固定长度的消息,与公共模数n具有相同数量级的整数。(具体来说,如果明文m作为一个数字,足够小,me,则加密是平凡可逆的,如果大于 N ,则根本不能加密。)

此外,您似乎试图实现"教科书RSA",这是不安全的。您需要重新设计您的应用程序,以便,相反,它使用RSA作为密钥封装方案的一部分,它安全地提供一个对称(例如AES)密钥,用于在经过身份验证的操作模式下加密实际消息。

对你的设计的修正也将使你的编码问题变得没有意义,因为消息本身现在正在使用一种对称密码进行加密,该密码对比特流而不是数字进行操作。

如果c#没有这样的库,我会非常惊讶。