首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RSA密钥格式解析&转换

RSA密钥格式解析&转换

在开发或者逆向的分析过程当中,我们经常会用到RSA来进行加解密或者说签名的操作,然后和普通的对称加密的密钥不同的是,对于RSA来说,我们一般会需要用到两个密钥,一个是公钥,一个是私钥,然后对于这个密钥,相信大家可能见到过不止一种格式。

RSA密钥的组成

我们知道对于RSA来说,最终的密钥可以分成三个部分,分别为。具体的RSA算法的原理在这里就不过多介绍了,有兴趣的读者可以查阅下相关资料或者说看下我之前写过的文章。

利用openssl生成一个RSA公钥

我们可以先借助工具生成一个常见的密钥,然后来看一下这个密钥的样子。

生成私钥

得到结果如下:

导出公钥

得到结果如下:

这样,我们就得到了一个格式的RSA公钥。

RSA公钥格式分析

相信,如果说试用过RSA的读者,应该对上面的密钥格式不陌生,应该或多或少是见过这种形式的密钥的,我们刚才也说了,RSA的密钥实际上是分为三部分的,那么如何从上面的东西里面提取出来我们需要的东西呢,我们先来看公钥的格式。

我们可以将上面格式的公钥转换为格式的公钥。

我们最终得到了一个的文件,我们用来查看下内容。

这个是如何做转换的呢,我们可以先把上面那一段公钥的base64解码一下,然后做一次hex编码,这里根据上一篇文章的投票结果,这里就用来处理一下吧。

上次投票结果

这里直接用来实现了,如果有兴趣研究base64算法怎么写的以及原理,可以去看下我之前写的文章,或者去查阅下有关rfc,之后得到的结果如下:

我们发现,解码之后和编码之后的结果是一样的,因此这俩实际上是一个东西,用Base64应该只是为了窗户方便,因为我们可以很明显的看到,转换成的结果里面是有的,这也说明如果按照这个来从网络当中传输,如果按照字符串的形式解析会发生截断。

ANS.1

那么接下来,我们就来看一下这个二进制数据的具体的含义。首先,这个就要用到一个新的知识点ANS.1,有关这个具体的作用呢,其实就是用来描述一段二进制数据的具体的结构信息的,这个我们可以理解为一个KV对儿,在RSA的格式的公钥的定义如下:

具体内容可以参考下,简单来说,对于上面那个格式,我们可以这么区分下,如下图所示:

DER格式的RSA公钥文件格式

从这里,我们可以得出对于这一个公钥的具体内容如下:

到这里,我们就从公钥当中提取出了我们需要的部分。

接下来呢,我们来看一下私钥的格式,采用如下的方式转换成der格式的私钥。

这里读者可以自行用打开看一下,这里我就不打开了,直接看一张图吧,对应的内容如下。

DER格式下的RSA私钥格式

具体对应的ASN.1格式如下:

详细内容可以参阅文末参考资料当中的。

PKCS#8形式的私钥结构

上面我们说了PKCS#1格式的RSA公钥和私钥,其实PKCS#1是RSA的密钥的专属格式,因为根据ANS.1的定义,我们可以知道这些参数都是RSA所独有的,然后下面我们要说的这个格式PKCS#8是一个通用的密钥格式。

具体的内容可以查阅。

密钥格式转换

密钥生成(PKCS#1)

这里默认通过openssl生成的是PKCS#1的密钥,在文章的开头已经说过了,具体命令如下:

得到结果如下:

RSA公钥提取

PKCS#1

得到的结果如下:

PKCS#8

得到结果如下:

RSA公钥格式转换(PKCS#8PKCS#1)

得到结果如下:

RSA公钥格式转换(PKCS#1PKCS#8)

得到的结果如下:

RSA私钥格式转换(PKCS#8PKCS#1)

得到结果如下:

RSA私钥格式转换(PKCS#1PKCS#8)

得到结果如下:

查看公钥、私钥

得到结果如下:

总结

本文主要针对RSA当中常见的密钥格式进行了讲解,文末给出了各种密钥之间的转换关系的方式。

参考资料

https://mp.weixin.qq.com/s/2E1QqheZ-8CC7RdBpQda6A

https://www.rfc-editor.org/rfc/rfc8017

https://www.rfc-editor.org/rfc/rfc5208

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230225A00SMP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券