生成加密和解密的密钥

创建和管理密钥是加密过程的一个重要部分。 对称算法要求创建密钥和初始化向量 (IV)。 密钥必须对不应解密数据的任何人保密。 IV 并不是一定要保密,但应定期更改。 非对称算法要求创建公钥和私钥。 公钥可以公开给任何人,但对应私钥必须只有解密方知晓。 本节介绍如何生成和管理对称和非对称算法的密钥。

对称密钥

.NET 所提供的对称加密类需要密钥和新的 IV 来加密和解密数据。 每当使用无参数的 Create() 方法创建一个托管对称加密类的新实例时,都会自动创建新的密钥和 IV。 获许解密你的数据的任何人都必须具有相同的密钥和 IV 并使用相同的算法。 通常情况下,应为每个会话创建一个新的密钥和 IV,且不应为了在稍后会话中使用而存储该密钥和 IV。

为了将对称密钥和 IV 传送给远程方,通常使用不对称加密来加密对称密钥。 通过不安全的网络发送密钥而不对其进行加密会很不安全,这是因为截获密钥和 IV 的任何人都能够解密你的数据。

以下示例说明了如何为 Aes 算法创建默认实现类的新实例:

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

上述代码的执行会生成一个新密钥和 IV,并将它们分别设置为 Key 和 IV 属性的值。

有时可能需要生成多个密钥。 在这种情况下,可以创建一个实现对称算法的类的新实例。 然后,通过调用 GenerateKeyGenerateIV 方法创建一个新密钥和 IV。 下列代码示例说明了如何在创建非对称加密类的新实例后创建新的密钥和 IV:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

上述代码的执行会创建一个新的 Aes 实例并生成一个密钥和 IV。 调用 GenerateKeyGenerateIV 方法时会创建另一个密钥和 IV。

非对称密钥

.NET 为非对称加密提供 RSA 类。 当你使用无参数 Create() 方法创建新实例时,RSA 类会创建公钥/私钥对。 可以存储非对称密钥以用于多个会话,也可以生成它以仅用于一个会话。 虽然可以使公钥可用,但必须严格保护私钥。

创建非对称算法类的新实例时,将生成一个公钥/私钥对。 创建类的新实例后,可以使用 ExportParameters 方法提取关键信息。 此方法返回一个存储关键信息的 RSAParameters 结构。 此方法还接受布尔值,该值指示是只返回公钥信息还是同时返回公钥和私钥信息。

还可以使用其他方法提取关键信息,例如:

可以使用 ImportParameters 方法将 RSA 实例初始化为 RSAParameters 结构的值。 或者,可以使用 RSA.Create(RSAParameters) 方法创建一个新实例。

切勿将非对称私钥以原义或纯文本形式存储在本地计算机上。 如果需要存储私钥,则必须使用密钥容器。 有关如何将私钥存储在密钥容器中的详细信息,请参阅如何:将非对称密钥存储在密钥容器中

以下代码示例创建 RSA 类的新实例,创建公钥/私钥对,并将公钥信息保存到 RSAParameters 结构中:

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

另请参阅