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
领取专属 10元无门槛券
私享最新 技术干货