当前位置: 首页 > 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 …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

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 如果用户登录尝试失败次…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...