如何使用RSA加密C#中的文件(大数据)

时间:2009-07-29 09:34:58

标签: c# cryptography rsa encryption-asymmetric 3des

我是加密新手。我需要实现非对称加密算法,我认为它使用私钥/公钥。我开始使用RSACryptoServiceProvider的示例。加密的小数据是可以的。但是当在相对较大的数据“2行”上使用它时,我得到异常CryptographicException“Bad Length”!

//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    //RSA.ImportParameters(RSAKeyInfo);
    byte[] keyValue = Convert.FromBase64String(publicKey);
    RSA.ImportCspBlob(keyValue);

    //Encrypt the passed byte array and specify OAEP padding.  
    //OAEP padding is only available on Microsoft Windows XP or
    //later.  
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}

然后我找到了一些使用CryptoStream加密大数据(或文件)的样本,并且只使用DES或3DES等对称算法,它们具有CreateEncryptor函数,将ICryptoTransform作为CryptoStream构造函数的输入之一返回!! !

CryptoStream cStream = new CryptoStream(fStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

使用RSA加密文件的方法是什么?

6 个答案:

答案 0 :(得分:58)

RSA只能加密短于密钥长度的数据块,因此您通常会做的是

  1. 生成AES(或类似)所需的正确长度的随机密钥。
  2. 使用AES或类似功能使用该密钥加密您的数据
  3. 使用RSA密钥加密随机密钥
  4. 然后发布2和3的输出

    解密

    1. 使用RSA密钥解密AES密钥。
    2. 使用该AES密钥解密数据

答案 1 :(得分:35)

如其他答案中所述,非对称加密仅用于加密小于其密钥大小的数据。

我需要在两个系统之间传输大量加密数据时实现的一个选项是拥有一个RSA密钥对,其公钥是发送方和接收方都知道的,然后当需要发送数据时,接收方生成一个新的RSA密钥对,用公共公钥加密该密钥对的公钥,并将加密的公钥发送给发送方。发送方使用其私钥解密接收方公钥(接收方不需要知道,就像发送方不需要知道接收方生成的私钥一样),生成对称加密密钥,使用对称密钥加密数据然后使用从接收器接收的公钥加密对称密钥。然后,加密的对称密钥和加密的数据都被发送到接收器,接收器使用其生成的私钥来解密对称密钥,然后解密数据。

您可以使用RSACryptoServiceProvider.ToXMLString()RSACryptoServiceProvider.FromXMLString()方法将公共公钥存储为接收器应用程序中的XML字符串文字。

当您生成对称加密密钥以使用RNGCryptoServiceProvider()生成密钥时,请不要忘记,因为它是生成(伪)随机数的更安全的方法。

另外,我强烈建议不要使用3DES作为对称加密算法,它已经过时并开始显示它的年龄。对AesCryptoServiceProvicerRijndaelManaged类使用AES对称加密。

答案 2 :(得分:20)

通常,RSA仅用于传输对称密钥(例如,在流的开头),然后使用该密钥加密批量数据。

非对称加密不足以传输大量数据。

答案 3 :(得分:18)

有关RSA坏长度异常的未来搜索......

您可以使用以下内容计算可使用特定密钥大小加密的最大字节数:

((KeySize - 384)/ 8)+ 37

但是,如果最佳非对称加密填充(OAEP)参数为true,则可以使用以下内容计算最大字节数:

((KeySize - 384)/ 8)+ 7

合法密钥大小为384到16384,跳过大小为8。

答案 4 :(得分:6)

RSA的.NET实现(以及所有公钥/私钥算法)不支持大块数据 - 因为这不是公钥/私钥的目的。

相反,您要做的是生成一个新的对称密钥并使用它来加密数据。然后使用公钥/私钥加密对称密钥并安全地与另一方交换密钥。然后,他们解密对称密钥并使用它来解密您的数据。

答案 5 :(得分:1)

我们有:

MaxBlockSize=((KeySize - 384) / 8) + 37

OR

MaxBlockSize=((KeySize - 384) / 8) + 7

所以,我们可以将数据划分为一些块然后加密每个块然后合并它们