PKCS 标准与 .NET Framework






3.85/5 (9投票s)
2005年9月16日
7分钟阅读

102238

2184
本文描述了 PKCS (Public Key Cryptographic Standards) 标准中的标准化内容及其在 .NET 1.1 Framework 中的实现。
引言
本文将向读者介绍公钥密码学标准 (PKCS)。重点将放在 PKCS (Public Key Cryptographic Standards) 标准中的标准化内容以及在 .NET 1.1 Framework 中的实现。本教程假设读者熟悉密码学的基本术语,如公钥密码学、密钥密码学和消息摘要算法。
PKCS 标准
PKCS 标准是由 RSA Security 与全球系统开发商(如 Microsoft、Apple、Sun 等)合作制定的规范,旨在加速公钥密码学的部署。其目标是促进供应商尽早采用这些标准。
这些标准在电子安全领域无处不在。任何选择在其应用程序中实现安全功能的应用程序开发人员都会在某个时候遇到这些标准。从 Web 浏览器到安全电子邮件客户端的应用程序都依赖 PKCS 标准进行互操作。PKCS 以抽象的方式定义了二进制和 ASCII 消息,并提供了完整的规范。编码消息的表示格式是一种首选格式。(配套文档包括 ASN.1 = Abstract Syntax Notation 1,BER = Basic Encoding Rules,DER = Distinguish Encoding Rule)。
标准 | 描述 |
PKCS # 1 | RSA 加密标准。该标准定义了使用 RSA 公钥系统加密和签名数据的机制。 |
PKCS # 3 | Diffie-Hellman 密钥协商标准。该标准定义了 Diffie-Hellman 密钥协商协议。 |
PKCS # 5 | 基于密码的加密标准 (PBE)。该标准描述了基于密码生成密钥的方法。 |
PKCS # 6 | 扩展证书语法标准。该标准目前正被 X509 v3 取代。 |
PKCS # 7 | 加密消息语法标准。该标准定义了应用了密码学处理的消息的通用语法。 |
PKCS # 8 | 私钥信息语法标准。该标准定义了存储私钥信息的方法。 |
PKCS # 9 | 该标准定义了用于其他 PKCS 标准的选定属性类型。 |
PKCS # 10 | 证书请求语法标准。该标准描述了证书请求的语法。 |
PKCS # 11 | 加密令牌接口标准。该标准定义了智能卡等加密设备的独立于技术的编程接口。 |
PKCS # 12 | 个人信息交换语法标准。该标准描述了用户私钥、证书等的可移植存储和传输格式。 |
PKCS # 13 | 椭圆曲线密码学 (ECC) 标准。该标准描述了使用椭圆曲线密码学加密和签名数据的机制。 |
PKCS # 14 | 该标准涵盖伪随机数生成 (PRNG)。目前正在积极开发中。 |
PKCS # 15 | 加密令牌信息格式标准。该标准描述了存储在加密令牌上的加密凭证格式的标准。 |
注意:PKCS #2 和 #4 已不再存在,因为它们已被合并到 PKCS #1 中。
标准化了什么?
PKCS 中标准化的两件事是“消息语法”和“特定算法”。这两者也可以看作是不同层次的抽象,它们彼此独立。
公钥密码学通常用于以下目的
- 数字签名: “签名者”对“消息”进行签名,以便任何人都可以“验证”消息确实是由“签名者”签名的,并且未被他人修改。这可以通过消息摘要算法和公钥算法来加密消息摘要来实现。
标准化了什么?(数字签名) 特定的消息摘要算法。 PKCS# 1 特定的公钥算法。 PKCS# 1、3、13 数字签名消息的独立于算法的语法。 PKCS# 7 私钥的语法。 PKCS# 1、8 加密私钥的语法。 PKCS# 8 从密码派生密钥的方法。 PKCS# 5 - 数字信封: “发送者”对“消息”进行加密,以便只有“接收者”才能解密。消息使用密钥加密,然后密钥使用接收者的公钥进行加密。
标准化了什么?(数字信封) 数字信封消息的独立于算法的语法。 PKCS# 7 私钥的语法。 PKCS# 1、8 加密私钥的语法。 PKCS# 8 从密码派生密钥的方法。 PKCS# 5 - 数字证书:“证书颁发机构”对包含用户姓名和用户公钥的“特殊消息”进行签名,以便“任何人”都可以验证“特殊消息”确实是由“证书颁发机构”签名的,从而信任用户的公钥。这个“特殊消息”被称为证书请求,它使用“签名算法”进行数字签名。
标准化了什么?(数字证书) 证书请求的独立于算法的语法。 PKCS# 10 公钥的语法。 PKCS# 1 特定的签名算法。 PKCS# 1 - 密钥协商:两个“通信方”在没有任何预先协议的情况下,通过交换消息来协商一个密钥。通常这包括一个两阶段的密钥协商算法。一方发起密钥协商,这会触发密钥协商的“第一阶段”,之后双方交换第一阶段的结果。然后,双方发起密钥协商的“第二阶段”,最终双方获得相同的密钥。
标准化了什么?(密钥协商) 密钥协商消息的独立于算法的语法。 PKCS# 3 特定的密钥协商算法。 PKCS# 3
关于 PKCS 标准就介绍到这里。现在,我们来谈谈在 .NET Framework 1.1 中的一些实现。
.NET Framework (1.1) 中的 PKCS 实现
此时,.NET 2.0 已正式发布,并对 PKCS 提供了更好的支持。实际上,添加了一个名为 `System.Security.Crypotgrpahy.PKCS` 的类来完成 PKCS 任务。但是,对于之前的 .NET 1.0/1.1 呢?在 2.0 之前的 .NET Framework 中,有一些方法可以实现部分或全部 PKCS 标准。
.NET 中 PKCS # 1 的示例
.NET Framework 包含以下类来实现用于密钥交换和签名验证的 PKCS # 1 标准。
RSAPKCS1KeyExchangeFormatter
和RSAPKCS1KeyExchangeDeformatter
这些只是 RSA 的薄封装,用于对会话密钥进行加密和解密。密钥交换允许发送者创建秘密信息(例如可用于对称加密算法密钥的随机数据),并使用加密将其发送给目标接收者。
RSAPKCS1SignatureFormatter
和RSAPKCS1SignatureDeformatter
与上面类似,但它们不是进行加密和解密,而是使用私钥/公钥对进行签名和验证。
DSASignatureFormatter
和DSASignatureDeformatter
与上面提到的
SignatureFormatter
类似,但适用于 DSA 而不是 RSA。
下载 PKCS#1 是一个在 .NET 1.1 中使用 RSAPKCS1SignatureFormatter
和 RSAPKCS1SignatureDeformatter
的示例。代码注释非常详细,说明了每一步的操作。
.NET 中 PKCS # 5 的示例
没有现成的类/封装来实现此功能。相反,我们需要开发自己的应用程序来完全满足 PKCS # 5 标准。因此,请下载 PKCS#5 - 本页顶部的示例,它通过连续哈希盐数据和密码数据来派生密钥字节。该实用程序接受 4 个参数:密码字符串、十六进制编码的盐字符串、哈希迭代计数以及算法的传递次数。它使用 MD5 算法进行哈希(每个算法传递生成 16 字节)。(感谢 Michel I. Gallant 博士)
.NET 中 PKCS # 7 和 PKCS # 12 的示例
请访问我的文章 X509Certificate.asp,其中介绍了如何在 .NET 1.1 中实现这些标准。
结论
在本文中,我们了解了 PKCS 标准的开发原因。我们理解了为什么某些方面需要标准化以使使用密码学的应用程序能够无缝互操作,并了解了如何使用 Microsoft .NET Framework 1.1 等强大技术来实现这些标准。