PKCS 标准
(1)PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义了PSA公/私钥的语法。
(2)PKCS#2:涉及了RSA的消息摘要加密,这已被并入PKCS#1中。
(3)PKCS#3:Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie-
Hellman密钥协议的方法。
(4)PKCS#4:最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。
(5)PKCS#5:基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述)。
(6)PKCS#6:扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法(当PKCS#6第一次发布时,X.509还不支持扩展。这些扩展因此被包括在X.509中)。
(7)PKCS#7:密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。PKCS#7提供了许多格式选项,包括未加密或签名的格式化消息、已封装(加密)消息、已签名消息和既经过签名又经过加密的消息。
(8)PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。
(9)PKCS#9:可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter
signature)、质询口令字和扩展证书属性。
(10)PKCS#10:证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。
(11)PKCS#11:密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。
(12)PKCS#12:个人信息交换语法标准。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。
(13)PDCS#13:椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。
(14)PKCS#14:伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。
(15)PKCS#15:密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。
PKCS#1公钥格式
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, – n
publicExponent INTEGER – e
}
X509
X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI)
制定的 ITU-T X509
国际标准。X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。1988年首次发布,1993年和1996年两次修订。当前使用的版本是X.509
V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509
V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案.
PKCS#7 常用的后缀是: .P7B .P7C .SPC
PKCS#12 常用的后缀有: .P12 .PFX
X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT
X.509 PAM 编码(Base64)的后缀是: .PEM .CER .CRT
.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
X509证书
公钥证书格式:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER, – the OID of the enc algorithm
parameters ANY DEFINED BY algorithm OPTIONAL (NULL for pkcs#1)}
OID格式-{iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1)
rsaEncryption(1)}
Pkcs#1 的oid为 1.2.840.113549.1.1.1
PEM介绍
我们使用 PEM 文件格式存储证书和密钥。PEM 实质上是 Base64
编码的二进制内容,再加上开始和结束行。如证书文件的
-—-BEGIN CERTIFICATE—–
和
-—-END CERTIFICATE—–
在这些标记外面可以有额外的信息,如编码内容的文字表示。文件是 ASCII
的,可以用任何文本编辑程序打开它们。
观察这个 示例 PEM 文件。
-—-BEGIN
CERTIFICATE—–MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsFAAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlGPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-—-END CERTIFICATE—–
ASN.1介绍
ASN.1是ITU-T的一个标准集,它用来编码及表示通用数据类型,这些数据类型有可打印串值,八位位组串值,位串值,整数值以及用可移值方式组合而成
的其他类型序列值.简单的说,ASN.1指定了以何种方式对非平凡的数据类型进行编码,以便其他任何平台及第三方工具都能够解释其内容.比如,字母a在一
些平台以ASCII编码为十进制数值97,而在其他非ASCII平台上,可能会是另外的编码.而ASN.1指定了一种编码方式,在任何平台上,字母a的编
码都是统一的。
ASN.1的编码规则
BER
-
DER
为确保编码的唯一性,出现了CER和DER两种编码方案,它们均为BER子集。其中DER只使用定长编码,CER基于不定长编码。
-
PER
在PER中,tag从不传送,length和value如果双方都知道,也不需传送。因此,其编码更精简,效率更高。
XER
即XML Encoding Rules,主要应用于网站开发,本文不作介绍。
BER 编码介绍
BER的组成:
无论什么类型它的BER编码都是有四部分组成:
类型字段tag 长度字段length 值字段value
结束表示字段(可选,在长度不可知情况下需要)
即T L V,
TLV是(TAG-LENGTH-VALUE)的缩写,其具体的规范在ISO7616-4中有明确的定义。
目前简单描述下关于TLV的编码规则,下文所有的数据表示均为16进制编码。
TAG域:
TAG域的第一个字节编码
TAG域的第二个字节编码
其中注意第一个字节的第六位,其分为基本数据对象和结构数据对象。简单解释下基本数据对象和结构数据对象,简单举两个例子,下面几个都是符合tlv编码的数据流:
70069F3803010203
9F3803010203
可以看到,70 TAG的值(value)域也是由TLV结构组成的。
而9F38 TAG的值域则是由简单数据构成(010203)不需要符合TLV结构编码。
基于这个原则,TLV可以设计成多层嵌套的关系。
例如:
6F30840E325041592E5359532E4444463031A51EBF0C1B61194F08A000000333010101500A50424F43204445424954870101
作为练习题,如何解析上面的BER编码的字符串
常用的TAG
TAG值(16进制) | 类型 |
---|---|
01 | 布尔型(BOOLEAN) |
02 | 整型(INTEGER) |
03 | 位串(BIT-STRING) |
04 | 8位位组(OCTETSTRING) |
05 | 空(NULL) |
06 | 对象标识符(OBJECT IDENTIFER) |
30 | 序列(SEQUENCE) |
31 | 集合 SET |
长度(LEN)域
注意在长度值不定时,长度域用0x80表示。
结束标识字段(不在TLV之中):
两个字节,只有在长度值不定时才会出现。表示为0x000x00
DER编码的16进制公钥串分析
密钥专题给的公钥文件内容:
3082010A0282010100C1A25FE630CDC3DB84C4739EB3EBC9C4A1B7BEFD3BC93AAFED5435FB7C5EBF12013161EF11F2EE6BC1718FC114849B83BB454B71BFAF583BFD94E0F122F7BF2CC00167C1CE1D1720A1AB5200DBD5E4C98DC0BF7738BBB8E63F0BB536671FBE273850EDBCC98A7BF3574462F54D940B790519B6865E6C419F0BEB3AA2CDE010C83A49EE99AF6C5AB5776C27BA5A7E0053886DBD30C8E714FBA3C0D661099BCC2255006BC53E3BB74242252AD857FB5D4EC06A38ABAFF8A48D56DE554E43AEAE14186879069E4B913212EC93027FD66742AED6A393CBAAB4903888F77B51BF06FDF66A1AFD0EB101F8A8BD9918373BD299030E415325770ED428FEC47FBF8FF8250203010001
对公钥进行分析:
30——( tag30,在DER编码中代表序列)
82010A–(长度,82代表长度大于128位,实际长度为010A,即266.
从这儿往后正好266个字节)
02——(tag02, 在DER编码中代表整数)
820101—(长度,同上,为257个字节,往后数257个字节,值即为这个整数的值)
00C1A25FE630CDC3DB84C4739EB3EBC9C4A1B7BEFD3BC93AAFED5435FB7C5EBF12013161EF11F2EE6BC1718FC114849B83BB454B71BFAF583BFD94E0F122F7BF2CC00167C1CE1D1720A1AB5200DBD5E4C98DC0BF7738BBB8E63F0BB536671FBE273850EDBCC98A7BF3574462F54D940B790519B6865E6C419F0BEB3AA2CDE010C83A49EE99AF6C5AB5776C27BA5A7E0053886DBD30C8E714FBA3C0D661099BCC2255006BC53E3BB74242252AD857FB5D4EC06A38ABAFF8A48D56DE554E43AEAE14186879069E4B913212EC93027FD66742AED6A393CBAAB4903888F77B51BF06FDF66A1AFD0EB101F8A8BD9918373BD299030E415325770ED428FEC47FBF8FF825—(整数的值)
02—(tag02, 在DER编码中代表整数)
03—(长度,小于128,用一个字节表示长度,即长度为3个字节,往后数3个字节为此证书的值)
010001—(整数的值)