PKCS1与PKCS8的小知识

Python017

PKCS1与PKCS8的小知识,第1张

最近有小伙伴们搞不清楚RSA的私钥PKCS1与PKCS8到底是什么区别。在应用中会有各种各样的疑问。这边文章就稍微详细的讲一下这两种格式的区别。

PKCS1: 全名《Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications》最新版本2.2 (rfc8017, 有兴趣的同学可以读一下) ,从名称上可以看出它是针对RSA算法的一个规范。里面包含了RSA加密、解密、签名验签等所有的内容,当然也包含了私钥的格式。PKCS1的1.1版本是1991年发布的。

PKCS8: 全名《Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification》最新版本1.2,从名称上可以看出它是一个专门用来存储私钥的文件格式规范。PKCS1的1.2版本是2008年发布的。

刚好它们两个有重合的部分,都定义了私钥的存储,那他们到底有什么关系呢?我们下面实际验证一下。

此时当前目录下就有一个pkcs1.pem文件,查看文件内容可以看到

此时当前目录下会多出一个pkcs8.pem文件,查看文件内容可以看到

那么之间有什么区别呢?我们先将两个PEM格式的文件转换为DER格式,这个二进制的数据容易做对比。

现在我们得到了两个DER格式的文件,我们可以先用hexdemp看看两个文件的内容:

此时如果从后往前看的话,其实可以发现PKCS8仅比PKCS1多了一个26自己的头,剩余的内容均完全一致。

我们可以使用以下的命令进行验证:

可以看到 22:d=1 hl=4 l= 608 prim: OCTET STRING 这一行的输出就是pkcs1.der的内容。而上面的内容就是pkcs8比pkcs1多的内容。其实最主要的就是算法信息,这也是pkcs8能存储各种算法私钥的原因。

从时间顺序上可以看出来,PKCS标准也是在不断发展的,PKCS1的标准是先于PKCS8出来的,那时候甚至非对称算法还只有RSA是成熟的,在计算机领域刚刚得到应用,PKCS专门将RSA的算法作为一个标准输出就不难理解了。随着加密算法的发展才有了PKCS8出来专门做存储密钥这样一件事情。

PEM与DER有什么区别呢?其实PEM就是对DER的内容做了base64的编码并做了一下格式化的输出而已。

DER格式的存储使用了一种叫asn1的数据存储格式来存储各个数据项。我们可以看一下pkcs1.der的输出:

里面讲RSA私钥的所有数据都输出了。

本文仅对未加密的pkcs1与pkcs8私钥文件进行对比,未对比加密后的文件格式。

https://press.one/file/v?s=88e1e88832b525da091cfd1679e85312e0709cd87401ae7f11495bcd68138980105a69c480bc0e0309cb97fbee7736ff5ebd7d6d6ccb8b302bc8a1766e166b9f1&h=efa44ee9077828eda4000e7dc1050a678414617cf0bd8598f87bfd2470b1418b&a=28b6cefc3c00c7e355b435d4b5e7f58880564fa6&f=P1&v=3

1、PKCS1私钥生成

private.pem 的内容如下:

2、PKCS1私钥转换为PKCS8(该格式一般Java调用)

pkcs8.pem文件内容

3、PKCS8格式私钥转换为PKCS1(传统私钥格式)

pkcs1.pem文件内容如下: