【问题标题】:Bad Length Error in Rsa encryption decryptionRsa 加密解密中的错误长度错误
【发布时间】:2020-11-03 01:15:47
【问题描述】:

请帮我找出以下 RSA 加密代码中的问题

public static void Test()
{
    CspParameters cspParams = new CspParameters { ProviderType = 1 };
    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);

    var PublicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));  //I have to save it as string in some json/app.config configuration file
    var PrivateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));  //I have to save it as string in some json/app.config configuration file
    
    var encrypt = EncryptText(PublicKey,  Encoding.UTF8.GetBytes(FromSomeFile()));
    
    var decrypt = DecryptData(PrivateKey, encrypt);
}

static byte[] EncryptText(string publicKey, byte[] dataToEncrypt)
{   
    byte[] encryptedData;
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {                
        rsa.ImportCspBlob(Convert.FromBase64String(publicKey));             
        encryptedData = rsa.Encrypt(dataToEncrypt, false);
    }
    return encryptedData;
}

// Method to decrypt the data withing a specific file using a RSA algorithm private key   
static string DecryptData(string privateKey, byte[] dataToDecrypt)
{
    
    // Create an array to store the decrypted data in it   
    byte[] decryptedData;
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        rsa.ImportCspBlob(Convert.FromBase64String(privateKey));              
        decryptedData = rsa.Decrypt(dataToDecrypt, false);
    }           
    
    return Encoding.UTF8.GetString(decryptedData, 0, decryptedData.Length); ;
}

【问题讨论】:

  • EncryptText() 如何接受"Kamran" 作为其dataToEncrypt 参数,其类型为byte[]? - 请出示您的实际代码。
  • 这能解决问题吗?因为它在我的机器上运行。如果没有,请发布确切的错误消息/堆栈跟踪和 .NET 版本。
  • 这在 RSA 中是不可能的,请参阅 How to encrypt large file with RSA?
  • 我不需要尝试任何东西。这不可能!使用 1024 位 RSA 密钥,最多可以加密 128 个字节(取决于填充甚至更少,例如,对于 PKCS#1 v1.5,在您的情况下只有 117 个字节),请参阅here
  • 请记住,对于较大的 RSA 密钥,性能会降低。您可以测试 8192 位密钥(1024 字节,Pkcs#1 v1.5 的最大有效负载:1013 字节)。通常,像 AES 这样的对称加密适用于较大的数据量。如有必要,可以使用 RSA 安全地交换对称密钥(混合加密)。这在首先发布的链接中有所描述。

标签: c# .net rsa


【解决方案1】:

RSA 只能用于加密长度小于模数的消息。小多少取决于填充,例如在 PKCS#1 v1.5, s 的情况下为 11 个字节。 here。在 OAEP 的情况下,填充要求的字节数取决于使用的摘要,s。 here。详细信息在 RFC8017、RSAES-PKCS1-v1_5RSAES-OAEP 中进行了描述。
为了完整性:没有填充的 RSA(教科书 RSA)允许将消息加密到模数的长度。然而,在实践中,出于安全原因,必须始终使用填充,因此教科书 RSA 并不是一个真正的选择。

发布的代码使用 1024 位的 RSA 密钥和 PKCS#1 v1.5 填充。因此,要加密的消息的最大大小为 117 个字节。较大的消息会引发 CryptographicException (Bad Length)。这就是您的问题的原因。

一个 8192 位(1024 字节)的密钥理论上允许使用 PKCS#1 v1.5 填充加密最长 1013 字节的消息。但是,随着密钥大小 s 的增加,性能会急剧下降。 here.

Symmetric encryptionasymmetric encryption 性能更高。因此,在实践中,较大的数据量使用对称加密进行加密,例如AES。然而,对称加密存在通信伙伴必须交换对称密钥的问题。非对称加密,例如RSA 通常用于此目的 (hybrid encryption),因为加密只需要公钥(因此可以通过不安全的通道进行交换)。但是,为了防止欺骗性地替换公钥 (man in the middel attack),通常需要一个复杂的 public key infrastructure

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2018-10-27
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多