非对称加密(3).NET 非对称加密体系
与对称加密算法相同,所有的非对称算法的相关类也存在于System.Security.Cryptography命名空间中。在该命名空间中,.NET框架提供了RSA、DSA、ECC、Differ-Hellman共四种非对称加密算法的实现。本节介绍其中几种主要的相关类和接口。具体应用的相关内容将在下一节进行介绍。
AsymmetricAlgorithm类
AsymmetricAlgorithm抽象类是所有非对称加密算法相关类的基类。该类的主要成员如下:
1) AsymmetricAlgorithm()函数。该函数是AsymmetricAlgorithm类的构造函数。
2) static Create()函数。创建非对称加密算法的执行对象。
3) static AsymmetricAlgorithm Create(string algName)函数。创建指定名称的非对称加密算法的执行对像。
4) abstract void FromXmlString(string xmlString)函数。在派生类中重写时,从XML字符串重新构造AsymmetricAlgorithm对象。
5) int KeySizeValue字段。表示不对称算法所用密钥模块的大小(单位:位)。
6) KeySizes[] LegalKeySizesValue字段。指定不对称算法支持的密钥大小。不对称算法仅支持与该数组中的条目匹配的密钥大小。
7) abstract string KeyExchangeAlgorithm { get; }属性。当在派生类中重写时,获取密钥交换算法的名称。
8) virtual int KeySize { get; set; }属性。获取或设置不对称算法所用密钥模块的大小(单位:位)。
9) virtual KeySizes[] LegalKeySizes { get; }属性。获取不对称算法支持的密钥大小。不对称算法仅支持与该数组中的条目匹配的密钥大小。
10) abstract string SignatureAlgorithm { get; }属性。获取签名算法的名称。
RSA 类
RSA类是所有RSA算法实现类的基类,继承自AsymmetricAlgorithm类。RSA类的主要成员如下(继承自AsymmetricAlgorithm类的成员不再重复):
1) abstract byte[] DecryptValue(byte[] rgb)方法。在派生类中重写时,使用私钥解密输入数据。参数rgb是要解密的密码文本。
2) abstract RSAParameters ExportParameters(bool includePrivateParameters)方法。在派生类中重写时,导出RSAParameters实例。参数includePrivateParameters为true时表示要包括私有参数,否则为false。
3) abstract void ImportParameters(RSAParameters parameters)方法。在派生类中重写时,导入指定的RSAParameters实例。
RSACryptoServiceProvider类
RSACryptoServiceProvider类是RSA类的默认实现,继承了ICspAsymmetricAlgorithm接口。该类中非继承成员如下:
1) RSACryptoServiceProvider()构造函数。使用默认密钥初始化 RSACryptoServiceProvider 类的新实例。如果没有找到默认密钥,则创建一个新密钥。此构造函数创建一个Exchange密钥对,用于加密会话密钥以使它们可以安全存储并与其他用户交换。生成的密钥对应于在非托管 Microsoft Cryptographic API (CAPI) 中使用的以 AT_KEYEXCHANGE 值生成的密钥。
2) RSACryptoServiceProvider(int dwKeySize)构造函数。使用指定的密钥大小初始化 RSACryptoServiceProvider类的新实例。
3) RSACryptoServiceProvider(CspParameters parameters)构造函数。使用指定的参数初始化RSACryptoServiceProvider类的新实例。此构造函数创建或重用使用parameters参数的 KeyContainerName 字段指定的密钥容器。在默认情况下,此构造函数创建一个Exchange 密钥对,用于加密会话密钥以使它们可以安全存储并与其他用户交换。生成的密钥对应于在非托管Microsoft Cryptographic API (CAPI)中使用的以AT_KEYEXCHANGE值生成的密钥。 你可以创建一个Signature密钥对,用于通过将parameters参数的KeyNumber字段设置为Signature值来对消息或文件进行身份验证(数字签名)。此类型的密钥对应于 CAPI 中使用的AT_SIGNATURE值。如果使用指定的Exchange值创建一个 RSACryptoServiceProvider 对象,然后用指定的Signature值创建另一个 RSACryptoServiceProvider 对象,如果两个对象都指定相同的密钥容器名称,两个密钥将放置在一个容器中。若要创建与使用RSACryptoServiceProvider类的强名称签名兼容的密钥,必须创建一个Signature密钥对。
4) RSACryptoServiceProvider(int dwKeySize,CspParameters parameters)构造函数。使用指定的密钥大小和参数初始化RSACryptoServiceProvider类的新实例。
5) byte[] Decrypt(byte[] rgb,bool fOAEP)方法。使用RSA算法对数据进行解密。参数rgb为要解密的数据。参数fOAEP如果为true,则使用OAEP填充(仅在运行Microsoft Windows XP或更高版本的计算机上可用)执行直接的RSA解密;否则,如果为false,则使用PKCS#1 1.5版填充。
6) byte[] Encrypt(byte[] rgb,bool fOAEP)方法。使用RSA算法对数据进行加密。参数解释同上。
7) byte[] ExportCspBlob(bool includePrivateParameters)方法。导出一个表示 RSA 密钥信息的 Blob。
8) void ImportCspBlob(byte[] keyBlob)方法。导出一个表示RSA密钥信息的Blob。ImportCspBlob 方法使用兼容非托管 Microsoft Cryptographic API (CAPI) 的 Blob 初始化 RSACryptoServiceProvider对象的密钥数据。
9) SignData(Byte[], Object)方法。使用指定的哈希算法计算指定字节数组的哈希值,并对计算所得的哈希值签名。
10) SignData(Stream, Object)方法。使用指定的哈希算法计算指定输入流的哈希值,并对计算所得的哈希值签名。
11) SignData(Byte[], Int32, Int32, Object)。使用指定的哈希算法计算指定字节数组子集的哈希值,并对结果哈希值签名。
12) bool VerifyData(byte[] buffer,Object halg,byte[] signature)方法。通过将指定的签名数据与为指定数据计算的签名进行比较来验证指定的签名数据。
13) bool VerifyHash(byte[] rgbHash,string str,byte[] rgbSignature)方法。通过将指定的签名数据与为指定哈希值计算的签名进行比较来验证指定的签名数据。
14) PersistKeyInCsp属性。获取或设置一个值,该值指示密钥是否应该永久驻留在加密服务提供程序 (CSP) 中。使用此属性将密钥保存到密钥容器中。在CspParameters对象中指定密钥容器名称并用其初始化RSACryptoServiceProvider对象时,PersistKeyInCsp属性自动设置为rue。可以使用KeyContainerName字段指定容器名称。如果将PersistKeyInCsp属性设置为 true 而不使用 CspParameters 对象初始化 RSACryptoServiceProvider对象,将创建一个以“CLR”开头的随机密钥容器名称。
15) UseMachineKeyStore属性。获取或设置一个值,该值指示密钥是否应保持在计算机的密钥存储区中(而不是保持在用户配置文件存储区中)。将此属性设置为true相当于将 UseMachineKeyStore标志传递给CspParameters 对象。UseMachineKeyStore属性适用于当前应用程序域中的所有代码,而CspParameters对象只适用于显式引用该属性的类。当在一个没有加载用户配置文件的帐户下模拟或运行时,这些设置很有用。
其他类
DSA类和它的子类DSACryptoServiceProvider定义并实现了DSA算法,相关内容会在6.5节进行介绍。
RSAOAEPKeyExchangeDeformatter类用来对最优不对称加密填充(OAEP)密钥交换数据进行解密。
RSAOAEPKeyExchangeFormatter类使用RSA创建最优不对称加密填充(OAEP)密钥交换数据。
RSAPKCS1KeyExchangeDeformatter类,用来解密PKCS #1密钥交换数据。
RSAPKCS1KeyExchangeFormatter类,用来使用RSA创建PKCS#1密钥交换数据。
RSAPKCS1SignatureDeformatter类,用来验证RSAPKCS #1 1.5版签名。
RSAPKCS1SignatureFormatter类,用来创建RSAPKCS #1 1.5版签名。
-----------------------注:本文部分内容改编自《.NET 安全揭秘》