如何使用RSA在C#中encryption文件(大数据)

我不熟悉encryption。 我需要实现非对称encryptionalgorithm,我认为它使用私钥/公钥。 我开始使用RSACryptoServiceProvider的示例。 可以用小数据来encryption。 但是当在相对较大的数据“2行”上使用它时,我得到了exceptionCryptographicException“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对大数据(或文件)进行encryption的例子,并且只使用DES或3DES等对称algorithm,它们的函数CreateEncryptor返回ICryptoTransform作为CryptoStream构造函数的input之一。

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

什么是使用RSAencryption文件的方式?

正如其他答案中所提到的,非对称encryption仅用于encryption小于密钥大小的数据。

当我需要在两个系统之间传输大量的encryption数据时,我已经实现了一个选项,那就是拥有一个RSA密钥对,其公钥对于发送方和接收方都是已知的,那么当需要发送数据时,接收方会生成一个新的RSA密钥对使用公共公钥对该密钥对的公钥进行encryption,并将encryption的公钥发送给发送者。 发送方使用它的私钥对接收方公钥进行解密(接收方不需要知道,就像发送方不需要知道接收方产生私钥),生成一个对称encryption密钥,用对称密钥encryption数据然后使用从接收机接收到的公钥对对称密钥进行encryption。 然后将encryption的对称密钥和encryption的数据发送给接收方,接收方使用其生成的私钥对对称密钥进行解密,然后对数据进行解密。

您可以使用RSACryptoServiceProvider.ToXMLString()RSACryptoServiceProvider.FromXMLString()方法将公共公钥作为XMLstring文本存储在接收方应用程序中。

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

此外,我强烈build议不要使用3DES作为对称encryptionalgorithm,它是旧的,并开始显示它的年龄。 使用AES对称encryption与AesCryptoServiceProvicerRijndaelManaged类。

RSA只能encryption短于密钥长度的数据块,所以你通常是这样做的

  1. 生成AES(或类似)所需的正确长度的随机密钥。
  2. 使用AES或类似的密钥encryption您的数据
  3. 使用RSA密钥encryption随机密钥

然后你发布2和3的输出

解密

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

通常,RSA仅用于传输对称密钥(例如,在stream的开始处),然后使用该密钥对批量数据进行encryption。

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

对于将来有关RSA不良长度例外的search…

您可以使用以下命令计算可以使用特定密钥大小encryption的最大字节数:

((KeySize-384)/ 8)+37

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

((KeySize-384)/ 8)+7

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

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

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

我们有:

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

要么

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

所以,我们可以将数据分成一些块,然后对每个块进行encryption然后合并它们