网站地图    收藏   

主页 > 后端 > PHP语言 >

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 "字符串验证失败!"

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论