前几天领导找我要一个base64编码的RSA密钥(之前某个项目的),即pkcs#1或pkcs#8密钥格式,解析密钥格式的der编码后,发现需要 e n d p q dQ dp invQ 共八个参数,而我只有 e n d 三个参数,一下子有点束手无策,今天突发奇想,之前在python应用rsa密码算法时,我不也只给了 e n d 就能计算么,是否就说明我遗漏了解题的重要部分,于是,随着这一灵感进行摸索,最终我实现了领导的需求。
前几天领导找我要一个base64编码的RSA密钥(之前某个项目的),即pkcs#1或pkcs#8密钥格式,解析密钥格式的der编码后,发现需要 e n d p q dQ dp invQ 共八个参数,而我只有 e n d 三个参数,一下子有点束手无策,今天突发奇想,之前在python应用rsa密码算法时,我不也只给了 e n d 就能计算么,是否就说明我遗漏了解题的重要部分,于是,随着这一灵感进行摸索,最终我实现了领导的需求。
准备RSA密钥对
利用网站工具生成 RSA 密钥对,http://web.chacuo.net/netrsakeypair
解析 pkcs#8 得到 e n d p q u dp dq qp u
根据 e n d 生成 p q u
依赖 pycrypto 库
输出结果
总结
(1)通过该接口生成 p q 后(原理后续再研究),再通过两个公式即可生成 dp dq,这样一来,就可以实现仅有 e d n 的情况下,组装为 pkcs#8 格式的key文件了。
(2)我是属于误打误撞实现的,在撰写该文章的过程中,在谷歌搜索 rsa dp dq 发现一个名为《Key Recovery Method for CRT Implementation of RSA》的pdf文档,在里面看到计算 dp dq 的公式,这才解决了最终的转pkcs#8的问题,说明我在遇到问题的时候没有先整理头绪的习惯,这样不好,会浪费时间,因为我能遇到的问题基本都已有前辈遇到甚至解决,在密码学中,我遇到的问题其实是涉及了密钥恢复的研究,之所以叫恢复而不是攻击,是根据我是否拥有私钥为准,没有私钥,那就是密钥攻击。