生成加密和解密的密钥

更新:2007 年 11 月

创建和管理密钥是加密过程的一个重要部分。对称算法要求创建必须对不应解密数据的任何人保密的密钥和初始化向量 (IV)。不对称算法要求创建一个公钥和一个私钥。公钥可以对任何人公开,而私钥必须只为将要对用公钥加密的数据进行解密的一方知道。本节描述如何为对称算法和不对称算法生成和管理密钥。

对称密钥

.NET Framework 提供的对称加密类需要一个密钥和一个新的初始化向量 (IV) 来加密和解密数据。每当使用默认构造函数创建某个托管对称加密类的新实例时,都将自动创建新的密钥和 IV。无论您允许谁解密您的数据,他或她都必须拥有同样的密钥和 IV 并使用相同的算法。通常,应该为每个会话创建新的密钥和 IV,并且无论是密钥还是 IV 都不应存储以用于稍后的会话中。

为了将对称密钥和 IV 传送给远程方,通常使用不对称加密来加密对称密钥和 IV。通过不安全的网络发送这些值而不对这些值进行加密会极不安全,这是因为截获这些值的任何人都能够解密您的数据。有关加密和传输密钥与 IV 的过程的更多信息,请参见创建加密方案

下面的示例演示如何创建实现 TripleDES 算法的 TripleDESCryptoServiceProvider 类的新实例。

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();

在执行上面的代码时,将生成新的密钥和 IV 并将其分别放置在 KeyIV 属性中。

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

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();

当执行上面的代码时,创建 TripleDESCryptoServiceProvider 的新实例后将生成密钥和 IV。调用 GenerateKeyGenerateIV 方法时将创建另一个密钥和 IV。

不对称密钥

.NET Framework 提供了 RSACryptoServiceProviderDSACryptoServiceProvider 类用于非对称加密。这些类在您使用默认构造函数创建新实例时创建一个公钥/私钥对。既可以存储不对称密钥以用在多个会话中,也可以只为一个会话生成不对称密钥。公钥可以被广泛地使用,私钥应被严密地保护起来。

每当创建不对称算法类的新实例时,都生成一个公钥/私钥对。创建该类的新实例后,可以用以下两种方法之一提取密钥信息:

两个方法都接受布尔值,该值指示是只返回公钥信息还是同时返回公钥和私钥信息。通过使用 ImportParameters 方法,可以将 RSACryptoServiceProvider 类初始化为 RSAParameters 结构的值。

千万不要将不对称私钥逐字存储(或者说以明文形式存储)在本地计算机上。如果需要存储私钥,则应使用密钥容器。有关如何在密钥容器中存储私钥的更多信息,请参见如何:将非对称密钥存储在密钥容器中

下面的代码示例创建 RSACryptoServiceProvider 类的一个新实例,创建一个公钥/私钥对,并将公钥信息保存在 RSAParameters 结构中。

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

请参见

任务

如何:将非对称密钥存储在密钥容器中

概念

加密数据

解密数据

其他资源

加密任务

加密服务