关于Python RSA简陋随笔(rsa,ezPyCrypto, M2Crypto)。

最近要跟公司的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 编码。

# -*- encoding: UTF-8 -*-
import M2Crypto as m2c

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

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

# and now decrypt it:
decrypted = key.private_decrypt(encrypted, m2c.RSA.pkcs1_padding)
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算法的浅析。

你可能感兴趣的:(html,算法,python)