当前位置: 首页 > 知识库问答 >
问题:

Rsa加密解密中存在错误的长度错误

莘钧
2023-03-14

请帮助我识别以下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); ;
}

共有1个答案

商池暝
2023-03-14

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

发布的代码使用1024位的RSA密钥和PKCS#1 v1。5.填充物。因此,要加密的消息的最大大小为117字节。较大的消息抛出加密异常(错误长度)。这就是你的问题所在。

8192位(1024字节)的密钥理论上允许使用PKCS#1v1对长度高达1013字节的消息进行加密。5.填充物。但是,随着密钥大小的增加,性能会急剧下降。

对称加密比非对称加密性能更好。因此,在实践中,使用对称加密(例如AES)对较大的数据卷进行加密。然而,对称加密存在通信伙伴必须交换对称密钥的问题。非对称加密(例如RSA)通常用于此目的(混合加密),因为加密只需要公钥(因此可以在不安全的通道上交换公钥)。然而,为了防止公钥的欺骗性替换(中间人攻击),通常需要一个复杂的公钥基础设施。

 类似资料:
  • 我尝试获得一对密钥(公共和私有)来加密/解密文本。对于加密没有问题。对于解密来说,我从一天开始就犯了一个错误,我不明白为什么。 这是代码的相关部分:

  • 问题内容: 我正在使用3DESC解密数据,但出现以下异常 我的代码: 打印上面使用的所有字节数组 问题答案: DES- EDE密码可与3个不同的子密钥一起使用,因此密钥大小应为24字节(3乘8字节)。如果您只想使用2个键(即在此模式下,第一个键==最后一个键),则只需复制键数组的前8个字节。

  • 在一个做其他事情的大型应用程序中——我需要加密和解密一个文件。所以我一直在四处寻找,并实现了这两个核心功能,基本上使用RSA密钥包装一个随机的AES密钥来加密一个文件。对称键和iv被写入文件的开头。 我在下面的解密函数部分得到一个异常(“javax.crypto.BadPaddingException:Decryption error”)。在肯安迪夫线路上——doFinal。具体来说,这一行是异常

  • 我收到一个错误解密在C#中加密的消息(使用相应的公钥/私钥) 我的客户端是用C编写的,服务器是用Go编写的。我通过go的crypto/rsa包生成了一个私钥和公钥(使用rsa.GenerateKey(随机读取器,bits int))。然后,我将生成的公钥文件存储在客户端可以访问的地方,将私钥存储在服务器可以访问的地方。我使用以下代码(使用bouncy castle)在客户端上加密: go服务器从标

  • 我的应用程序在打开时会生成一个。我可以使用加密文本,但当我尝试使用解密时,它会抛出。 某些调试: 生成: 函数: 函数:

  • 我有一个没有Java加密库的RSA代码类。很管用。 但是,当我从RSAPrivateKeySpec创建一个Java库PrivateKey,从类中的RSAPrivateKey创建一个模数和指数,并使用Java加密库a使用类encrypted BigInteger进行加密时,它会抛出。这里: 为什么? 对不起,我的英语不好