欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python有證書(shū)的加密解密實(shí)現(xiàn)方法

系統(tǒng) 1681 0

本文實(shí)例講述了python有證書(shū)的加密解密實(shí)現(xiàn)方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

最近在做python的加解密工作,同時(shí)加完密的串能在php上能解出來(lái),網(wǎng)上也找了一些靠譜的資料,剛好也有時(shí)間我就總結(jié)了一下python在加密與解密這塊的代碼,今后可能還能用的上。相對(duì)于php而言python這塊加解密組件較多的,分別是:

python-crypto - 這個(gè)組件是基本組件,使用的函式相對(duì)比較復(fù)雜。
ezPyCrypto - 相對(duì)簡(jiǎn)單,但他作出來(lái)的公私鑰無(wú)法與其他程序相兼容???? SSLCrypto - 與 ezPyCrypto 是相同一個(gè)作者開(kāi)發(fā),效率上要比ezPyCrypto 好。但一樣不能與其它程序相兼容。
pyopenssl - 似乎是用在https 通訊上的,而我找不到加解密的用法。
M2Crypto - 終于讓我找到了,但它有一大缺點(diǎn),它底層是用 SWIG 與 OpenSSL 交接的。
在Windows安裝SWIG 程序是非常難的。

我選擇使用的是M2Crypto,公鑰與私鑰證書(shū)生成有兩個(gè)方式,一種采用RSA生成,另一種是X509生成。我就把這兩種加解密代碼分享出來(lái),供大家參考,但轉(zhuǎn)載或使用時(shí)請(qǐng)寫(xiě)明出處。

一、 RSA標(biāo)準(zhǔn)方式生成的證書(shū)

1.加密解密、加密簽名、驗(yàn)證加密簽名

復(fù)制代碼 代碼如下:
#encoding: utf8
import os
import M2Crypto
#隨機(jī)數(shù)生成器(1024位隨機(jī))
M2Crypto.Rand.rand_seed(os.urandom(1024))
#生成一個(gè)1024位公鑰與私密鑰證書(shū)
Geekso = M2Crypto.RSA.gen_key(1024, 65537)
Geekso.save_key('jb51.net-private.pem', None)
Geekso.save_pub_key('jb51.net-public.pem')
#使用公鑰證書(shū)加密開(kāi)始
WriteRSA = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
CipherText = WriteRSA.public_encrypt("這是一個(gè)秘密消息,只能用私鑰進(jìn)行解密",M2Crypto.RSA.pkcs1_oaep_padding)
print "加密的串是:"
print CipherText.encode('base64')
#對(duì)加密串進(jìn)行簽名
MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
MsgDigest.update(CipherText)
#提示,這里也可以使用私鑰簽名
#WriteRSA = M2Crypto.RSA.load_key ('jb51.net-private.pem')
#Signature = WriteRSA.sign_rsassa_pss(MsgDigest.digest())
Signature = Geekso.sign_rsassa_pss(MsgDigest.digest())
print "簽名的串是:"
print Signature.encode('base64')
#使用私鑰證書(shū)解密開(kāi)始
ReadRSA = M2Crypto.RSA.load_key ('jb51.net-private.pem')
try:
??? PlainText = ReadRSA.private_decrypt (CipherText, M2Crypto.RSA.pkcs1_oaep_padding)
except:
??? print "解密錯(cuò)誤"
??? PlainText = ""
if PlainText :
?? print "解密出來(lái)的串是:"
?? print PlainText
?? # 驗(yàn)證加密串的簽名
?? MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
?? MsgDigest.update(CipherText)
?? #提示,如果是用私鑰簽名的那就用公鑰驗(yàn)證
?? #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.字符串生成簽名、驗(yàn)證簽名

復(fù)制代碼 代碼如下:
#用私鑰簽名
SignEVP = M2Crypto.EVP.load_key('jb51.net-private.pem')
SignEVP.sign_init()
SignEVP.sign_update('來(lái)自這一客(//www.jb51.net)的簽名串')
StringSignature = SignEVP.sign_final()
print "簽名串是:"
print StringSignature.encode('base64')
#用公鑰驗(yàn)證簽名
PubKey = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
VerifyEVP = M2Crypto.EVP.PKey()
VerifyEVP.assign_rsa(PubKey)
VerifyEVP.verify_init()
VerifyEVP.verify_update('來(lái)自這一客(//www.jb51.net)的簽名串')
if VerifyEVP.verify_final(StringSignature) == 1:
??? print "字符串被成功驗(yàn)證。"
else:
??? print "字符串驗(yàn)證失敗!"

3.給證書(shū)加上密碼

給證書(shū)加密碼的好處是即使證書(shū)被人拿了,沒(méi)有密碼也用不了。

復(fù)制代碼 代碼如下:
def passphrase(v):
??? return '4567890'

生成證書(shū)時(shí)用
復(fù)制代碼 代碼如下:
Geekso.save_key('jb51.net-private.pem',callback=passphrase)

使用證書(shū)時(shí)用
復(fù)制代碼 代碼如下:
ReadRSA = RSA.load_key ('jb51.net-private.pem', passphrase)

二、 X509標(biāo)準(zhǔn)方式生成的證書(shū)

1.生成證書(shū)、公鑰文件、私鑰文件

復(fù)制代碼 代碼如下:
import time
from M2Crypto import X509, EVP, RSA, ASN1
def issuer_name():
??? """
??? 證書(shū)發(fā)行人名稱(專有名稱)。
??? Parameters:
??????? none
??? Return:
??????? X509標(biāo)準(zhǔn)的發(fā)行人obj.
??? """
??? issuer = X509.X509_Name()
??? issuer.C = "CN"??????????????? # 國(guó)家名稱
??? issuer.CN = "*.jb51.net"?????? # 普通名字
??? issuer.ST = "Hunan Changsha"
??? issuer.L = "Hunan Changsha"
??? issuer.O = "Geekso Company Ltd"
??? issuer.OU = "Geekso Company Ltd"
??? issuer.Email = "123456@qq.com"
??? return issuer
def make_request(bits, cn):
??? """
??? 創(chuàng)建一個(gè)X509標(biāo)準(zhǔn)的請(qǐng)求。
??? Parameters:
??????? bits = 證書(shū)位數(shù)
??????? cn = 證書(shū)名稱
??? Return:
??????? 返回 X509 request 與 private key (EVP).
??? """
??? rsa = RSA.gen_key(bits, 65537, None)
??? pk = EVP.PKey()
??? pk.assign_rsa(rsa)
??? req = X509.Request()
??? req.set_pubkey(pk)
??? name = req.get_subject()
??? name.C = "US"
??? name.CN = cn
??? req.sign(pk,'sha256')
??? return req, pk
def make_certificate_valid_time(cert, days):
??? """
??? 從當(dāng)前時(shí)間算起證書(shū)有效期幾天。
??? Parameters:
??????? cert = 證書(shū)obj
??????? days = 證書(shū)過(guò)期的天數(shù)
??? Return:
??????? none
??? """
??? t = long(time.time()) # 獲取當(dāng)前時(shí)間
??? time_now = ASN1.ASN1_UTCTIME()
??? time_now.set_time(t)
??? time_exp = ASN1.ASN1_UTCTIME()
??? time_exp.set_time(t + days * 24 * 60 * 60)
??? cert.set_not_before(time_now)
??? cert.set_not_after(time_exp)
def make_certificate(bits):
??? """
??? 創(chuàng)建證書(shū)
??? Parameters:
??????? bits = 證快的位數(shù)
??? Return:
??????? 證書(shū), 私鑰 key (EVP) 與 公鑰 key (EVP).
??? """
??? req, pk = make_request(bits, "localhost")
??? puk = req.get_pubkey()
??? cert = X509.X509()
??? cert.set_serial_number(1) # 證書(shū)的序例號(hào)
??? cert.set_version(1) # 證書(shū)的版本
??? cert.set_issuer(issuer_name()) # 發(fā)行人信息
??? cert.set_subject(issuer_name()) # 主題信息
??? cert.set_pubkey(puk)
??? make_certificate_valid_time(cert, 365) # 證書(shū)的過(guò)期時(shí)間
??? cert.sign(pk, 'sha256')
??? return cert, pk, puk
# 開(kāi)始創(chuàng)建
cert, pk, puk= make_certificate(1024)
cert.save_pem('jb51.net-cret.pem')
pk.save_key('jb51.net-private.pem',cipher = None, callback = lambda: None)
puk.get_rsa().save_pub_key('jb51.net-public.pem')

2.用證書(shū)加密、私鑰文件解密

復(fù)制代碼 代碼如下:
def geekso_encrypt_with_certificate(message, cert_loc):
??? """
??? cert證書(shū)加密,可以用私鑰文件解密.
??? Parameters:
??????? message = 要加密的串
??????? cert_loc = cert證書(shū)路徑
??? Return:
??????? 加密串 or 異常串
??? """
??? cert = X509.load_cert(cert_loc)
??? puk = cert.get_pubkey().get_rsa() # get RSA for encryption
??? message = base64.b64encode(message)
??? try:
??????? encrypted = puk.public_encrypt(message, RSA.pkcs1_padding)
??? except RSA.RSAError as e:
??????? return "ERROR encrypting " + e.message
??? return encrypted
encrypted = geekso_encrypt_with_certificate('www.jb51.net','jb51.net-cret.pem')
print '加密串',encrypted
def geekso_decrypt_with_private_key(message, pk_loc):
??? """
??? 私鑰解密證書(shū)生成的加密串
??? Parameters:
??????? message = 加密的串
??????? pk_loc = 私鑰路徑
??? Return:
??????? 解密串 or 異常串
??? """
??? pk = RSA.load_key(pk_loc) # load RSA for decryption
??? try:
??????? decrypted = pk.private_decrypt(message, RSA.pkcs1_padding)
??????? decrypted = base64.b64decode(decrypted)
??? except RSA.RSAError as e:
??????? return "ERROR decrypting " + e.message
??? return decrypted
print '解密串',geekso_decrypt_with_private_key(encrypted, 'jb51.net-private.pem')

3.用私鑰加密、證書(shū)解密

復(fù)制代碼 代碼如下:
def geekso_encrypt_with_private_key(message,pk_loc):
??? """
??? 私鑰加密
??? Parameters:
??????? message = 加密的串
??????? pk_loc = 私鑰路徑
??? Return:
??????? 加密串 or 異常串
??? """
??? ReadRSA = RSA.load_key(pk_loc);
??? message = base64.b64encode(message)
??? try:
??????? encrypted = ReadRSA.private_encrypt(message,RSA.pkcs1_padding)
??? except RSA.RSAError as e:
??????? return "ERROR encrypting " + e.message
??? return encrypted
encrypted = geekso_encrypt_with_private_key('www.jb51.net', 'jb51.net-private.pem')
print encrypted
def geekso_decrypt_with_certificate(message, cert_loc):
??? """
??? cert證書(shū)解密.
??? Parameters:
??????? message = 要解密的串
??????? cert_loc = cert證書(shū)路徑
??? Return:
??????? 解密后的串 or 異常串
??? """
??? cert = X509.load_cert(cert_loc)
??? puk = cert.get_pubkey().get_rsa()
??? try:
??????? decrypting = puk.public_decrypt(message, RSA.pkcs1_padding)
??????? decrypting = base64.b64decode(decrypting)
??? except RSA.RSAError as e:
??????? return "ERROR decrypting " + e.message
??? return decrypting
decrypting = geekso_decrypt_with_certificate(encrypted, 'jb51.net-cret.pem')
print decrypting

4.用私鑰簽名、證書(shū)驗(yàn)證簽名

復(fù)制代碼 代碼如下:
def geekso_sign_with_private_key(message, pk_loc, base64 = True):
??? """
??? 私鑰簽名
??? Parameters:
??????? message = 待簽名的串
??????? pk_loc = 私鑰路徑
??????? base64 = True(bease64處理) False(16進(jìn)制處理)
??? Return:
??????? 簽名后的串 or 異常串
??? """
??? pk = EVP.load_key(pk_loc)
??? pk.sign_init()
??? try:
??????? pk.sign_update(message)
??????? signature = pk.sign_final()
??? except EVP.EVPError as e:
??????? return "ERROR signature " + e.message
??? return signature.encode('base64') if base64 is True else signature.encode('hex')
signature = geekso_sign_with_private_key('www.jb51.net','jb51.net-private.pem')
print signature
def geekso_verifysign_with_certificate(message, signature, cert_loc, base64 = True):
??? """
??? 證書(shū)驗(yàn)證簽名
??? Parameters:
??????? message = 原來(lái)簽名的串
??????? signature = 簽名后的串
??????? cert_loc = 證書(shū)路徑文件
??????? base64 = True(bease64處理) False(16進(jìn)制處理)
??? Return:
??????? 成功or失敗串 or 異常串
??? """
??? signature = signature.decode('base64') if base64 is True else signature.decode('hex')
??? cert = X509.load_cert(cert_loc)
??? puk = cert.get_pubkey().get_rsa()
??? try:
??????? verifyEVP = EVP.PKey()
??????? verifyEVP.assign_rsa(puk)
??????? verifyEVP.verify_init()
??????? verifyEVP.verify_update(message)
??????? verifysign = verifyEVP.verify_final(signature)
??????? if verifysign == 1 :
??????????? return '成功'
??????? else :
??????????? return '失敗'
??? except EVP.EVPError as e:
??????? return "ERROR Verify Sign " + e.message
???
print geekso_verifysign_with_certificate('www.jb51.net', signature, 'jb51.net-cret.pem')

希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 在线一级片 | 欧美大香线蕉线伊人久久 | 二区在线观看 | 亚洲一区二区久久 | 日本黄页网址 | 91视频 - 88av | 亚洲成年网站在线777 | 日韩国产欧美视频 | 精品一本久久中文字幕 | 99精品国产免费久久国语 | 日本在线播放不卡一区二区三区 | 国产精品国产亚洲精品不卡 | 久久99热只有视精品6国产 | 免费a视频在线观看 | 碰碰碰精品视频在线观看 | 国产欧美日韩亚洲精品区2345 | 亚洲国产欧洲综合997久久 | 正在播放国产无套露脸 | 最新久久免费视频 | 亚洲一区二区三区影院 | 欧美日韩中文在线观看 | 日本一区二区三区免费观看 | 香蕉国产在线观看免费 | 精品一区二区三区四区五区 | 久久一本精品 | 一级毛片视频播放 | 日韩欧美一区在线观看 | jizzyouxxxx | 久久精品 | 欧美性一区二区三区 | 国产精品秒播无毒不卡 | 精品欧美一区二区在线观看欧美熟 | 国产成人在线视频 | 欧美一区二区在线播放 | 日日麻批免费视频 | www.国产欧美 | 精品国产一区二区三区成人 | 色鬼7777久久| 日本中文字幕高清 | 另类婷婷 | 久久人人爽人人爽 |