要解密的数据超过该模数36字节的最大值

本文关键字:字节 最大值 解密 数据 | 更新日期: 2023-09-27 18:03:47

我正试图使密码安全,但我如何使用RSA有问题。下面是我的代码:

    private void testencodedecode()
    {
        string mehdi = "mehdi";
        var enc = encodePass(mehdi);
        var dec = decodePass(enc);
    }
    private RSAParameters rsaKey()
    {
        var setting = context.Settings.First(s => s.ID == 1);
        byte[] pwd = Encoding.ASCII.GetBytes(setting.PWDKEY);
        byte[] expo = {1,0,1};
        var key = new System.Security.Cryptography.RSAParameters();
        key.Exponent = expo;
        key.Modulus = pwd;
        return key;
    }
    private string encodePass(string pass)
    {
        var provider = new RSACryptoServiceProvider();
        provider.ImportParameters(rsaKey());
        var encryptedBytes = provider.Encrypt(Encoding.UTF8.GetBytes(pass), false);
        return Encoding.UTF8.GetString(encryptedBytes);
    }
    private string decodePass(string pass)
    {
       var provider = new RSACryptoServiceProvider();
       provider.ImportParameters(rsaKey());
       string decrypted = Encoding.UTF8.GetString(provider.Decrypt(Encoding.UTF8.GetBytes(pass), true));
       return decrypted;
    }

似乎加密正常,但解密时出现以下错误:

要解密的数据超过了该模数36字节的最大值。

要解密的数据超过该模数36字节的最大值

此方法存在一些主要问题。首先,正如你在另一个答案的评论中提到的,你正在使用Guid来构造RSA模,这是完全无效的。由于以下几个原因,不能使用随机数据直接构造公钥:

  1. 模量必须符合特定的结构,即它是两个素数的乘积,而您的二进制Guid通常不会。
  2. 为了解密rsa加密的数据,您必须知道用于生成模的两个素数。即使你的随机模数神奇地是两个大素数的乘积,你也无法确定它们,因为这需要对模数进行因式分解,这是一件很困难的事情(事实上,这个困难是RSA安全的整个基础)。

您应该使用RsaCryptoServiceProvider构造器生成RSA密钥,例如:

// Construct the RsaCryptoServiceProvider, and create a new 2048bit key
var csp = new RsaCryptoServiceProvider(2048);

这个新生成的密钥的参数可以被导出:

// Export the RSA parameters, including the private parameters
var parameters = csp.ExportParameters(true);

这些参数可以被安全地存储()并用于重新初始化CSP以便稍后解密。

还有其他明显的问题,例如可以用RSA加密的数据量受到密钥大小的限制,因此使用上面创建的2048位密钥,可以加密2048/8 - 11 = 245字节(其中11字节是应用pkcs# 1 v1.5填充的结果)。如果你想加密更多的数据,一般的方法是使用对称密码(例如AES)来加密数据,然后使用RSA只加密AES密钥。

最后,虽然这可能有效,但我仍然不会依赖于它的安全性,因为几乎总是有自己的加密方案的问题。

RSA的模数至少为1024比特(128字节)。少一点的话就完全不安全了。对于现代应用,甚至建议使用2048或更大的模数。

其次,您没有正确生成RSA密钥!你不应该把密码当作模数使用。

公共指数和模数的选择必须使除模数的所有素数p的指数相对于p-1素数。如果您只是任意地将模数设置为密码的二进制表示(PWDKEY),则不太可能选择适当的指数/模数对。正如我之前所说,模数必须是一个相对较大的数字,通常选择为1024、2048或4096位长。