从openssl rsa pem文件中提取公私钥数据实现

article/2025/10/11 10:39:14

RSA为非对称加密算法,关于其介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/43638013。

OpenSSL最新版为 1.1.1g,在Windows上和Linux上编译源码时均可以生成可执行文件openssl。通过此执行文件即可产生rsa公钥-私钥对,如产生长度为3072的密钥对,具体命令及执行结果如下图所示:3072是指modulus即模数长度为3072bit,即384字节。

LD_LIBRARY_PATH=../lib ./openssl genrsa -out rsa_private.pem 3072

rsa_private.pem中既包含了私钥信息也包含了公钥信息,从rsa_private.pem私钥中提取公钥命令如下:

LD_LIBRARY_PATH=../lib ./openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem

PEM格式与DER格式:PEM格式就是在DER格式基础上进行BASE64编码,然后添加一些头尾信息或标签组成的,用于说明当前的文件格式,是一种约定俗称,如头信息为” -----BEGIN RSA PRIVATE KEY-----”,尾信息为” -----END RSA PRIVATE KEY-----”,中间的数据部分即是对DER进行base64编码后的结果。

使用openssl asn1parse命令解析pem文件的结果如下所示:

在解析rsa_public.pem文件时没有显示出数据,其中BIT STRING的内容就是公钥PKCS#1格式的公钥数据,若显示数据,需要添加个偏移选项参数-strparse,在这里偏移值是19,添加后的执行结果如下:输出的数据与私钥文件中的n,e相同

PKCS即Public Key Cryptography Standards,公钥加密标准,一共有15个标准,编号从1到15。OpenSSL中RSA使用的是PKCS#1。PKCS#1定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。

通过以下命令可以把PEM格式转换成DER格式,执行结果如下:与上面结果相同

私钥(rsa_private.pem)包括:modulus(n), public exponent(e), private exponent(d), prime 1(p), prime 2(q), exponent 1(exp1), exponent 2(exp2) and coefficient(coeff)。公钥(rsa_public.pem)包括:modulus(n) and public exponent(e)。其中n、e、d会被直接用于加密、解密,其它几个用来校验。

下面用code实现从rsa_private.pem和rsa_public.pem中获取n, e, d等数据:

int test_openssl_parse_rsa_pem_private_key()
{
#ifdef _MSC_VERconst char* name = "E:/GitCode/OpenSSL_Test/testdata/rsa_private.pem";
#elseconst char* name = "testdata/rsa_private.pem";
#endifFILE *fp = fopen(name, "rb");if (!fp) {fprintf(stderr, "fail to open file: %s\n", name);return -1;}RSA* rsa = PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr);if (!rsa) {fprintf(stderr, "fail to PEM_read_bio_RSAPrivateKey\n");return -1;}fclose(fp);ASN1_INTEGER* n = BN_to_ASN1_INTEGER(RSA_get0_n(rsa), nullptr); // modulusASN1_INTEGER* e = BN_to_ASN1_INTEGER(RSA_get0_e(rsa), nullptr); // public exponentASN1_INTEGER* d = BN_to_ASN1_INTEGER(RSA_get0_d(rsa), nullptr); // private exponentASN1_INTEGER* p = BN_to_ASN1_INTEGER(RSA_get0_p(rsa), nullptr); // prime 1ASN1_INTEGER* q = BN_to_ASN1_INTEGER(RSA_get0_q(rsa), nullptr); // prime 2ASN1_INTEGER* dmp1 = BN_to_ASN1_INTEGER(RSA_get0_dmp1(rsa), nullptr); // exponent 1ASN1_INTEGER* dmq1 = BN_to_ASN1_INTEGER(RSA_get0_dmq1(rsa), nullptr); // exponent 2ASN1_INTEGER* iqmp = BN_to_ASN1_INTEGER(RSA_get0_iqmp(rsa), nullptr); // coefficientif (!n || !e || !d || !p || !q || !dmp1 || !dmq1 || !iqmp) {fprintf(stderr, "fail to BN_to_ASN1_INTEGER\n");return -1;}print(n, "n");print(e, "e");print(d, "d");print(p, "p");print(q, "q");print(dmp1, "exp1");print(dmq1, "exp2");print(iqmp, "coeff");ASN1_INTEGER_free(n);ASN1_INTEGER_free(e);ASN1_INTEGER_free(d);ASN1_INTEGER_free(p);ASN1_INTEGER_free(q);ASN1_INTEGER_free(dmp1);ASN1_INTEGER_free(dmq1);ASN1_INTEGER_free(iqmp);RSA_free(rsa);return 0;
}

以上code是用于从rsa_private.pem私钥中提取n,e,d等数据的实现,主要使用的是PEM_read_RSAPrivateKey函数,执行结果如下,与通过命令上获取到的数据相同:

int test_openssl_parse_rsa_pem_public_key()
{
#ifdef _MSC_VERconst char* name = "E:/GitCode/OpenSSL_Test/testdata/rsa_public.pem";
#elseconst char* name = "testdata/rsa_public.pem";
#endifFILE *fp = fopen(name, "rb");if (!fp) {fprintf(stderr, "fail to open file: %s\n", name);return -1;}// use PEM_read_RSA_PUBKEY instead of PEM_read_RSAPublicKey// https://stackoverflow.com/questions/7818117/why-i-cant-read-openssl-generated-rsa-pub-key-with-pem-read-rsapublickey// https://stackoverflow.com/questions/18039401/how-can-i-transform-between-the-two-styles-of-public-key-format-one-begin-rsa/29707204#29707204RSA* rsa = PEM_read_RSA_PUBKEY(fp, nullptr, nullptr, nullptr);if (!rsa) {fprintf(stderr, "fail to PEM_read_bio_RSAPublicKey\n");return -1;}fclose(fp);ASN1_INTEGER* n = BN_to_ASN1_INTEGER(RSA_get0_n(rsa), nullptr); // modulusASN1_INTEGER* e = BN_to_ASN1_INTEGER(RSA_get0_e(rsa), nullptr); // public exponentif (!n || !e) {fprintf(stderr, "fail to BN_to_ASN1_INTEGER\n");return -1;}print(n, "n");print(e, "e");ASN1_INTEGER_free(n);ASN1_INTEGER_free(e);RSA_free(rsa);return 0;
}

以上code是从rsa_public.pem公钥中提取n,e数据的实现,注意这里用到的函数是PEM_read_RSA_PUBKEY而不是PEM_read_RSAPublicKey,执行结果如下,与从私钥中提取的n,e数据相同:

以上代码段的完整code见:GitHub/OpenSSL_Test

GitHub:https://github.com/fengbingchun/OpenSSL_Test


http://chatgpt.dhexx.cn/article/HGFFYQVL.shtml

相关文章

搞懂 PEM、ANS、PFX、P12、p8、CER、X509 等证书相关文件格式 后缀

文章目录 结论ASN.1PEM.pfx介绍应用 .p12.p8.cer.crtX.509参考 http证书相关的文件格式、编码、概念比较偏多。这里对文件的各种文件后缀和格式做了统一的整理和解释说明 我在国密实验室申请下载了一个证书,解压后如下图,起初我是比较懵的,各…

vs2017下载

1.官网下载 由于网络日益发达,我相信大家可以从各种渠道得到下载地址,vs2017已与之前版本不同的是已经采用了下载器下载,下面是我使用的下载地址 Visual Studio 较旧的下载 - 2017、2015 和以前的版本 进入登录即可获得下载地址&#xff0c…

Visual Studio 2015官方社区版/专业版/专业版下载地址

Visual Studio 2015官方社区版/专业版/专业版下载地址 以下 Visual Studio 2015 社区版/专业版/专业版资源都是官方MSDN原版下载资源,统一为ISO格式镜像,使用解压软件解压之后点击主程序安装即可。 Visual Studio 2015 官方简体中文专业版ISO镜像下载地址…

vs2017支持所有版本VC

版权归属: https://blog.csdn.net/halchanchanhaloutlook.com 更多关注: https://github.com/chanhalhttps://www.zhihu.com/people/chanhal 前言 研究目标:VS2017作为目前最新的IDE,让其支持所有版本的VC编译环境 必要性&am…

VS2017社区版Community 许可证过期解决方法

之前过期可以登录自己的github账号再认证一下就OK了,但是这次就是登录不上会有脚本错误的弹窗,搜到一个方法亲测有效,也非常简单,找一个同等开发环境,把对应路径下的许可证文件夹拷贝放到自己的文件夹下即可。 感谢各…

下载安装Visual Studio 2017 Community 来编译NIM_PC_DEMO

1、下载vs2017的引导程序 官方并没有为vs2017提供离线安装包,所以我们选择在线安装。 首先我们下载vs2017的引导程序:Visual Studio 2017安装包 包含如下4个文件: vs_Community.exe: 社区版,免费。但是需要登录微软…

Visual Studio 2019社区版许可

Visual Studio 2019社区版许可 #VS2019版本介绍 Visual Studio Community:社区版 Visual Studio Professional:专业版 Visual Studio Enterprise:企业版 Community:社区版,30天试用之后必须要登录才能使用 社区版是无…

Visual Studio 2017 version 15.9 官方最新版本下载(含那个啥码)

Visual Studio 2017 version 15.9 官方最新版本下载 (含那个啥码) 简单介绍,VS2017有3个版本: ①community,社区版,含基本的开发功能,免费!免费!免费! ②professional,专业版,社区版的加强版&a…

【官方解说】Visual Studio 2017(VS 2017)各个版本有什么区别

细致区别如上图所示 企业版点满图中技能树,能够提供点对点的解决方案,充分满足正规企业的要求。 PS:技能最多,肯定也就价格最贵 专业版中提供的专业开发者工具、服务和订阅就成了最佳选择。 PS:技能多,价…

VS2017和VS2019(社区版)离线激活方式

一、VS2017激活 1.首先在能联网的电脑上安装VS2017社区版,完成注册后将路径下的OnlineLicensing文件拷贝至离线电脑的对应路径即可,路径:C:\Users\**\AppData\Local\Microsoft\VSCommon 二、VS2019激活 1.与上面一样先在电脑上注册&#x…

vs2019社区版下载教程(详细)

文章目录 1.下载VS 2019 Community引导程序2.安装VS 2019 1.下载VS 2019 Community引导程序 VS2019下载地址和安装教程(图解) 继 VS2015 和 VS2017 之后,微软于 2019 年 4 月 3 日发布了新版的集成开发环境——VS2019。 和 VS2017 相比&…

VS2017社区版离线安装

VS2017社区版离线安装 目前微软官网提供Visual Studio 2017在线安装版本,对于离线安装只提供说明。 Visual Studio 2017官网提供四个版本,这里个人学习,所以选择社区版的,下面说的也是社区版的安装步骤。 一、离线下载器下载 在…

Visual studio 2019 社区版下载和安装

Visual studio 分 企业版 ,专业版和 社区版,其中社区版是供开发人员免费使用的,且功能齐全,这里使用Visual Studio 2019 社区版来安装。 1. 下载 vs_community__2019百度网盘下载链接(这个是我从微软官网上下载的&…

VS2017下载 vs2017社区版

找到DDConfigCA.exe,管理员身份运行一下, 就可以了,亲测有效 可能现在大伙都已经开始使用VS2019进行开发了。VS2019的下载使用也都很简单。由于工作需要,今天要在笔记本上安装VS2017,结果发现,VS2017的下载变得不是那么容易了&am…

IDE/VS2017社区版安装+Qt部署+旧项目迁移

文章目录 概述安装包获取卸载旧版本安装过程首次使用Qt插件配置和使用插件配置Qt项目创建向导 VS2015项目迁移到VS2017 概述 这几天想开始使用glog这个开源日志库,发现其已经在很大程度上使用C14标准了,而VS2015并不能完全支持该标准。根据一些教程试图…

Windows10上安装VS2017社区版操作步骤

Windows10上已安装vs2013,在编译MXNet时用到了一些C14的特性,vs2013是不支持的,因此在已装有vs2013的机子上再装vs2017社区版。vs2017社区版是免费的,操作步骤如下: 1. 从 https://docs.microsoft.com/en-us/visuals…

VS2017社区版+PCL1.9.1配置

Visual Studio 2017 Community 百度搜索,登录微软官网,下载Visual Studio 2017 Community版本安装包,运行引导文件,选择需要安装的组件,一步步运行安装。 推荐安装的组件如下: 工作负载 Windows&#xff0…

Visual Studio Community 2017安装步骤(只装C++)

1、下载vs2017的引导程序 官方并没有为vs2017提供离线安装包,所以我们选择在线安装。 首先我们下载vs2017的引导程序:http://xz.cncrk.com:8080/soft/keygen/visual studio 2017.rar 包含如下4个文件: vs_Community.exe:社区版…

.Net 日志系统-NLog

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。 NLog虽然没有log4net框架的流行程度高,但是它的跨平台性、开源持续维护性、性能等方面优于log4net,具体可以看下面这篇文章: 日志…

日志Nlog

在性能代码性能优化的时候,马丹妹给予指导时,用了日志测试时间这个技术,很是吸引人,而且她也写了系列博客,看了师姐的博客后实践,然后写一篇简单的博客。 师姐系列博客地址:http://blog.csdn.n…