环境: ubuntu20.4 内核 5.10.10

RSA是最常见的非对称加密算法,RSA的原理就不做介绍了,主要介绍一下密钥格式,linux 进行密钥转换编程。

要学习RSA编码,首先需要理解RSA密钥的格式。

RSA有公钥,私钥之分,公钥私钥都使用相同的语法格式。

RSA的密钥有两种格式,PEM格式,DER格式

PEM格式

PEM格式包含几种报文头
"-----BEGIN PUBLIC KEY-----": PKCS#8 格式公钥
"-----BEGIN PRIVATE KEY-----": PKCS#8 格式私钥

"-----BEGIN RSA PUBLIC KEY-----": PKCS#1 格式公钥
"-----BEGIN RSA PRIVATE KEY-----": PKCS#1 格式私钥

常见的PEM格式如下

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDX2k9fV+TXr0sIw/oGI9v2g+Nm

Drf16cdfK45oPEyEGH0sqcYvvTTjD2iovHltOMCidgV2TH+S0bIb6JEoPaW7/+ya

tX3+MvHpCnOylaDH5aKNKoy/JyRn/cy9TXAk0QLAlKTCnfP1A3s5WqRDO2f6B70r

imffp9gfs/SVVhjy0wIDAQAB

-----END PUBLIC KEY-----

这种格式是linux下面最常见的文本存储格式,这种格式实际上是二进制的密钥经过base64编码之后的产物,无法直观的解析密钥的内容。

DER格式

如下是一个公钥的DER格式:

30819f300d06092a864886f70d010101050003818d0030818902818100cc9a1f4ccfe7bf8bbf4ff41e6f0d373d3bdd36c6fb96e88158a19d3b8eb145fc0cd0f02b57fa54b8df14f3bbbf44a218ba04e9b2d501ac400d9eb986e6eb2c3c388b8edd233bd959ad0661ecf468a0ed57b850ba8aca7d2150b78448b74386c16df6df3adc56e7f25bdd4cd22859df54fef495d938ac3391af323b6f1e270c190203010001

DER格式可以认为是二进制的密钥格式,咱们可以根据一定的规则进行解析(准确的说是 ASN1 语法,ASN1语法比较复杂,如果无法彻底理解,可以大概理解为tlv格式)

DER公钥解析

公钥语法为:

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

类型RSAPublicKey的域具有以下意义:

• modulus 是RSA的合数模n。

• publicExponent 是RSA公开幂e。

按照ASN1语法解析上述公钥:

30819f //容器[30 ASN1语法中的SEQUENCE] [81 长度数据占1位] [9F 容器内有9F字节数据] 类似TLV格式,对吧?

300d06092a864886f70d0101010500//容器[30 SEQUENCE] [0D 容器内有0D字节数据] 固定内容,长度为0x0D个字节,为RSA OID

03818d00//03 ASN1语法中的 BIT STRING, BIT STRING内容前面需要加00

308189//容器[30 SEQUENCE] [81 长度数据占1位] [89 容器内有0x89字节数据]

028181//02 ASN1语法中的INTEGER整数[02 INTEGER] [81 长度数据占1位] [81 Modulus内容长x81字节]

00cc9a1f4ccfe7bf8bbf4ff41e6f0d373d3bdd36c6fb96e88158a19d3b8eb145fc0cd0f02b57fa54b8df14f3bbbf44a218ba04e9b2d501ac400d9eb986e6eb2c3c388b8edd233bd959ad0661ecf468a0ed57b850ba8aca7d2150b78448b74386c16df6df3adc56e7f25bdd4cd22859df54fef495d938ac3391af323b6f1e270c19//Modulus

0203010001//02 INTEGER整数[02 INTEGER] [03 Exponent内容长x03字节]

解析完毕。如果觉得不清晰,请联系我,我再完善

3)DER私钥解析

私钥的asn1语法:

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

}

• version 是版本号,为了与本文档的今后版本兼容。本篇文档的这个版本号应该是0,如果使用了多素数,则版本号应该是1。

Version ::= INTEGER { two-prime(0), multi(1) }

(CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})

modulus 是RSA合数模n。

publicExponent 是RSA的公开幂e。

privateExponent 是RSA的私有幂d。

prime1 是n的素数因子p。

prime2 i是n的素数因子q。

exponent1 等于d mod (p − 1)。

exponent2 等于d mod (q − 1)。

coefficient 是CRT系数 q–1 mod p。

otherPrimeInfos 按顺序包含了其它素数r3, …, ru的信息。如果version是0 ,它应该被忽略;而如果version是1,它应该至少包含OtherPrimeInfo的一个实例。

OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo

OtherPrimeInfo ::= SEQUENCE {

prime INTEGER, -- ri

exponent INTEGER, -- di

coefficient INTEGER -- ti

}

OtherPrimeInfo的各域具有以下意义:

• prime 是n的一个素数因子ri ,其中i ≥ 3。

• exponent 是di = d mod (ri − 1)。

• coefficient 是CRT系数 ti = (r1 · r2 · … · ri–1)–1 mod ri。

私钥的内容太多,解析就不举例说明了,如果有不明白的,欢迎留言。

密钥格式转换代码

PEM = "-----BEGIN PUBLIC KEY-----" +  encode_base64(decode_hex(DER)) + "-----END PUBLIC KEY-----"

代码如下:

编译:

g++ main_dertoper.cpp -g -O0 -o main -lcrypto

下面是输出结果:

完整代码请关注公众号

参考文章:

https://www.linuxidc.com/linux/2015-01/112074.htm

https://www.cnblogs.com/yiyongling/articles/11365380.html

https://bbear.com.cn/index.php/archives/157/

RSA密钥格式解析 DER-PEM 转换代码相关推荐

  1. java rsa 公钥格式_JAVA,NET RSA密钥格式转换

    JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...

  2. pkcs1转pkcs8 php,openssl RSA密钥格式PKCS1和PKCS8相互转换

    openssl 生成pkcs1格式的私钥,密钥长度2048位, (PKCS1) openssl genrsa -out private.pkcs1.pem 2048 PKCS1私钥转换为PKCS8 o ...

  3. 记一次工作需求: RSA密钥之C#格式与Java格式转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  4. ras私钥c#转java_C#和JAVA的RSA密钥、公钥转换

    C#的秘钥跟JAVA的密钥区别 RSA对于程序本身是没有区别的,其格式都是相同的.对于不同的程序来说,存储使用的语法(包装的类)会有所不同. RSA语法和语法标准有很多,大的类型大概分为ASN.1.P ...

  5. ras私钥c#转java_RSA密钥,JAVA与.NET之间转换

    最近在做银联的一个接口,用到RSA签名,悲剧来了,.net用的RSA密钥格式和JAVA用的不一样 .net为XML格式 53KnujHcV0962zoLigW8d4AUb+1TS3LiySGrXhF5 ...

  6. java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...

    众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式.我们在开发过程中很可能遇到需要与其他语言开发的a ...

  7. .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

    众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式.我们在开发过程中很可能遇到需要与其他语言开发的a ...

  8. [crypto]-51-RSA私钥pem转换成der, 在将der解析出n e d p q dp dq qp

    1.将pem转换成der openssl base64 -d -in test_priv.pem -out 1.data user1:~/work/crypto$ openssl base64 -d ...

  9. php公钥模数,php – 如何从公共指数和RSA模数生成DER / PEM证书?

    众所周知,公钥由公共指数和模数组成. 我的问题是: 如何从公共指数和RSA模数生成DER / PEM证书? 非常感谢你提前. 解决方法: 使用公共指数和模数,你可能希望做的最好的事情是得到这样的东西: ...

最新文章

  1. 长短期记忆网络_昆明理工大学刘可真、苟家萁、骆钊等:粒子群优化长短期记忆网络模型如何进一步提高变压器油中溶解气体浓度的精准预测?...
  2. 详解布隆过滤器的原理、使用场景和注意事项
  3. 使用python向Redis批量导入数据
  4. KDE 4.3.2 发布
  5. 屏幕坏点怎么产生的_修复液晶屏幕坏点的妙招
  6. 微服务的好处与弊端_在云原生时代,就一定要用微服务吗?
  7. Leetcode--49. 字母异味词分组
  8. Impala 调用Hbase 报错 LeaseException
  9. SpringBoot使用Easypoi导出excel示例
  10. 双11电商手机大战盘点,大神荣耀各成势力
  11. 血眼龙王萧沙传-翠花篇
  12. 论文阅读:BPFINet: Boundary-aware progressive feature integration network for salient object detection
  13. 基于javaweb+springboot的在线购书系统网上书店图书商城(前台、后台)(java+Springboot+ssm+mysql+maven)
  14. Win11软件兼容性怎么样?
  15. ❤️ 工厂模式:教你如何制造一台Huawei P50手机 ❤️
  16. 如何烧写Bubblegum-96 board
  17. 从今往后,我就是一名前端攻城狮
  18. PAT甲级 1087 条条大路通罗马
  19. 仿微信、qq聊天,@好友功能
  20. 微机原理--8088/8086微处理器详解

热门文章

  1. CSS3的 transition:属性 延续时间 速率变化 延迟时间
  2. java计算机毕业设计小微企业人事管理系统源码+lw文档+系统+数据库
  3. 被“文化殖民”的农村
  4. CPU两大架构:X86与ARM的区别
  5. HTML+CSS+JS网页设计期末课程大作业——上海旅游景点(10页)web前端开发技术 web课程设计 网页规划与设计...
  6. 游戏耳机什么牌子好?2022年最值得入手的游戏蓝牙耳机
  7. raspberry是个什么玩意
  8. 浙商炒房团转战电脑卖场:广州起步全国布局
  9. Objective Quality Assessment of Tone-Mapped Images
  10. 使用 happypack 提升 Webpack 项目构建速度