近期在写c语言的加密库,但是遇到了rsa算法中寻找modulus这个棘手的问题,大多是依赖openssl来解决,于是分析下怎么从pem格式的rsa公钥提取出来模数和指数。
⊙1.生成rsa的公私钥
⊙ 2.base64解码
⊙ 3.der编码
⊙ 4.结构分析
⊙总结
1.生成rsa的公私钥
网站:http://web.chacuo.net/netrsakeypair
2.base64解码
注意公钥去解码的去除开头的-----BEGIN PUBLIC KEY-----,和结尾的-----END PUBLIC KEY-----,同时解码完成的时候转为hex,方便进一步的分析
同时保存文件方便分析。
3.der解码
如果要解析这个二进制数据,那么要了解这个二进制编码的原理。
der编码使用的是tlv编码格式,即tag,length,value的模式对数据进行描述。
更多详细的信息请参考:https://docs.microsoft.com/zh-cn/windows/win32/seccertenroll/about-encoded-tag-bytes?redirectedfrom=MSDN,笔者不再赘述。
需要知道的是 tlv结构是tag,length,value
在表示长度的需要注意:
length分两种情况,短模式和长模式什么意思呢?
length跟在tag后面,然后tag后面的第一个字节的最高位为1的情况下为长模式,最高位为0的情况下为短模式。
长模式:tag后面的一个字节的低七位表示后面有几个字节表示长度。
短模式:tag后面的第一个字节为表示tag内容的长度。
举个例子:
0x91 二进制表示为 1001 0001:最高位为1 为长模式 也就是说后面 有。0x11 =17个字节表示长度,把17个字节表示的数据读出来就是长度
0x0d二进制表示为 0000 1101 :最高位为0,表示的是短模式,tag所表示的内容为0xd=13个字节的长度。
4.结构分析
30---> SEQUENCE (tag)
81 9f --->长模式, 数据长度由 9f 表示,即159bytes(length)
30 ---> SEQUENCE (tag)
0d ---> 短模式,长度为0x0d个字节,即13bytes (length)
06 OBJECT IDENTIFIER (tag)
09---> 短模式,长度为0x09个字节,即9bytes (length)
2a 86 48 86 f7 0d 01 01 01 (9字节的数据内容)
05 NULL (tag)
00 短模式,长度为0x00字节(length)
03 BIT STRING (tag)
81 8d ---> 长模式, 数据长度由 8d 表示,即141bytes(length)
00 本数据最后一个字节没有无效位,即全部有效。
30 SEQUENCE (tag)
81 89 长模式, 数据长度由 89 表示,即137bytes(length)
02---> INTEGER 表示一个整数 (tag) 在这个里面是模数
81 81 长模式, 数据长度由 81 表示,即129bytes(length)
81 81 00 93 a7 80 56 e4 0c aa 91 4b 46 41 65 63 a4 b2 80 90 c3 fe d2 8f 01 b5 77 2d ed ca ca e8 e3 7b 0b cf 20 2b 38 12 82 0d 16 2d 60 54 1a 1a 97 d0 d2 cd 70 8e 2f 6d b7 45 83 ec 7e e3 f8 05 4d 2b a2 7c 28 dc 95 1e 05 e2 a9 48 31 ad 97 f1 60 99 cf 4f 69 19 07 20 43 d7 1d ed 15 27 2d 6f 49 e9 fe 4c e7 7f 6e 59 9a 47 6b cb 60 23 98 32 37 11 a8 83 ee 30 e7 a7 10 63 f6 ec ca 3d 99 91 43 ee d5
02 ---> INTEGER 表示一个整数 (tag)
03 ---> 短模式,长度为0x03个字节,即3bytes (length)
01 00 01 ---> 整型数,此处为指数,exponents (value)
根据上面的就可以找出来rsa公钥的模数和指数。
最后,rsa的c库也可以正常运行了,完结 撒花。
了解二进制逆向知识可以关注我:
了解scrapy和一些爬虫知识可以关注我朋友:
我是BestToYou,分享工作或日常学习中关于二进制逆向和分析的一些思路和一些自己闲暇时刻调试的一些程序,文中若有错误的地方,恳请大家联系我批评指正。
原文始发于微信公众号(二进制科学):从PKCS#1格式RSA公钥提取模数(modulus)和指数(exponent)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论