免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3288 | 回复: 0
打印 上一主题 下一主题

关于Python RSA简陋随笔(rsa,ezPyCrypto, M2Crypto) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-10 14:04 |只看该作者 |倒序浏览
最近要跟公司的OAuth对接,所以简单地了解了一下RSA的相关模块用法。

rsa:
内置文档(rsa.__doc__)上明确说,这是教学用的模块。并不实用于生产环境。

ezPyCrypto:
官方网站:http://www.freenet.org.nz/ezPyCrypto/detail/index.html
基于pycrypto。
文档对于导入key没有太多的说明,直接看源码后,我悲剧的发现ezPyCrypto的importKey() 似乎是使用了它自己定义的格式。也就是说,如果你的key不是由ezPyCrypto的exportKey()得到的,那么你会在各种转换上花费很大的力气。

M2Crypto:
官网(http://chandlerproject.org/Projects/MeTooCrypto)无法访问。
源码来源,http://pypi.python.org/pypi/M2Crypto,在snow leopard上无法直接编译。
最后使用Macport安装。

使用M2Crypto.RSA.load_key()来生成M2Crypto.RSA.RSA的实例,注意,key pair其实就是私钥(private key),PEM格式(openssl默认输出格式)。
如果你只需要加密,可以考虑用load_pub_key,单独读入公钥(public key)。

加密数据需要通过某种编码变成单字节的数组。下面的例子使用了UTF-8 编码。
  1. # -*- encoding: UTF-8 -*-
  2. import M2Crypto as m2c

  3. key = m2c.RSA.load_key('key1/id_rsa')

  4. # encrypt something:
  5. data = u'Mochi 麻球'.encode('UTF-8')
  6. encrypted = key.public_encrypt(data, m2c.RSA.pkcs1_padding)

  7. # and now decrypt it:
  8. decrypted = key.private_decrypt(encrypted, m2c.RSA.pkcs1_padding)
  9. print data == decrypted
复制代码
注意  RSA.sign(self, digest, algo='sha1') 这个方法,虽然在最后的参数指定了hash方法,但是其实需要先在外面自行获得digest。

代码里面有一个padding参数,如果你对此感兴趣,可以参考:
http://tools.ietf.org/html/rfc3447

PKCS #1有两种padding的定义,我个人的理解RSA.pkcs1_padding对应是下面的一节:
http://tools.ietf.org/html/rfc3447#section-7.2.1

如果你不高兴看这些细节,只要记得编码和解码的时候,使用的参数一致即可。

See also:
http://www.amk.ca/python/code/crypto

里面提到一个yawPyCrypto,似乎不错。

有点简陋,这是在上班时候的边做边写的。计划在不忙的时候写一个rsa算法的浅析。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP