RSA私钥文件(PEM-PKCS#1)解析

在PKCS#1 RSA算法标准中定义RSA私钥语法

RSAPrivateKey ::= SEQUENCE { 
version Version, //版本 
modulus INTEGER, // RSA合数模 n 
publicExponent INTEGER, //RSA公开幂 e 
privateExponent INTEGER, //RSA私有幂 d 
prime1 INTEGER, //n的素数因子p 
prime2 INTEGER, //n的素数因子q 
exponent1 INTEGER, //值 d mod (p-1) 
exponent2 INTEGER, //值 d mod (q-1) 
coefficient INTEGER, //CRT系数 (inverse of q) mod p 
otherPrimeInfos OtherPrimeInfos OPTIONAL 
}

otherPrimeInfos 按顺序包含了其它素数r3, …, ru的信息。如果version是0 ,它应该被忽略;而如果version是1,它应该至少包含OtherPrimeInfo的一个实例。 
OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo 
OtherPrimeInfo ::= SEQUENCE { 
prime INTEGER, //ri – n的一个素数因子ri ,其中i ≥ 3 
exponent INTEGER, //di – di = d mod (ri ? 1) 
coefficient INTEGER //ti – CRT系数 ti = (r1 · r2 · … · ri–1)–1 mod ri 
}

RSAPrivateKey 和OtherPrimeInfo各域的意义,如注释所示。

本文讲述适用范围:已知各域值,组装RSA私钥文件,即PEM文件。

PEM文件组成是TLV结构。

一、数据实例,各域值如下:

  1. version: 
    00
  2. moudlus: 
    c1f7f7196d9ef4b97abede2d5322d76c17fdf9592c39511027268293a14603b6 
    5d5425c99cfb5194d37b73487d26e31edf35cfe1e7f58366b5adb35d18f8cdb1 
    401264ed35a3e26dc131c099eca45ac23dbc2e1a0d00f6defd6428a6431429b2 
    744943f2e1dffe00bbd1dcf22ec7c0dde553659763c8c11db883ccb6de0de91d 
    5d2bcffe57e368bf5a1799bbd6f978706793dc7aa710c1cf00725827df6651e2 
    15ca4bc83509c89bb257479a2833fa972f4344799c37f8217b704c9e5ae2e09d 
    1d5941ddd4caf71d12a823fdf421930df034220bd8ee37fc8b0543f1f2f49ade 
    6a7ffcc7ab9d1edab4b07b7f33a72f0c660ea3c46fd7c1243ed956244e506463
  3. publicExponent: 
    010001
  4. privateExponent: 
    a6c362cd98e2b5f295a66dec37f2d7951697837e78381b0ab12e39cb653785cf 
    8f33de7d151b398ba3bb1a65733c30be851785cfea96b94f5fd9a440e14c5fc4 
    099b06ecae566541097d95e28082d988f07cce8215360409b97f1837c1aa1f23 
    4f3902535a8132a73cd3748b3f4efbf18acd85a57fe3c4aca1cba7007daf2600 
    5ac200c6fbc7baac75eb4ddc25f40a911fb9f2e9e896177def1de96fbcf8563f 
    0d3ff0c6ca578b937f635db4dfd7375ecf2ddd3afd7ce7e27a01555e4de382c9 
    11e250b16045d9228e32be1d635cbf649a3c6b7ecf2fe65471dc7b1e219348f9 
    cb9393f480b9faa3d40d0f88441502a5912a7470b33cc1f4e42903d924b7f5d9
  5. prime1: 
    e03ec42723797e4ef903ce5d2b4576885f9c2fe0ab9c4cd79cb15f970b792472 
    4b1b65f3f8142311f48fcd6c16df881c58fbd67e234171a6f1c0285b439eea32 
    1342c42580eaa4431fb0181498922cbc169234630b6ad1f033127e4340ef1095 
    d42781e21992073f8f42bb844b5108a2ebb188252a858315f81843b89ad5ae87
  6. prime2: 
    dd6fa073b6ecdfaf0da10ab409c883a0147501afe5c3b8ab02ff5865c366d28f 
    c678b1c6af3c0d577ee03d12fc7f6fad298555044c11db602793f2aae4c542de 
    2f6c905bce239facad40c919866776c76d48fa684045d2d804127fc637d9ebb0 
    9ffd5994512caaa3193f8ddc2676551b5abb70c7732ac12759e0c0d8dbf15645
  7. exponent1: 
    550ffa204e989b8d21708c2b536aba17e90cba2ca36c5ac9bf2a9974166a11a5 
    39505f50385e8b1f1882240e486eea96b63a7196cf90d7a7d834681a9680059e 
    9127d677d37b2e6c37ecf875779a9b558dca500cf21bc71f3280655ce598c9d5 
    cbf060987fd2a0e53f56b502edff0323a9fc62049728a61d034b510509d6dca9
  8. exponent2: 
    d077dde3f2ac30ae3a3389c3138ecdb4706df387a8d5494ede848cb14973ccfa 
    048cee3932126431224673d92313ca8c8891790791a22218f549c8e4f07971c9 
    817640b5dd6d164f57d0ad42b5914476ddc11dd5f5e4866a4df3288df158dd16 
    2c9934b3787487b502f91d51cc780d09b2b2d2ab4316563ff8d2aa5bbf3d06cd 
  9. coefficient: 
    46573748247030d0fc2fd9b602e7a0e26ef50509571d97e1c9bcb750b154d08a 
    1e75fac22e3f521a6d52da0950c1b322fd0ecb55014bd0ec328ce6b6a342dc9d 
    048d7488ad9d3db722fa450049f27a1584905170f7ce42eab1197d1df6c819f6 
    0066b987fc1e53b77ce865fcae091121b8b8c93457b85bb9d6d331e525f6729d 

二、组装PEM文件

  1. 按照以上数据域顺序依次组装成TLV。

①version组装 
020100 
说明: 
02 – tag 
01 – length 
00 – value(version)

② modulus组装 
0282010100 
c1f7f7196d9ef4b97abede2d5322d76c17fdf9592c39511027268293a14603b6 
5d5425c99cfb5194d37b73487d26e31edf35cfe1e7f58366b5adb35d18f8cdb1 
401264ed35a3e26dc131c099eca45ac23dbc2e1a0d00f6defd6428a6431429b2 
744943f2e1dffe00bbd1dcf22ec7c0dde553659763c8c11db883ccb6de0de91d 
5d2bcffe57e368bf5a1799bbd6f978706793dc7aa710c1cf00725827df6651e2 
15ca4bc83509c89bb257479a2833fa972f4344799c37f8217b704c9e5ae2e09d 
1d5941ddd4caf71d12a823fdf421930df034220bd8ee37fc8b0543f1f2f49ade 
6a7ffcc7ab9d1edab4b07b7f33a72f0c660ea3c46fd7c1243ed956244e506463

说明: 
02 – tag 
82 – 81代表长度用1byte表示,82代表长度用2byte表示(此字节部分tag后不存在) 
0101 – length 2bytes表示 
00 – 在modulus数据前添加00,原因未知,请知情道友告知。

③publicExponent组装 
0203010001

④privateExponent组装 
0282010100 
a6c362cd98e2b5f295a66dec37f2d7951697837e78381b0ab12e39cb653785cf 
8f33de7d151b398ba3bb1a65733c30be851785cfea96b94f5fd9a440e14c5fc4 
099b06ecae566541097d95e28082d988f07cce8215360409b97f1837c1aa1f23 
4f3902535a8132a73cd3748b3f4efbf18acd85a57fe3c4aca1cba7007daf2600 
5ac200c6fbc7baac75eb4ddc25f40a911fb9f2e9e896177def1de96fbcf8563f 
0d3ff0c6ca578b937f635db4dfd7375ecf2ddd3afd7ce7e27a01555e4de382c9 
11e250b16045d9228e32be1d635cbf649a3c6b7ecf2fe65471dc7b1e219348f9 
cb9393f480b9faa3d40d0f88441502a5912a7470b33cc1f4e42903d924b7f5d9

⑤prime1组装 
02818100 
e03ec42723797e4ef903ce5d2b4576885f9c2fe0ab9c4cd79cb15f970b792472 
4b1b65f3f8142311f48fcd6c16df881c58fbd67e234171a6f1c0285b439eea32 
1342c42580eaa4431fb0181498922cbc169234630b6ad1f033127e4340ef1095 
d42781e21992073f8f42bb844b5108a2ebb188252a858315f81843b89ad5ae87

⑥prime2组装 
02818100 
dd6fa073b6ecdfaf0da10ab409c883a0147501afe5c3b8ab02ff5865c366d28f 
c678b1c6af3c0d577ee03d12fc7f6fad298555044c11db602793f2aae4c542de 
2f6c905bce239facad40c919866776c76d48fa684045d2d804127fc637d9ebb0 
9ffd5994512caaa3193f8ddc2676551b5abb70c7732ac12759e0c0d8dbf15645

⑦exponent1组装 
028180 
550ffa204e989b8d21708c2b536aba17e90cba2ca36c5ac9bf2a9974166a11a5 
39505f50385e8b1f1882240e486eea96b63a7196cf90d7a7d834681a9680059e 
9127d677d37b2e6c37ecf875779a9b558dca500cf21bc71f3280655ce598c9d5 
cbf060987fd2a0e53f56b502edff0323a9fc62049728a61d034b510509d6dca9

⑧exponent2组装 
02818100 
d077dde3f2ac30ae3a3389c3138ecdb4706df387a8d5494ede848cb14973ccfa 
048cee3932126431224673d92313ca8c8891790791a22218f549c8e4f07971c9 
817640b5dd6d164f57d0ad42b5914476ddc11dd5f5e4866a4df3288df158dd1

⑨coefficient组装 
028180 
46573748247030d0fc2fd9b602e7a0e26ef50509571d97e1c9bcb750b154d08a 
1e75fac22e3f521a6d52da0950c1b322fd0ecb55014bd0ec328ce6b6a342dc9d 
048d7488ad9d3db722fa450049f27a1584905170f7ce42eab1197d1df6c819f6 
0066b987fc1e53b77ce865fcae091121b8b8c93457b85bb9d6d331e525f6729d

  1. 输出PEM文件 
    ①输出以上数据域的总TLV:308204a4到PEM文件; 
    ②依次输出以上组装后的数据到PEM文件。

至此,PEM文件已生成。 
本文实例数据对应PEM文件,如图:

PEM_part1

PEM_part2

对此PEM文件进行Base64编码,即得到RSA私钥: 
—–BEGIN RSA PRIVATE KEY—– 
MIIEpAIBAAKCAQEAwff3GW2e9Ll6vt4tUyLXbBf9+VksOVEQJyaCk6FGA7ZdVCXJ 
nPtRlNN7c0h9JuMe3zXP4ef1g2a1rbNdGPjNsUASZO01o+JtwTHAmeykWsI9vC4a 
DQD23v1kKKZDFCmydElD8uHf/gC70dzyLsfA3eVTZZdjyMEduIPMtt4N6R1dK8/+ 
V+Nov1oXmbvW+XhwZ5PceqcQwc8Aclgn32ZR4hXKS8g1CcibsldHmigz+pcvQ0R5 
nDf4IXtwTJ5a4uCdHVlB3dTK9x0SqCP99CGTDfA0IgvY7jf8iwVD8fL0mt5qf/zH 
q50e2rSwe38zpy8MZg6jxG/XwSQ+2VYkTlBkYwIDAQABAoIBAQCmw2LNmOK18pWm 
bew38teVFpeDfng4GwqxLjnLZTeFz48z3n0VGzmLo7saZXM8ML6FF4XP6pa5T1/Z 
pEDhTF/ECZsG7K5WZUEJfZXigILZiPB8zoIVNgQJuX8YN8GqHyNPOQJTWoEypzzT 
dIs/Tvvxis2FpX/jxKyhy6cAfa8mAFrCAMb7x7qsdetN3CX0CpEfufLp6JYXfe8d 
6W+8+FY/DT/wxspXi5N/Y12039c3Xs8t3Tr9fOfiegFVXk3jgskR4lCxYEXZIo4y 
vh1jXL9kmjxrfs8v5lRx3HseIZNI+cuTk/SAufqj1A0PiEQVAqWRKnRwszzB9OQp 
A9kkt/XZAoGBAOA+xCcjeX5O+QPOXStFdohfnC/gq5xM15yxX5cLeSRySxtl8/gU 
IxH0j81sFt+IHFj71n4jQXGm8cAoW0Oe6jITQsQlgOqkQx+wGBSYkiy8FpI0Ywtq 
0fAzEn5DQO8QldQngeIZkgc/j0K7hEtRCKLrsYglKoWDFfgYQ7ia1a6HAoGBAN1v 
oHO27N+vDaEKtAnIg6AUdQGv5cO4qwL/WGXDZtKPxnixxq88DVd+4D0S/H9vrSmF 
VQRMEdtgJ5PyquTFQt4vbJBbziOfrK1AyRmGZ3bHbUj6aEBF0tgEEn/GN9nrsJ/9 
WZRRLKqjGT+N3CZ2VRtau3DHcyrBJ1ngwNjb8VZFAoGAVQ/6IE6Ym40hcIwrU2q6 
F+kMuiyjbFrJvyqZdBZqEaU5UF9QOF6LHxiCJA5IbuqWtjpxls+Q16fYNGgaloAF 
npEn1nfTey5sN+z4dXeam1WNylAM8hvHHzKAZVzlmMnVy/BgmH/SoOU/VrUC7f8D 
I6n8YgSXKKYdA0tRBQnW3KkCgYEA0Hfd4/KsMK46M4nDE47NtHBt84eo1UlO3oSM 
sUlzzPoEjO45MhJkMSJGc9kjE8qMiJF5B5GiIhj1Scjk8HlxyYF2QLXdbRZPV9Ct 
QrWRRHbdwR3V9eSGak3zKI3xWN0WLJk0s3h0h7UC+R1RzHgNCbKy0qtDFlY/+NKq 
W789Bs0CgYBGVzdIJHAw0Pwv2bYC56DibvUFCVcdl+HJvLdQsVTQih51+sIuP1Ia 
bVLaCVDBsyL9DstVAUvQ7DKM5rajQtydBI10iK2dPbci+kUASfJ6FYSQUXD3zkLq 
sRl9HfbIGfYAZrmH/B5Tt3zoZfyuCREhuLjJNFe4W7nW0zHlJfZynQ== 
—–END RSA PRIVATE KEY—–

三、通过OpenSSL命令,获得私钥中各个参数的值:

命令:openssl rsa -in private_rsa.pem -text -out private.txt

然后就可以在private.txt文件中查看RSA密钥中各个参数的值


转载自:http://blog.csdn.net/xuanshao_/article/details/51672547

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring的@Configuration使用cglib代理的效果和我自己写的简单实现

下面的代码,照着复制就能跑起来 今天看了下Spring的Configuration,即java类配置bean,(这个spring3的新功能,虽然现在已经spring5了,但是这种配置bean的方式也是比较火的) 做了如下测试,发现一个…

Xcode中StaticLibrary和Framework的共同点和区别

一、共同点:两者其实都是静态库。二、区别1.承载的内容范畴:(1)StaticLibrary的产出物只是一个.a文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。(2)Framework为一站式分享方案,其实是一…

[分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成基于数据库基于redis基于zookeeper 本文说下雪花算法,后面附源码以及测试代码。 如下图: …

非对称加解密交互故事

1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 2.鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。 3.苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果 4.鲍勃收信后,用私钥解密&#xff0…

2019年规划

2019年规划,到2019-12-31检查: 1.至少读5本与工作无关的书(平均两个月1本),每本都产出读后感 1.1 《重构 改善代码既有设计》,2月19日~3月5日,刚好两周读完,产出两篇总结&#xff0…

RSA私钥文件(PEM-PKCS#8)解析

***此文仅针对没有执行加密的PKCS#8私钥文件***一、实例解析PKCS#8格式使用的是ASN.1结构,首先我们对一个没有执行加密的PKCS#8格式私钥文件进行一下解析,方便我们下面分析其结构。命令:openssl asn1parse -i -in privatekey.pem结果如下&…

分布式和集群的区别

分布式和集群的区别 分布式是多个不同功能的机器共同完成一件事情 集群是多个相同功能的机器完成的是相同的事情 分布式是为了分担压力 集群是为了稳定性和高可用 举个例子: 一个厨师开了一个饭店,他要负责做饭和卖饭,他的压力就比较大&am…

Sqlite3中replace语句用法详解

在本例中使用如下数据库表: (图 1) 该表的表名为student, 存储学生信息。 所有字段的数据类型都是TEXT 。 其中id和name作为复合主键。 email字段加上了唯一约束。建表语句如下: CREATE TABLE IF NOT EXISTS student …

[分布式一致性协议] ------ raft协议的解释与理解

前言 在分布式系统中,为了保证容错性,一般会维护多个副本集群,提高系统的高可用,但与之带来的问题就是多个副本的一致性(consensus)问题。 我们认为,对于一个具有一致性的的集群中,…

iOS应用图片命名规则

一、界面图片命名规则:MyImage.png 一般图片命名MyImage2x.png 高清图片命名MyImage~iphone.png iPhone 和 iPod touch版一般图片命名MyImage2x~iphone.png iPhone 和 iPod touch版高清图片命名MyImage~ipad.png …

用户自定义排序的几种实现思路

场景 每个用户,有多个分组 每个分组在页面展示,而且是有顺序的,这个顺序是由用户决定 以下是关于多种情况下的库表设计思路: 情景一:如果每改一次,就要实时修改库,而且用户可以任意修改顺序&…

重构,体现一个工程师的基本素养和底蕴

重构小记(重构,改善既有代码的设计读后总结) 我们要时时刻刻保持一颗项目要重构的心。 在非技术出身的领导看来,能用的代码就是好代码,只关注功能。 在工程师看来,代码不仅要好用,更要好看&…

应用内购买(IAP)各类型在服务端的验证规则

一、非消耗品(比如单本杂志购买,苹果服务器支持恢复) 1.先验证服务器有没有购买记录,如果有,则不处理,此次操作成功 ;2.如果服务器没有购买记录,则到苹果服务器验证(1)首先到正式验证地址验证收据,如果返回…

@Transactional事务生效条件与样例

Transactional事务生效条件 Transactional注释的方法,不能是private修饰 Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编程的套路) Transactional注释的方法,必须要通过接口的方式调用&…

利用.dSYM和.app文件准确定位Crash位置

当发布到iPhone上的应用程序Crash之后,iPhone会自动生成一个Crash Log(*.crash),这个文件包含了一些有用的调试信息,但对于堆栈,它只记录的函数地址,而无法显示函数名。函数名保存在一个叫dSYM的…

使用maven的profile区分本地环境和线上环境

使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同。 以区分本地数据库和线上数据库为例 比如测试环境,用的是本地测试数据库;生产环境用…

查看函数库.a函数符号信息

一、概述 nm命令可以列出一个函数库文件中的符号表。它对于静态的函数库和共享的函数库都起作用。对于一个给定的函数库,nm命令可以列出函数库中定义的所有符号,包括每个符号的值和类型。还可以给出在原程序中这个函数(符号)是在多…

重构,体现一个工程师的基本素养和底蕴(细节篇)

重构小记(重构,改善既有代码的设计读后总结) 方法级别 提炼函数: 将一个大方法,拆成多个小方法,难点在于小方法的命名。 假如有早上上学的一个大方法, 那么就应该在里面有起床,穿衣…

MVPVM模式介绍

一、概述MVPVM即:Model-View-Presenter-ViewModel。此模式是MVVM和MVP模式的结合体。但是交互模式发生了比较大的变化。MVVM参考本博客文章:iOS-MVVM-模式介绍MVP参考本博客文章:MVP模式介绍 二、原理:Presenter同时持有View、Mod…

[线程池] ------ 形象的描述线程池,用一个特好记的例子来记忆

线程池 为了减少线程频繁的创建和销毁过程,引入池的概念。 将一些线程先创建好放在线程池中,每次来任务就用池中的线程执行,空闲时池中线程就等待,但不销毁。 原始线程池的创建: ThreadPoolExecutor executor1 new …