当前位置: 首页 > news >正文

基于ASN.1的RSA算法公私钥存储格式解读

1.概述

RFC5958主要定义非对称密钥的封装语法,RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥,例如按照RSA算法,公钥是n和e,私钥是d和n。当需要将公私钥保存到文件时,需按照一定的格式保存。本文主要定义公私钥保存到文件的语法。目前私钥封装到文件的规范有PKCS#1和PKCS#8,其中主流为PKCS#8。公钥封装通常兼容X.509规范。本文基于RSA算法进行简单说明。

2.PKCS#8私钥

2.1私钥格式

在RFC5958中,私钥的ASN.1语法如下(ASN.1语法可参考之前的文章)

OneAsymmetricKey ::= SEQUENCE {version 						 Version,privateKeyAlgorithm		PrivateAlgorithmIdentifier,privateKey						PrivateKeyattributes 				[0] Attributes OPTIONAL,...,[[2:publickey			[1] PublicKey OPTIONAL]],...
}
PrivateKeyInfo ::= OneAsymmetricKey

2.2 参数说明

Version ::= INTEGER { v1(0),v2(1)}。Version值为0或者1,当值为0时,私钥格式遵循RFC5208。RFC5208中对私钥的定义如下:

PrivateKeyInfo ::= SEQUENCE {version							Version,privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,privateKey					 PrivateKeyattributes			[0]	 IMPLICIT Attributes OPTIONAL
}

Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attributes

在非对称算法为RSA非加密模式时,PrivateKeyAlgorithmIdentifier定义在RFC5280,定义如下:

AlgorithmIdentifier ::= SEQUENCE {algorithm		OBJECT IDENTIFIER,parameters		ANY DEFINED BY algoarithm OPTIONAL
}

algorithm的定义在RFC8017 A.1,值为pkcs-1 1,parameters的类型为NULL。pkcs-1 1的值在RFC8017 Appendix C
在这里插入图片描述

PrivateKey定义在PKCS#1(RFC8017 A.1.2 RSA Private Key Syntax),定义如下:

RSAPrivateKey ::=SEQUENCE {version					Version,modulus					INTEGER, --npublicExponent  INTEGER, --eprivateExponent INTEGER, --dprime1					 INTEGER, --pprime2					 INTEGER, --qexponent1			  INTEGER,--d mod (p-1)exponent2			  INTEGER,--d mod (q-1)coefficient			 INTEGER, -- (inverse of q) mod potherPrimeInfos	 OtherPrimeInfos OPTIONAL
}

相关参数含义请查看RSA算法原理。

Attributes等参数为可选值,未深入研究。
因此,当version为0时,私钥格式应如下:

PrivateKeyInfo ::= SEQUENCE {version							Version,privateKeyAlgorithm ::= SEQUENCE {algorithm		OBJECT IDENTIFIER,parameters		ANY DEFINED BY algoarithm OPTIONAL}privateKey					 ::= OCTET STRINGRSAPrivateKey ::= SEQUENCE {version					Version,modulus					INTEGER, --npublicExponent  INTEGER, --eprivateExponent INTEGER, --dprime1					 INTEGER, --pprime2					 INTEGER, --qexponent1			  INTEGER,--d mod (p-1)exponent2			  INTEGER,--d mod (q-1)coefficient			 INTEGER, -- (inverse of q) mod potherPrimeInfos	 OtherPrimeInfos OPTIONAL}attributes			[0]	 IMPLICIT Attributes OPTIONAL
}

3.X.509公钥

在RFC5280中对公钥的定义如下:

SubjectPublicKeyInfo ::= SEQUENCE {algorithm 				AlgorithmIdentifier,subjectPublicKey BIT STRING
}

其中AlgorithmIdentifier和私钥中定义相同(见本文2.2章节)
subjectPublicKey定义在RFC8017 A.1.1

RSAPublicKey ::= SEQUENCE {modulus					INTEGER, --npublicExponent	 INTEGER --e
}

4.文件格式说明

原始公私钥和证书文件应以ASN.1进行编码,编码后的文件是二进制格式。为便于查看,通常会对ASN.1原始编码进行base64并添加头尾信息,形成文本存储格式,此类文件即为PEM文件,通常以.pem、.cer、.key等格式保存。第五章节将详细说明。

5.实践&验证

本章主要基于openssl 3.1版本进行实践,以验证上述理解是否正确。注意:不同版本的openssl生成的公私钥遵循的规范可能有一定差异。尤其是1.X版本

5.1 公钥

我们通过openssl生成公私钥,命令如下
openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048
默认生成PKCS#8 PEM格式的私钥,如下:
在这里插入图片描述

该文件是以-----BEGIN PRIVATE KEY-----为头,-----END PRIVATE KEY-----结尾,中间部分即为PKCS#8私钥的ASN.1原始编码的BASE64后内容。可通过如下步骤进行验证:

  1. 将中间部分复制到新文件中,新文件命名为111.txt
    在这里插入图片描述

2.对111.txt中的内容进行base64解码后,以文本形式打开将是乱码
在这里插入图片描述

在这里插入图片描述

3.通过如下命令
openssl rsa -in private.pem -outform DER -out private.der
将PEM格式的私钥转换为ASN.1原始编码的DER格式。
在这里插入图片描述

4.对比转换后的111.txt文件和通过openssl生成的private.der文件,可看到2个文件完全一致。
在这里插入图片描述

通过hexview打开private.pem可以看到原始ASN.1编码
在这里插入图片描述

为便于后续分析,我们使用专业解析工具ASN.1 Editor打开private.pem或者private.der文件,以ASN.1编码形式查看,如下图(关于ASN.1如何理解,请阅读上篇文章)
在这里插入图片描述

在2.1章节总结,当version为0时,私钥格式为

PrivateKeyInfo ::= SEQUENCE {version							Version,privateKeyAlgorithm ::= SEQUENCE {algorithm		OBJECT IDENTIFIER,parameters		ANY DEFINED BY algoarithm OPTIONAL}privateKey					 ::= OCTET STRINGRSAPrivateKey ::= SEQUENCE {version					Version,modulus					INTEGER, --npublicExponent  INTEGER, --eprivateExponent INTEGER, --dprime1					 INTEGER, --pprime2					 INTEGER, --qexponent1			  INTEGER,--d mod (p-1)exponent2			  INTEGER,--d mod (q-1)coefficient			 INTEGER, -- (inverse of q) mod potherPrimeInfos	 OtherPrimeInfos OPTIONAL}attributes			[0]	 IMPLICIT Attributes OPTIONAL
}

对照解析如下:
1.整个文件就是1个SEQUENCE的TLV。T为30,指明是个SEQUENCE。L是82 04 BD,指明V的长度为0x04BD,即1213个字节
在这里插入图片描述

2.随后是SEQUENCE的值内容。内容区应包含三个部分1个Version、1个SEQUENCE、1个OCTET STRING,其中Version为0,如下图,符合预期
在这里插入图片描述

3.SEQUENCE为privateKeyAlgorithm。包含1个类型为OBJECT IDENTIFIER的algorithm和1个parameters。如下图,30为SEQUENCE的T,0D为SEQUENCE的L,06为algorithm的L,09为algorithm的长度,algorithm的值为2A 86 48 86 F7 0D 01 01 01,共9个字节,且值符合2.1章节的分析。parameters为NULL类型
在这里插入图片描述

4.OCTET STRING为privateKey,即存储的私钥信息。首先是个SEQUENCE包裹内容,SEQUENCE中包含9个INTEGER,otherPrimeInfos为可选的,本次证书里没有该内容。
在这里插入图片描述

5.2 公钥

通过openssl命令从私钥中生成公钥,命令如下:
openssl rsa -pubout -in private.pem -out public.pem
同样适用ASN.1 Editor打开公钥public.pem。可以看到公钥整体有1个SEQUENCE,SEQUENCE中包含1个SEQUENCE和1个BIT_STRING,BIT_STRING中是1个SEQUENCE,符合第3章节的X.509的公钥结构。
在这里插入图片描述

具体解读,不再赘述。可参考5.1章节对私钥的解读,按照相同方式解读。

6.总结

本文在前4个章节主要基于相关RFC文档的解读,简单介绍RSA算法的公私钥如何保存到文件中,即RFC相关文档定义了公私钥保存的格式,随后使用ASN.1编码对相关内容进行编码,并按照RFC定义的格式保存到文件中。实际保存到文件中还涉及两种格式:1.原始ASN.1编码以二进制文件格式保存到文件中。2.对原始ASN.1进行BASE64编码,随后添加一个可文本阅读的头和尾,形成pem格式的可阅读文本文件。在第5章节结合OPENSSL实际生成的公私钥进行验证。
本文仅介绍了最简单也是最常见情况下的公私钥存储情况,不涉及加密保存的公私钥等场景。若需深入研究可继续阅读本文中罗列的RFC文档。

相关文章:

基于ASN.1的RSA算法公私钥存储格式解读

1.概述 RFC5958主要定义非对称密钥的封装语法,RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥,例如按照RSA算法,公钥是n和e,私钥是d和n。当需要将公私钥保存到文件时,需按照一定的格式保存。本文主要定义公私钥…...

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能:模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围:1.8V ~ 5…...

机器人非线性阻抗控制系统

机器人非线性控制系统本质上是一个复杂的控制系统,其状态变量和输出变量相对于输入变量的运动特性不能用线性关系来描述。这种系统的形成基于两类原因:一是被控系统中包含有不能忽略的非线性因素,二是为提高控制性能或简化控制系统结构而人为…...

pandas style添加表格边框,或是只添加下边框等自定义边框样式设置

添加表格边框 可以使用如下程序添加表格: import dataframe_image as dfi import pandas as pd import numpy as npdf pd.DataFrame(np.random.random(size(10, 5))) df_style df.style.set_properties(**{text-align: center,border-color: black,border-width…...

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

市面上关于终端(手机)操作系统在 3GPP 协议开发的内容太少了,即使 Android 相关的学习文档都很少,Android 协议开发书籍我是没有见过的。可能是市场需求的缘故吧,现在市场上还是前后端软件开发从业人员最多&#xff0c…...

windows部署腾讯tmagic-editor02-Runtime

创建editor项目 将上一教程中的hello-world复制过来,改名hello-editor 创建runtime项目 和hello-editor同级 pnpm create vite删除src/components/HelloWorld.vue 按钮需要用的ts types依赖 pnpm add tmagic/schema tmagic/stage实现runtime 将hello-editor中…...

“分块”算法的基本要素及 build() 函数的构建细节

【“分块”算法知识点】 ● 分块是用线段树的分区思想改良的暴力法。代码比线段树简单。效率比普通暴力法高。分块适合求解 m=n=10^5 规模的问题,或 m*sqrt(n)≈10^7 的问题。其中,n 为元素个数,m 为操作次数。 ● “分块”算法的基本要素 (1)块的大小用 block 表示。通常…...

畅捷通TPlus keyEdit.aspx、KeyInfoList.aspx SQL注入漏洞复现

前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、产…...

Ubuntu22 下配置 Qt5 环境

1. Qt 简介 Qt5 中的新功能,可以看到各个版本的情况Whats New in Qt 5 | Qt 5.15 Qt 源文件网址Index of /archive/qt 2. 安装 Qt Creator cd 到安装包所在目录,进行软件安装。赋予可执行权限,加上 sudo 权限进入安装,这样会安…...

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代,创业似乎成为了越来越多人的梦想。然而,传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程,让许多普通人望而却步。然而,现在有一种轻资产短视频带货项目正在悄然兴起,它以其低…...

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服: 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型: proxy代理仓库:代理远程仓库,访问全球中央仓库或其他公共仓库,将资源存储在私…...

winform嵌入excel 设置父窗体分辨率不是100% 嵌入excel分辨率变成双倍大小

在WinForms应用程序中嵌入Excel时,遇到分辨率问题可能是由于DPI缩放导致的。Windows 10及更高版本默认启用了DPI缩放,以便在高分辨率显示器上显示更清晰的内容。这可能会导致嵌入的应用程序(如Excel)看起来变大或变小。 解决方案 …...

前端系列-4 promise与async/await与fetch/axios使用方式

背景: 本文介绍promise使用方式,以及以Promise为基础的async/await用法和fetch/axios使用方式,主要以案例的方式进行。 1.promise 1.1 promise介绍 javascript是单线程执行的,异步编程的本质是事件机制和函数回调。当执行阻塞…...

微信公众号自定义分销商城小程序源码系统 带完整的安装代码吧以及系统部署搭建教程

系统概述 微信公众号自定义分销商城小程序源码系统是一款功能强大的电商解决方案,它集成了商品管理、订单处理、支付接口、分销管理等多种功能。该系统支持自定义界面设计,商家可根据自身需求调整商城的页面布局和风格,打造独特的品牌形象。…...

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是,登录弹框在另外一个页面中,而当前页面不存在,在当前页面中判断如果token不存在,就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录,则执行后续操作(注意此处,可不要)...

羊毛-百度Comate领50京东E卡

给你分享一个AI编码助手——百度Comate!扫码参与抽红包活动,520宠粉!送京东卡!https://comate.baidu.com/?inviteCodeyysudp63 流程如下 点击:https://comate.baidu.com/?inviteCodeyysudp63添加链接描述 验证码…...

kafka安装部署

kafka 官网下载: kafka https://downloads.apache.org/kafka/3.7.0/zookeeper https://downloads.apache.org/zookeeper/ run kafkazookeeper,conf目录下创建zoo.cfg,运行bin目录下的zkServer脚本文件 kafka eagle 参考:htt…...

VBA直连SAP RFC 接口实例

引用依赖: VBA 调用 SAP API的RFC函数:RFC_READ_TABLE Sub A() 查询SAP表数据并输出到EXCEL,VBA中不区分大小写(保存后会自动把代码、变量转换大小写)Dim iData As Integer Dim nField As Integer Dim nData As Intege…...

2024如何挑选开放式蓝牙耳机?热门爆款熬夜整理六个点!

我以前也经常使用入耳式耳机,但总是会感觉耳机插在耳朵里不舒服,戴久了耳朵很疼,跑步的时候还总掉。还有在过马路的时候接电话、听音乐,几乎感知不到周围环境音,很不安全。而有了一款开放式蓝牙耳机后,就可…...

3D数据格式转换工具HOOPS Exchange在PLM系统中的5大应用优势

在当今竞争激烈的制造业环境中,产品生命周期管理(PLM)系统已成为企业提升设计效率、缩短产品上市时间、降低成本和提高市场响应速度的关键工具。3D数据格式转换工具HOOPS Exchange,在PLM系统中扮演着至关重要的角色。以下是HOOPS …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...