python的加密解密教程_自学php网
来源:自学PHP网
时间:2014-12-04 21:50 作者:
阅读:次
[导读] 最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,相对于php而言python这块组件相对于较多的,分别是: python-crypto - 这个组件是基本组件,使...
最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,相对于php而言python这块组件相对于较多的,分别是:
python-crypto - 这个组件是基本组件,使用的函式相对比较复杂。
ezPyCrypto - 相对简单,但他作出來的公私钥无法与其他程式相兼容。
SSLCrypto - 与 ezPyCrypto 是相同一个作者开发,效率上要比ezPyCrypto 好。
但一样不能与其它程序相兼容。
pyopenssl - 似乎是用在https 通讯上的,而我找不到加解密的用法。
M2Crypto - 终于让我找到了,但它有一大缺點,它底层是用 SWIG 与 OpenSSL 交接的。
在Windows安装SWIG 程序是非常难裝的。
我选择使用的是M2Crypto,公钥与私钥证书生成有两个方式,一种采用RSA生成,另一种是X509生成。
一、 RSA方式生成的证书
1.加密解密、加密签名、验证加密签名
#encoding: utf8
import os
import M2Crypto
#随机数生成器(1024位随机)
M2Crypto.Rand.rand_seed(os.urandom(1024))
#生成一个1024位公钥与私密钥证书
Geekso = M2Crypto.RSA.gen_key(1024, 65537)
Geekso.save_key('Geekso-private.pem', None)
Geekso.save_pub_key('Geekso-public.pem')
#使用公钥证书加密开始
WriteRSA = M2Crypto.RSA.load_pub_key('Geekso-public.pem')
CipherText = WriteRSA.public_encrypt("这是一个秘密消息,只能用私钥进行解密",M2Crypto.RSA.pkcs1_oaep_padding)
print "加密的串是:"
print CipherText.encode('base64')
#对加密串进行签名
MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
MsgDigest.update(CipherText)
#提示,这里也可以使用私钥签名
#WriteRSA = M2Crypto.RSA.load_key ('Geekso-private.pem')
#Signature = WriteRSA.sign_rsassa_pss(MsgDigest.digest())
Signature = Geekso.sign_rsassa_pss(MsgDigest.digest())
print "签名的串是:"
print Signature.encode('base64')
#使用私钥证书解密开始
ReadRSA = M2Crypto.RSA.load_key ('Geekso-private.pem')
try:
PlainText = ReadRSA.private_decrypt (CipherText, M2Crypto.RSA.pkcs1_oaep_padding)
except:
print "解密错误"
PlainText = ""
if PlainText :
print "解密出来的串是:"
print PlainText
# 验证加密串的签名
MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
MsgDigest.update(CipherText)
#提示,如果是用私钥签名的那就用公钥验证
#VerifyRSA = M2Crypto.RSA.load_pub_key('Alice-public.pem')
#VerifyRSA.verify_rsassa_pss(MsgDigest.digest(), Signature)
if Geekso.verify_rsassa_pss(MsgDigest.digest(), Signature) == 1:
print "签名正确"
else:
print "签名不正确"
2.字符串生成签名、验证签名
#用私钥签名
SignEVP = M2Crypto.EVP.load_key('Geekso-private.pem')
SignEVP.sign_init()
SignEVP.sign_update('来自这一客(http://www.geekso.com)的签名串')
StringSignature = SignEVP.sign_final()
print "签名串是:"
print StringSignature.encode('base64')
#用公钥验证签名
PubKey = M2Crypto.RSA.load_pub_key('Geekso-public.pem')
VerifyEVP = M2Crypto.EVP.PKey()
VerifyEVP.assign_rsa(PubKey)
VerifyEVP.verify_init()
VerifyEVP.verify_update('来自这一客(http://www.geekso.com)的签名串')
if VerifyEVP.verify_final(StringSignature) == 1:
print "字符串被成功验证。"
else:
print "字符串验证失败!" |
|