在爬虫分析的时候,经常在网页上看到如下格式的rsa公钥:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21TAIfT/vexbobzH7Q8SUdP5uDPXEBKzOjx2L28y7Xs1d9v3tdPfKI2LR7PAzWBmDMn8riHrDDNpUpJnlAGUqJG9ooPn8j7YNpcxCa1iybOlc2kEhmJn5uwoanQq+CA6agNkqly2H4j6wIDAQAB

对于rsa算法的公钥,我们了解到,主要有两个信息:模数(modulus)和指数(exponent)

只有有这两个信息,我们便可以用以下代码段生成公钥,然后使用rsa库对数据进行加密

import rsa

key = rsa.PublicKey(modulus, exponent)
print key

现在我们需要做的就是从这段字符串中提出模数和指数.

在研究的过程中,除了这种字符串的形式,我们看得最多的应该属于public.pem、private.pem这种文件格式的公钥私钥了.

那么PEM这又是个什么格式呢,搜索下来,基本上都说包含什么信息然后是数据什么的,我怎么知道那些是信息,那些是数据呢?

对比一些资料,觉得看下图基本明了(本来是有一篇很好的文章,貌似找不到链接了,只保存了一张图片)

我们打开pem格式的文件看一下,发现

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAPVZR7eov/GFh77lx2sp1FDkP63mygPAUkomwV9fPFUuajviO5038P3k
Jhl5o14+LN8NxLuyiTzgYKSunUkvqxwkWSKHOw8EL3m6YKytk5UR+FEg8LBqPNox
lcT9a9VH2PngbnR9WWm2ycMQBppQRC3Ci7yLIcjwgDUOrgoz6PmpAgMBAAE=
-----END RSA PUBLIC KEY-----

这个BEGIN和这个END中间这一段很像我们找到的这个字符串,我们把开头的字符串复制到public.pem文件的中间,然后使用以下代码加密试试:

import rsa

with open('public.pem','r') as f:
pubkey = rsa.PublicKey.load_pkcs1(f.read().encode()) message = 'cnblogs'
crypto = rsa.encrypt(message.encode(), pubkey)
print crypto

这段似乎根本就会报错,而且,这个复制过去的格式也不对,原先的是有换行的,

查询一下似乎换行也是一种信息,而我们的字符串从哪里换行根本无从得知

那么,这个字符串和pem就没有别的联系了吗?答案是有的.

之前就有猜测这个字符串可能是base64加密过的,那么我就解密看看:

import base64

pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21TAIfT/vexbobzH7Q8SUdP5uDPXEBKzOjx2L28y7Xs1d9v3tdPfKI2LR7PAzWBmDMn8riHrDDNpUpJnlAGUqJG9ooPn8j7YNpcxCa1iybOlc2kEhmJn5uwoanQq+CA6agNkqly2H4j6wIDAQAB"

b64_str = base64.b64decode(pubkey)

print b64_str
print len(b64_str)

得到一串乱码,我们把这串乱码转换成16进制

发现结尾是"\x01\x00\x01",10001,看多了rsa的公钥,就知道这个数,多半是exponent了.

再看看解码后的长度,162,我们找到偏移表,发现模数的偏移位置是159,长度是3,加起来正好162

那么说明这段字符串就是指数和模数加密过后的结果,甚至比一般的pem文件中的信息还要简单

按照这个思路,对照偏移表我们找出指数和模数:

# /usr/bin/python
# encoding: utf-8 import base64 def str2key(s):
# 对字符串解码
b_str = base64.b64decode(s) if len(b_str) < 162:
return False hex_str = '' # 按位转换成16进制
for x in b_str:
h = hex(ord(x))[2:]
h = h.rjust(2, '')
hex_str += h # 找到模数和指数的开头结束位置
m_start = 29 * 2
e_start = 159 * 2
m_len = 128 * 2
e_len = 3 * 2 modulus = hex_str[m_start:m_start + m_len]
exponent = hex_str[e_start:e_start + e_len] return modulus,exponent if __name__ == "__main__": pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21TAIfT/vexbobzH7Q8SUdP5uDPXEBKzOjx2L28y7Xs1d9v3tdPfKI2LR7PAzWBmDMn8riHrDDNpUpJnlAGUqJG9ooPn8j7YNpcxCa1iybOlc2kEhmJn5uwoanQq+CA6agNkqly2H4j6wIDAQAB"
key = str2key(pubkey)
print key

得到结果如下:

('c2ee4c3cafab6ae37a7002962f909e656a58da37d0596f6d530087d3fef7b16e86f31fb43c49474fe6e0cf5c404acce8f1d8bdbccbb5ecd5df6fded74f7ca2362d1ecf033581983327f2b887ac30cda54a499e500652a246f68a0f9fc8fb60da5cc426b58b26ce95cda41219899f9bb0a1a9d0abe080e9a80d92a972d87e23eb', '')

现在我们用刚才得到的key来加密字符串:

    import rsa

    message = 'cnblogs'
modulus = int(key[0], 16)
exponent = int(key[1], 16)
rsa_pubkey = rsa.PublicKey(modulus, exponent)
crypto = rsa.encrypt(message, rsa_pubkey)
b64str = base64.b64encode(crypto)
print b64str

就可以得到一个rsa加密,base64编码过的字符串了.

总结一下:主要就是在一串字符串中,对照一个偏移表,提取需要的位置上的数字.

rsa字符串格式公钥转换python rsa库可识别的公钥形式的更多相关文章

  1. Python字符串格式转换

    转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...

  2. Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

    Openssl生成RSA公私钥以及将公钥转换成C#支持的格式 1.RSA算法介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密.RSA ...

  3. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  4. C#和JAVA的RSA密钥、公钥转换

    C#的秘钥跟JAVA的密钥区别   RSA对于程序本身是没有区别的,其格式都是相同的.对于不同的程序来说,存储使用的语法(包装的类)会有所不同. RSA语法和语法标准有很多,大的类型大概分为ASN.1 ...

  5. JAVA,NET RSA密钥格式转换

    JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...

  6. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  7. .NET与JAVA RSA密钥格式转换

    一.该篇内容用于记录.net和Java之间,RSA公密钥的转换 using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; ...

  8. python RSA加密、解密、签名

    python RSA加密.解密.签名 python中用于RSA加解密的库有好久个,本文主要讲解rsa.M2Crypto.Crypto这三个库对于RSA加密.解密.签名.验签的知识点. 知识基础 加密是 ...

  9. (转)Python rsa 签名与验证 sign and verify

    转自:http://wawehi.blog.163.com/blog/static/143780306201371361120515/ 网上一搜一大把的 python rsa 相关的东西,python ...

随机推荐

  1. C++中的深拷贝和浅拷贝 QT中的深拷贝,浅拷贝和隐式共享

    下面是C++中定义的深,浅拷贝 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会 ...

  2. https hsts 私密链接

    chrome强制转跳https,删除对某个域名的强制转跳即可 hrome的地址栏输入:chrome://net-internals/#hsts   在Delete domain下输入相对应的网址,不带 ...

  3. jQuary总结1:jQuary的优点和地位

    1 什么是jQuery? jQuery是一个快速,小巧,功能丰富的JavaScript库. javascript库: 就是存放javascript代码的仓库 jQuery作为一个迭代多年的优秀框架,是 ...

  4. css3的那些高级选择器二

    在上个星期我介绍了css3的属性选择器,伪类选择器和结构伪类选择器,今天楼主继续把其它的css3选择器说完. 在css3中,共有11中UI状态伪类选择器,分别是E:hover,E:active,E:f ...

  5. 暂停、恢复CALayer 动画

    CALayer都是实现了CAMediaTiming协议(或者叫做接口).所以layer的动画有一个很有意思的属性speed.如果一个layer的动画速度变成0.0的时候,很显然这个动画就不再动了.设置 ...

  6. CVPR,ICCV和ECCV,计算机视觉三大顶级盛会

    简介:https://blog.csdn.net/hualitlc/article/details/11099693 近几年ICCV,CVPR,和ECCV论文列表:https://www.xuebuy ...

  7. 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常

    建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...

  8. [LeetCode 题解]:Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  9. Transaction And Lock--已提交读快照

    --===================================================== --行版本控制已提交读ALTER DATABASE DB5 SET READ_COMMI ...

  10. C#多线程编程实战1.1创建线程

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...