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

//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加密文件的方法是什么?

有帮助吗?

解决方案

正如在其他的答案非对称加密仅设计用于加密比其关键尺寸更小的数据提及。

需要在两个系统之间传输大量加密的数据时,我已实施的一种选择是有一个RSA密钥对其公钥当数据需要是已知的发送者和接收者然后既要发送的接收器产生一个新的RSA密钥,加密与普通公钥密钥对的公共密钥,并将加密的公钥给发件人。发送者进行解密使用其私钥(其中接收器不需要知道,就像发送者不需要知道接收器产生的私有密钥)的接收器的公共密钥,产生一个对称加密密钥,所述数据与所述对称密钥加密然后加密使用从接收器接收的公共密钥的对称密钥。两个加密的对称密钥,然后将加密的数据被发送到其使用其产生的私有密钥来解密对称密钥的接收器,然后进行解密的数据。

可以使用RSACryptoServiceProvider.ToXMLString()RSACryptoServiceProvider.FromXMLString()方法来存储共用的公共密钥作为XML字符串的接收机应用字面。

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

另外,我强烈建议不要使用3DES作为您的对称加密算法,它是旧的,开始显示其年龄。使用AES对称加密与任一AesCryptoServiceProvicerRijndaelManaged类。

其他提示

RSA 只能加密比密钥长度短的数据块,所以你通常做的是

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

然后发布 2 和 3 的输出

解密

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

通常,RSA是只用于传送的对称密钥(在流例如开始时),然后将批量数据与该密钥加密。

非对称加密是不足够的效率来传输大量的数据。

有关RSA坏长度例外未来的搜索...

可以计算其可与下面的一个特定的键尺寸被加密的字节的最大数量:

((密钥大小 - 384)/ 8)+ 37

然而,如果最佳非对称加密填充(OAEP)参数为真时,可以被用来计算最大字节以下内容:

((密钥大小 - 384)/ 8)+ 7

在法律密钥大小是384通16384为8的跳跃大小。

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

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

,我们有:

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

OR

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

因此,我们可以划分数据的一些块,然后进行加密每一个,然后将它们合并

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top