2024年4月26日发(作者:)

公钥密码标准

(Public-Key Cryptography Standards)

Hanyil整理编写 保留版权

由于公钥密码被广泛接受已成为事实,如果要将其发展成为广泛应用的技术,就必

须有支持互操作的标准。即便是所有的用户都认同公钥密码技术,使各种不同的实现版

本相兼容也是必然的。互操作性要求严格按照一个获得认可的标准格式来传输数据,这

里所描述的标准就为互操作性提供了基础。这里描述的标准被称为公钥密码标准

(Public-Key Cryptography Standards,PKCS)。这个标准涵盖了RSA密码、Diffie-Hellman

密钥交换、基于口令的加密、扩展证书语法、密码报文语法、私钥信息语法、认证请求

语法、选择性属性,密码令牌以及椭圆曲线密码等内容。

公钥密码标准PKCS是由RSA实验室与其它安全系统开发商为促进公钥密码的发

展而制订的一系列标准,是最早的公钥密码标准,也是公钥密码发展过程中最重要的标

准之一。自1991年作为一份会议结果,由早期的公钥密码使用者公布以来,PKCS文

档已经被广泛引用和实现。许多正式和非正式工业标准部分内容的制订都参照了

PKCS,如ANSI X9, PKIX, SET, S/MIME, 和SSL等。RSA实验室在标准制订过程中起

了很重要的作用:发布了认真撰写的标准描述文档;保持了标准制订过程的决策权威;

负责收集其它开发者所提出的修改和扩充意见;适时发布标准的修订版;提供了实现该

标准的参考资料和指导。

PKCS目前共发布过15个标准,每个标准都经过数次修订,部分文档还在不断的

修改和制订中。15个标准如下:

PKCS #1: RSA Cryptography Standard RSA密码标准

PKCS #2: 已合并入1。

PKCS #3: Diffie-Hellman Key Agreement Standard DH密钥交换标准

PKCS #4: 已并入1。

PKCS #5: Password-Based Cryptography Standard基于口令的密码标准

PKCS #6: Extended-Certificate Syntax Standard证书扩展语法标准

PKCS #7: Cryptographic Message Syntax Standard密文信息语法标准

PKCS #8: Private-Key Information Syntax Standard私钥信息语法标准

PKCS #9: Selected Attribute Types

PKCS #10: Certification Request Syntax Standard认证请求语法标准

PKCS #11: Cryptographic Token Interface Standard密码令牌接口标准

PKCS #12: Personal Information Exchange Syntax Standard个人信息交换语

法标准

PKCS #13: Elliptic Curve Cryptography Standard椭圆曲线密码标准

PKCS #14: Random Number Generation Standards (伪随机数生成标准)

PKCS #15: Cryptographic Token Information Format Standard密码令牌信

息格式

PKCS #

1

3

5

x

x

xx

xx

X.509, RFC 1422

X.509, RFC 1422

x

x

x

x

6789

10111215

标准

自由算法语法:

数字签名信息

数字信封加密信息

认证请求

数字证书

证书撤销列表

私钥加密信息

密码令牌

个人交换信息

密钥交换信息

特定算法语法:

其它标准

扩展证书

x

x

[ISO90a], [ISO90b]

RFCs 1319, 1321

RFC 1423, [NIST92a]

RSA公钥

x

RSA私钥

x

算法:

消息摘要:MD2, 5

私钥加密:DES

x

公钥加密:RSA

签名:MD2,4,5w/RSA

x

基于口令的加密

D-H密钥交换

x

x

PKCS与其它标准对比

PKCS#1 RSA密码标准

1.0 – 1.3版是为参加RSA数据安全公司1991年2月和3月的公开密钥密码标准会

议而发布的。1.4版是1991年6月3日首次公开发布的PKCS的一部分。1.4版作为

NIST/OSI实现工作组的SEC-SIG-91-18标准文档发布。1.5版合并了几个版本的变化,

包括参考文献的更新和增加修订历史。1.5版是作为IETF RFC 2313发布的。2.0版编入

了在文档结构方面的主要变化,而且引入了RSAES-OAEP加密方案。尽管由于这几年

来的密码发展不再允许使用MD4,但这个版本继续支持1.5版中的加密和签名操作。

2.0版是作为IETF RFC 2437发布的。2.1版引入了多素数RSA和RSASSA-PSS带附属

的签名方案。这个版本同时支持2.0版中的方案。

该文档介绍基于RSA公钥密码系统的实现方法,包括:密码原语、加密方案、带

附属的签名方案、密钥和方案的ASN.1描述。是为计算机和通信系统的一般应用和具

有灵活性的系统的一般应用而编写的。第一部分是介绍。第二部分是对文档中使用到的

符号的定义。第三部分详细说明了RSA公钥和私钥的类型。第四部分和第五部分详细

说明了几个原语,或基本数学操作。第四部分详细说明了数据转换原语,第五部分详细

说明了密码系统原语(加密—解密、签名—验证)。第六、七和八部分涉及加密和签名

方案。第六部分是概述。包括PKCS #1 V1.5中介绍的方法,第七部分定义了基于OAEP

的加密方案,第八部分定义了基于PSS的带附属的签名方案。.第九部分详细说明了在

第八部分中定义的签名方案的编码方法。

PKCS#3D-H密钥交换标准

1.0–1.2版是为参加1991年2月和3月在RSA数据安全公司的公钥密码标准会议

而发布的标准。1.3版是1991年6月3日发布的PKCS标准的一部分。1.3版同时被

NIST/OSI实现工作组作为SEC-SIG-91-19标准文档。1.4版合并了一些修改,更新了参

考文献,加入了版本更新历史。

该标准描述了实现Diffie-Hellman密钥交换的一种方式,双方不经过事先勾通,就

能够产生一个只有他们才知道的密钥(尤其是窃听者无法得知该密钥)。这个密钥可被双

方用于以后的秘密通信。该标准的主要应用是建立秘密通信的协议,如OSI模型的传

输层和网络层通信协议的建议[ISO90a][ISO90b]。

PKCS#5基于口令的密码标准

本文对基于口令的密码技术的实现提出了相关建议,涵盖了以下几个方面:密钥生

成函数、加密方案、消息鉴别方案、用ASN.1 语法对技术进行标识。这些有着一定伸

缩性的建议是针对计算机和通信系统中的普通应用软件提出的,特别针对了敏感信息的

保护,例如:对 PKCS#8 中私钥的保护。并且希望基于这些建议的应用标准标准和实

现框架可以包含附加的约束。本文不涉及其它的基于口令的密码技术,例如:基于口令

的密钥实体鉴别和密钥制定协议;并且也不涉及口令的选择。本文代替了 PKCS#5 1.5

版,但包含了相应的兼容技术。

在很多公钥密码应用软件中, 用户的安全最终依赖于一个或多个秘密文本或口令。

虽然在一个常规的密码系统中并不直接把口令用作密钥,但在用口令进行密码操作时仍

需对口令进行处理。此外, 由于口令通常从一个相对较小的空间中选取, 在对其进行处

理时要特别注意抵抗搜索攻击。

基于口令的密码术的一种通常的方法是将口令与salt相结合以生成密钥,例如:

Morris and Thompson对口令表的保护。用口令可生成一个巨大的密钥集,可以把salt

看作是对这个密钥集的一个索引, 不需要对salt进行保密。虽然一个攻击者可能会构

建一个包含所有可能口令的表(一种所谓的“字典攻击”) ,但构建一个包含所有可能

密钥的表是十分困难的,因为对每一个口令都存在非常多的可能密钥。因而,攻击者只

能对每个salt来搜索所有的口令。

基于口令的密码术的另一种方法是建立一种代价相对较高的密钥生成技术,从而增

加穷举搜索代价。这种方法的一种途径就是,在密钥生成技术中引入一个迭代次数,用

来表示对某个生成密钥的基础函数的迭代次数。一个合适的迭代次数是1000,它对于

合法者来说并不形成一种负担,但对攻击者却是一种严重的负担。

在PKCS #5 v1.5中,Salt和迭代次数构成了基于口令密码术的基础, 并且也被用

在本文中的多种密码操作中。因而,本文定义的基于口令的密钥生成技术是一个关于口

令、salt和迭代次数的函数,其中后两个量不需保密。

从一个基于口令的密钥生成函数能很容易的得到基于口令的加密和消息鉴别方案。

在PKCS #5 v1.5中, 基于口令的加密方案是建立在一种基础的、常规的加密方案的基

础上的,其中的密钥就是用口令来生成的。 类似的,基于口令的消息鉴别方案也是建

立在一种基础的、常规的消息鉴别方案的基础上的。这种分为两层的方案使得基于口令

的技术可以利用基础的技术模块化实现。

除了这里提到的加密和消息鉴别方案,人们还希望从基于口令的密钥生成函数得到

其它的应用。例如,我们可以仅用一个密钥生成函数来生成一个密钥集,而不必逐个的

生成密钥。密钥集中的密钥可以就是密钥生成函数的输出串的各个子串。这种方法可以

用在一个面向会话的协议中,作为构建密钥系统的一部分。另一种应用是口令检查,其

中:密钥生成函数的输出和salt以及迭代次数都被保存起来,以用于对口令的验证。

在本文中,认为口令是一个任意长度的字节串,并不特别要求它被解释为一个文本

串。但为了提高的互用性,仍然希望应用软件能遵循通用的文本编码规则,例如:ASCII

和 UTF-8 错误!未找到引用源。 (ASCII 是 UTF-8的一个子集)。

PKCS#6证书扩展语法标准

本标准描述了证书扩展语法。一个扩展证书由X.509公钥证书和一系列被证书发行

者签名的属性组成。于是属性和内附的X.509公钥证书能够被单独的一个公钥密码操作

验证,当需要时还能提取出普通的X.509公钥证书。包含一系列属性的目的是使认证操

作得到扩充,能够通过公钥操作验证给定实体其它信息,如电子邮件地址。PKCS #9

中给出比较详细的属性列表。

本标准最初应用在PKCS #7的密码报文中,其它的应用正在开发之中。

PKCS#7密文信息语法标准

1.0–1.3版是1991的2月和3月在RSA数据安全公司的公钥密码标准化会议上发

布的最早版本。1.4版是1991年6月3日发布的PKCS初始版本的一部分。1.4版同时

被NIST/OSI的实现工作组作为SEC-SIG-91-22标准发布。1.5版合并了几处编辑上的

改动,包括对参考文献的更新和修订历史的添加。

本标准描述了用于加密数据的一般语法,如数字签名和数字信封等。该语法允许循

环,所以,一个信封可以嵌套在另一个中,一方也可以对打入数字信封的数据作数字签

名。该标准也允许使用任意属性,如签名时间可发消息内容一同被认证,也可以提供与

签名相关的附属签名。该语法还能提供一种证书和证书撤销列表传输方式。该标准也适

用于Privacy-Enhanced Mail (PEM)中的签名数据和签名加密数据内容,构造了一个PEM

适用模式,不进行任何加密操作就可以转换为PEM消息。PEM消息也可以被转换为签

名数据和签名加密数据内容类型。该标准能够支持基于证书的密钥管理的一系列架构,

如RFC 1422中对PEM的一项建议。

PKCS#8私钥信息语法标准

1.0版是1991年2月和3月RSA Data Security,Inc.关于公开密钥加密标准会议上分

发给与会者的版本。1.1版是1991年6月3日PKCS标准最初公开发行的一部分,也作

为NIST/OSI实现工作组作为SEC-SIG-91-23标准发布。1.2版合并了几处编辑上的改

动,包括对参考文献的更新和修订历史的添加。

本标准描述一种私钥信息的语法。私钥信息包含一个对应于某个公钥算法的私钥和

一个属性集。还描述一种加密密钥的语法。基于口令的加密算法(例如在PKCS#5中描

述的某一种算法)可以用来加密私钥信息。包含属性集的目的是通过属性信息为用户提

供一个快捷的方式确立信任,如辨识名(DN)或顶级证书权威机构(CA)的公钥等信息。

尽管这样的信任可通过数字签名确立,但使用只有用户知道的密钥加密过程同样高效并

易于实现。详细的属性列表在PKCS#9中描述。

私钥信息定义为ASN.1类型 PrivatKeyInfo:

PrivateKeyInfo::=SEQUENCE {

version Version,

privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,

privateKey PrivateKey,

attributes [0] IMPLICIT Attributes OPTIONAL }

version是语法版本,是为能兼容该标准的未来版本。当前版本为0。

privateKeyAlgorithm私钥算法算法标识。

privateKey是一个字节串,内容为私钥的值。

attributes是一个属性集。这些属性是连同私钥信息一起被加密的扩展信息。

加密私钥信息定义为ASN.1类型EncryptedPrivateKeyInfo:

EncryptedPrivateKeyInfo ::= SEQUENCE {

encryptionAlgorithm EncryptionAlgorithmIdentifier,

encryptedData EncryptedData }

encryptionAlgorithm加密私钥信息的算法标识。如PKCS#5的pbeWithMD2

AndDES-CBC和pbeWithMD5AndDES-CBC。

encryptedData为私钥信息的加密结果。

PKCS#9选择性属性类型

1.0版是1991年6月3日发布的PKCS标准的一部分。1.0版同时作为NIST/OSI 开

发工作组的SEC-SIG-91-24标准发布。1.1版合并了部分修改,包括更新了参考文献,

加入了版本修订历史。在第6部分加入了

challengePassword、unstructuredAddress、

extendedCertificateAttributes

几个属性类型,第7部分加入了

challengePassword、

unstructuredAddress和extendedCertificateAttributes

几个对象标识。2.0版 也合并

了几处修改,并作了一些实质性改动。

本文档描述了两个辅助对象类:pkcsEntity和naturalPerson ,一些新的属性类型

和匹配规则。所有的ASN.1的目标类、属性、匹配规则都能够导出用在其它的环境中。

定义在本文档中的属性类主要用于与PKCS相关数据集及包括PKCS#12 PFX PDUS、

PKCS#15令牌和加密私钥的pkcsEntity类的连接。定义在本文档中的属性类用于与

PKCS#10证书请求及包括电子邮件地址、介质、非结构化名称、非结构化地址的

naturalPerson 目标类。定义在本文档中的属性类用于包括内容类型、消息摘要、签名

时间、序列号、随机场合和附属签名的PKCS#7数字签名消息。属性将用于SignerInfo

和AuthenticatedData值的authenticatedAttributes及unauthenticatedAttributes域特

别适用于PKCS#10的属性类型是盘查口令和扩展请求属性。这些属性被用在

CertificationRequestInfo值的attributes域。

以下是适用于PKCS #10、PKCS #12和PKCS #15和其它应用属性类。

businessCategory preferredDeliveryMethod

commonName presentationAddress

countryName registeredAddress

description roleOccupant

destinationIndicator serialNumber

facsimileTelephoneNumber stateOrProvinceName

iSDNAddress streetAddress

localityName supportedApplicationContext

member surname

objectClass telephoneNumber

organizationName teletexTerminalIdentifier

physicalDeliveryOfficeName telexNumber

postalAddress title

postalCode x121Address

postOfficeBox

PKCS#10认证请求语法标准

1.0版是该文档的早期版本(也作为version 1.5发布),1.7版合并了几处改动,更新

了参考文献,修改了ASN.1类型的定义。

本文档描述了认证请求的语法。一个认证请求包括一个可区分名称、一个公钥、一

个属性集,由要求认证的实体整体签名。认证请求被发送到一个认证权威(certification

authority),它其这个请求边转换为X.509公钥。包含属性集有两重目的:提供给定实体

的其它相关信息;提供X.509证书的内部信息。PKCS #9给出了一个比较详细的属性列

表。

认证权威(Certification authorities)也可以要求一个非电子形式的请求并返回非电子

形式的回执。这种形式也需要描述,但不属于本文档的范围,认证权威可以提供一些说

明。本文档的最初目的是支持PKCS #7的密码报文,但其它的应用也正在开发。

PKCS#11密码令牌接口标准

本文档为那些保存密码信息、执行密码函数的设备确定一种应用设计接口(API),

该接口称做Cryptoki,是cryptographic token interface(密码令牌接口)的缩写,它遵循

一种基于对象的简单方法,提出技术独立性(各种各样的设备)和资源共享(多个应用

程序访问多个设备)的目标,把设备的一种通用逻辑视图,即密码令牌,提供给应用程

序。

本文档通过使用ANSI C语言确定需要密码服务的应用程序数据类型和函数。这些

数据类型和函数将由Cryptoki库的供应者通过C字头文档提供。 Cryptoki的通用ANSI

C字头文件可在PKCS网页上获得。附加文档可提供一个通用的Cryptoki界面。Cryptoki

把应用需求从密码设备的中分离出来,应用程序不必转换成另一种不同的设备接口或在

不同环境下运行。本版本支持许多密码机制。新机制能在不改变通用界面的情况下添加

进来。Cryptoki 2.1版用来连接单个用户的密码设备,所以省略了某些通用目的界面中

的特点。例如,Cryptoki 2.1 版本没有区别多用户方式,重点在单个用户的密钥以及与

这些密钥相关的证书。

PKCS#12个人信息交换语法标准

本标准描述了个人身份标识信息传递语法,包括私钥、证书、各种形式的秘密数据

及其扩展。支持本标准的计算机、应用程序、浏览器、因特网服务等将允许用户导入、

导出,并使用一套统一的个人身份标识信息。

本标准支持用户信息以机密、完整的方式直接传递。大部分能够保证机密性和完整

性的安全手段,需要源平台和目标平台都拥有用于数字签名和加密的密钥对,本标准同

时支持基于口令的机密性和和完整性保护方法,可以用于不能提供可信密钥对的环境。

软硬件实现都应受本标准约束。硬件实现在防止篡改的tokens中提供物理上的安全保

障,比如智能卡和PCMCIA设备。

本标准可以看作是在构建在PKCS #8的基础之上的,包含了他的基本内容,但是

增加了补充的标识信息、私钥,并且通过非对称密钥方式的机密性和完整性保护方法提

供了更高层次的安全。

PKCS #13: Elliptic Curve Cryptography Standard椭圆曲线密码标准。

该标准还在制订中,是RSA实验室的PKCS系列中一个新标准,涵盖了基于椭圆

曲线的公钥密码技术的内容。

椭圆曲线密码体制由于需要较小的密钥规模就能达到很高的安全强度,在近年来

形成了密码学研究中很有前途的一个分支。通过对其实现的改进,包括曲线的生成,

使得椭圆曲线比在80年代刚刚提出时更加实用。椭圆曲线密码体制的安全性易于理

解,发展这项技术标准的时机已经成熟,所以在实现的同时推动其互操作性的工作也

应该开始。椭圆曲线密码标准化的工作正在展开。X9.F.1是ANSI为金融服务开发的

标准,正在发展两个标准:用于数字签名的ANSI X9.62和用于密钥交换与传输的ANSI

X9.63。IEEE P1363正在为将不同的椭圆曲线为公钥密码形成一个通用的标准。PKCS

#13将实现其它的方面,提供一个将椭圆曲线和其它PKCS应用相融合的规范。

PKCS #13将包括椭圆曲线密码体制的以下方面:参数的生成和有效性检验;密钥

生成和有效性检验;数字签名;公钥加密;密钥交换;参数、密钥和加密方案的ASN.1

语法;安全性分析。

该标准将遵循与其它PKCS文档同样的格式,与X9.62、X9.63和P1363的现有文

档保持兼容,但又有如下一些特点:

参数和密钥:与X9.62和P1363中的定义相同,对有限域的类型作一些限定。

数字签名方案:采用ECDSA算法,和X9.62相同,可能会和P1363一样支持任意

的散列函数。

加密方案: 待定。X9.63也正在制订。P1363中没有描述椭圆曲线加密方案。存

在一个重要的技术问题是,如何加密那些经过填充后长度大于椭圆曲线的“分组长度”

的明文。

密钥交换方案:待定。P1363描述了一个椭圆曲线密钥交换方案,X9.63也正在作

同样的工作。

PKCS#15密码令牌信息格式

版本1.0发布于1999年4月。版本1.1与版本1.0之间的区别如下:加入了对其他

认证方式的支持(例如生物认证,外部认证,cha);加入了对更详细的访问控制信息的

支持;加入了对软令牌的支持(“虚拟智能卡”);加入了对卡可验证的证书的支持。

密码令牌,如集成电路卡(或IC卡),本身就是安全的计算平台,非常适合于为应

用提供增强的安全性和私密性的功能。它们可以处理认证信息,如数字证书和权力,授

权和加密密钥等。此外,它们能够为敏感信息提供安全的存储和计算工具,这些敏感信

息可能有:私钥和密钥片断;计数和保存的值;口令和共享的秘密;授权和许可。

同时,许多令牌也提供孤立的处理工具,在存在来自敌对方代码(病毒,木马等等)

的潜在危险的主机环境里无需暴露而能够使用这些信息。这对诸如下列的某些操作已经

变得十分重要:对个人身份识别,使用私钥产生数字证书;基于共享的秘密的网络认证;

变量的电子符号的维护;离线情况下的便携式许可证的使用。不幸的是,用于认证和授

权的这些令牌由于缺乏在不同级别上的互操作性而使其应用受阻。首先,在令牌上的数

字凭证(密钥,证书等)的存放格式缺乏工业标准。这已经使得创建能够使用来自不同

的技术产生的凭证工作的应用变得很困难。试图在应用领域解决这个问题必定会增加开

发和维护的成本。由于凭证与在特定的硬件结构下使用特定的应用编程接口的特定的应

用绑定在一起,也给最终用户带来了很大的问题,

其次,允许多种应用有效的共享数字凭证的机制还不成熟。虽然这个问题不只存在

于密码卡——例如,在WWW浏览器中的证书的使用中早已出现了,许多卡片空间有

限制,而用户又期望通用性,这将会迫使凭证在凭证的各提供者间共享。 如果不能在

凭证共享上达成标准,应用开发者和用户对其接受和使用就会受到限制。

要使行业和最终用户都获得最大的利益,以支持各种操作环境、应用编程接口和广

泛的应用基础的方法开发对方案是十分重要的。只要通过这种方法,才能满足用户的需

要,并促进凭证有效的应用的开发,这也是满足各种这样的市场需求的廉价的解决方案。

因此,本文旨在:使在运行于各种平台的各部分间具有互操作性(平台无关);使

应用可使用不同制造商的产品(厂商无关);使无需重写应用级的软件即可更新技术(应

用无关);在维护现有的相关的标准的一致性的同时,进行必要的和实际的扩展。

举个例子来说,一个包含数字证书的IC卡的持有者,应该能够在运行在任意主机

上的任意应用上提交卡片,并可在向应用提交了所包含的证书后,顺利的使用卡片。

作为要达到这些目标的第一步,本文对在密码令牌上存放与安全有关的信息定义了

一个文件和目录的格式。具有如下特性:动态结构,以便于在各种介质(包括储值卡)

上实现;运行多个应用驻留在卡上(甚至是多个EID应用);支持存储各种类型的对

象(密钥,证书和数据等);令牌支持时,支持多个PIN。