RSA 格式 - 转载
转载自
https://www.shangyang.me/2017/05/24/encrypt-rsa-keyformat/#%E5%89%8D%E8%A8%80
PEM 和 DER
首先我们来看看什么是 PEM 和 DER
什么是 DER 格式
DER 是密钥的二进制表述格式;
http://fileformats.archiveteam.org/wiki/DER
Distinguished Encoding Rules (DER)is a binary serialization of ASN.1 format. It is often used for cryptographic data such as certificates, but has other uses.
很明显,DER 就是 ASN.1 的二进制格式;
什么是 PEM 格式
PEM 格式既是对 DER 编码转码为 Base64 字符格式;通过解码,将会还原为 DER 格式;
http://fileformats.archiveteam.org/wiki/PEM
A PEM file is plain text. It contain one or more objects, such as certificates or keys, which may not all be the same type. Each object is delimited by lines similar to “—–BEGIN …—–” and “—–END …—–”. Data that is not between such lines is ignored, and is sometimes used for comments, or for a human-readable dump of the encoded data.
Following the “BEGIN” and “END” keywords is a name (such as “CERTIFICATE”) that can be used as an identifier for the type of object.
The data between the delimiter lines starts with an optional email-like header section, followed by base64-encoded payload data. After decoding, the payload data is in DER format.
总体而言,PEM 是明文格式,可以包含证书或者是密钥;其内容通常是以类似 “—–BEGIN …—–” 开头 “—–END …—–” 为结尾的这样的格式进行展示的;后续内容也描述到,PEM 格式的内容是 Base64 格式;通过解码,转换为 DER 格式,也就是说,PEM 是建立在 DER 编码之上的;
总结
DER 实际上就是密钥的最原始的二进制格式;而 PEM 是对 DER 的 Base64 的编码,PEM 解码后得到的就是 DER 编码格式;
格式
由于 DER 是二进制格式,不便于阅读和理解,一般而言,密钥都是通过 PEM 的格式进行存储的,所以,这部分内容主要是梳理出公钥和密钥以 PEM 编码存储的格式;
公钥 PEM 格式
PKCS #1
PKCS #1 标准是专门为 RSA 密钥进行定义的,其对应的 PEM 文件格式如下,
|
1
2
3
|
-----BEGIN RSA PUBLIC KEY-----
BASE64 ENCODED DATA
-----END RSA PUBLIC KEY-----
|
上面的内容 BASE64 ENCODED DATA 指的就是 ANS.1 的 DER 的 Base64 编码,其内容类似于
|
1
2
3
4
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChHmaw+WUhWrStdxWBcAR39i2e
3yz+vfLiDALeTpWIH1jKiYtvw4nMg6453pXAJSvPn7mKaiGiC3USIt8qTL4eCPi9
yNRDpZ1JRHI8M87VYB4c9KMk6IuVFiYyZ4MBTP87t89yeL9EOrAD0eFgi5fPx3g8
b9QrmnyPhMVjP7ct+wIDAQAB
|
上述内容翻译成 ASN.1 的格式为,此部分内容参考 RSA public key syntax 公钥语法 小节内容;
|
1
2
3
4
|
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
|
PKCS #8
有前面的分析我们可以知道,PKCS#8 标准定义了一个密钥格式的通用方案,它不仅仅为 RSA 所使用,同样也可以被其它密钥所使用;具体分析参考 RFC5208 Private-Key Information Syntax Specification
其所对应的 PEM 格式定义如下,
|
1
2
3
|
-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----
|
注意,这里就没有 RSA 字样了,因为 PKCS#8 是一个通用型的秘钥格式方案;其中的 BASE64 ENCODED DATA 所标注的内容为 PEM 格式中对 DER 原始二进制进行的 BASE64 编码;
所对应的 DER 原始二进制所表述的内容为
|
1
2
3
4
5
6
7
8
9
|
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
|
重要补充
从这里可以看到,PKCS#8 虽然名字叫做 Private-Key Information Syntax Specification,但是实际上,可以看到,它同样可以用作 Public Key 的格式定义;而 PKCS#8 是站在 PKCS#7 CMS 的基础之上进行编码格式定义的;
私钥 PEM 格式
PKCS #1
PKCS#1 是专门为 RSA 所涉及的,其对应的 PEM 格式如下
|
1
2
3
|
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
|
注意,这里就没有 RSA 字样了,因为 PKCS#8 是一个通用型的秘钥格式方案;其中的 BASE64 ENCODED DATA 所标注的内容为 PEM 格式中对 DER 原始二进制进行的 BASE64 编码;
原始的 DER 格式结构,既是 ASN.1 的数据结构,此部分内容参考 RSA private key syntax 私钥语法 小节内容;
|
1
2
3
4
5
6
7
8
9
10
11
12
|
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
|
PKCS #8
未加密
其所对应的 PEM 格式定义如下,
|
1
2
3
|
-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
|
注意,这里就没有 RSA 字样了,因为 PKCS#8 是一个通用型的秘钥格式方案;其中的 BASE64 ENCODED DATA 所标注的内容为 PEM 格式中对 DER 原始二进制进行的 BASE64 编码;
所对应的 DER 原始二进制所表述的内容为
|
1
2
3
4
5
6
7
8
9
10
|
PrivateKeyInfo ::= SEQUENCE {
version Version,
algorithm AlgorithmIdentifier,
PrivateKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
|
加密
由于私钥是非常私密的,所以在存储到时候往往需要对私钥的内容也进行加密,
PEM 格式
|
1
2
3
|
-----BEGIN ENCRYPTED PRIVATE KEY-----
BASE64 ENCODED DATA
-----END ENCRYPTED PRIVATE KEY-----
|
DER 格式,既是根据 ASN.1 标准所定义的格式
|
1
2
3
4
5
6
7
8
|
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm EncryptionAlgorithmIdentifier,
encryptedData EncryptedData
}
EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
EncryptedData ::= OCTET STRING
|
Reference
ASN.1 key structures in DER and PEM: https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem
ASN.1 key structures in DER and PEM: asn1-key-structures-in-der-and-pem.pdf
使用openssl命令剖析RSA私钥文件格式: http://blog.csdn.net/lucien_cc/article/details/18407451/
在线检测 ASN.1 格式的密钥内容:http://phpseclib.sourceforge.net/x509/asn1parse.php
RSA 格式 - 转载的更多相关文章
- openssl生成RSA格式,并转为pkcs8格式
原文地址:http://www.thinkingquest.net/articles/391.html?utm_source=tuicool 支付宝接口开发相关:openssl 加密工具 支付宝“手机 ...
- https SSL主流数字证书都有哪些格式(转载)
主流数字证书都有哪些格式? 一般来说,主流的Web服务软件,通常都基于两种基础密码库:OpenSSL和Java. Tomcat.Weblogic.JBoss等,使用Java提供的密码库.通过Java的 ...
- openssl生成RSA格式的公私钥,并转为pkcs8格式
第一步:生成私钥,这里我们指定私钥的长度为2048 openssl genrsa -out rsa_private_key.pem 2048 第二步:根据私钥生成对应的公钥: openssl rsa ...
- 数据类型和Json格式(转载)
作者: 阮一峰 日期: 2009年5月30日 1. 前几天,我才知道有一种简化的数据交换格式,叫做yaml. 我翻了一遍它的文档,看懂的地方不多,但是有一句话令我茅塞顿开. 它说,从结构上看,所有的数 ...
- Js时间格式[转载]
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...
- IP首部格式[转载]
TCP 传输首部是 IP首部,所以把IP首部格式 拿过来研究下,看IP首部解码过程: 来源:51CTO博客,地址:http://lihuan.blog.51cto.com/4391550/7999 ...
- MIME格式说明,电子邮件格式(转载)
邮件格式说明 Mutiple Internet Mail Extensions Refer to Internet Official Protocol Standards RFC 822 1 概述 网 ...
- linux mplayer 播放yuv格式 (转载)
转自:http://blog.csdn.net/ly0303521/article/details/38713791 在mplayer中查看YUV格式的图片或视频,可使用如下命令: mplayer - ...
- MyEclipse设置注释格式(转载)
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit ...
随机推荐
- Nginx 作用
django 请求的生命周期 Nginx 的作用: 浏览器 --- nginx(反向代理器)-- uwsgi --- django项目nginx : 负载均衡, 将任务分发给不同的uwsgi 动静分离 ...
- 8款非常不错的.Net反编译利器
本人搜集了下8款非常不错的.Net反编译利器: 1.Reflector Reflector是最为流行的.Net反编译工具.Reflector是由微软员工Lutz Roeder编写的免费程序.Refle ...
- 004dayPython学习输入并输出用户名和密码
在python 2.7中,捕获用户输入用raw_input 一.捕获并打印用户名和密码 要求: 输入用户名和密码都可见 # -*- coding:utf-8 -*-userName = raw_inp ...
- 2、CentOS下编译安装Python2.7.6(转)
CentOS系统下面Python在升级到2.7.6的时候,没有找到安装包直接安装,只能通过源代码编译的方式来安装Python 2.7.6版本.这篇是编译和安装Python2.7.6的过程记录. Cen ...
- java的main函数组成
package test;/*public static void main(String[] args)主函数特殊之处:1.格式是固定的2.被jvm(虚拟机)所识别和调用 public:因为权限必须 ...
- L1-064 估值一亿的AI核心代码
以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...
- Python 天气查询到实现语音播放
import requests #引用requests模块import pygame # 获取天气def inquery(self): url = "https://free-api.hew ...
- 第一次作业_ChenHong1998
我的目标 学习到软件工程的实践过程 回想一下你初入大学时对软件工程专业的畅想 当初你是如何做出选择软件工程专业的决定的? 计算机是热门专业,软件工程专业好找工作 你认为过去两年中接触到的课程是否符合你 ...
- 存储过程 传 datatable
首先 定义 datatable 然后把要传的数据放到table里面 调用 存储过程 传递参数
- c++错误
run-time check failure #2-stack around the variable 'c' was corrupted错误产生的原因大多是因为程序定义了数组,存在数组越界.解决办法 ...