python实现无证书加密解密实例,python无证书加密

作者:计算机知识

引用功效被关门了。
无证件加密的好外就是两岸没有要求保险证书,加密与解密只供给互相约定三个key就足以,无证件加解密的点子使用更广阔一些,pythonpython实现无证书加密解密实例,python无证书加密解密例子。法定也可以有那方面包车型地铁连带例子表达,地址是:https://pypi.python.org/pypi/pycrypto,首要用的是from Crypto.Cipher import AES那一个模块,代码如下:
'''

python有证书的加密解密达成格局,python加密解密

正文实例讲述了python有证书的加密解密达成情势。分享给我们供大家参照他事他说加以考察。具体落实格局如下:

多年来在做python的加解密专门的工作,同不经常间加完密的串能在php上能解出来,互连网也找了一部分可靠的材质,刚好也临时光小编就总括了弹指间python在加密与解密那块的代码,今后或者仍是能够用的上。相对于php来说python那块加解密组件比较多的,分别是:

python-crypto - 这一个组件是主旨组件,使用的函式相对相比较复杂。
ezPyCrypto - 相对简便易行,但他作出来的集体钥不大概与别的程序相包容     SSLCrypto - 与 ezPyCrypto 是同样三个小编开拓,成效上要比ezPyCrypto 好。但同样不可能与任何程序匹协作。
pyopenssl - 仿佛是用在https 通信上的,而自个儿找不到加解密的用法。
M2Crypto - 终于让自个儿找到了,但它有一大短处,它底层是用 SWIG 与 OpenSSL 交接的。
在Windows安装SWIG 程序是那三个难的。

本身选用选取的是M2Crypto,公钥与私钥证雅士成有四个法子,一种选取TucsonSA生成,另一种是X509生成。小编就把那二种加解密代码共享出来,供大家参谋,但转载或应用时请写明出处。

一、 KugaSA规范方法变通的证件

1.加密解密、加密具名、验证加密签字

复制代码 代码如下:

#encoding: utf8
import os
import M2Crypto
#自由数生成器(1023个人随机)
M2Crypto.Rand.rand_seed(os.urandom(1024))
#转换二个10二十五人公钥与私密钥证书
Geekso = M2Crypto.RSA.gen_key(1024, 65537)
Geekso.save_key('jb51.net-private.pem', None)
Geekso.save_pub_key('jb51.net-public.pem')
#运用公钥证书加密起始
WriteRSA = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
CipherText = WriteRSA.public_encrypt("那是叁个诡秘音信,只好用私钥举办解密",M2Crypto.LacrosseSA.pkcs1_oaep_padding)
print "加密的串是:"
print CipherText.encode('base64')
#对加密串进行具名
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')
#利用私钥证书解密开首
ReadRSA = M2Crypto.RSA.load_key ('jb51.net-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('jb51.net-private.pem')
SignEVP.sign_init()
SignEVP.sign_update('来自这一客(')
StringSignature = SignEVP.sign_final()
print "具名串是:"
print StringSignature.encode('base64')
#用公钥验证具名
PubKey = M2Crypto.RSA.load_pub_key('jb51.net-public.pem')
VerifyEVP = M2Crypto.EVP.PKey()
VerifyEVP.assign_rsa(PubKey)
VerifyEVP.verify_init()
VerifyEVP.verify_update('来自这一客(')
if VerifyEVP.verify_final(StringSignature) == 1:
    print "字符串被成功验证。"
else:
    print "字符串验证战败!"

3.给证书加上密码

给证书加密码的收益是不怕证书被人拿了,未有密码也用持续。

复制代码 代码如下:

def passphrase(v):
    return '4567890'

浮动证书时用

复制代码 代码如下:

Geekso.save_key('jb51.net-private.pem',callback=passphrase)

选取证书时用

复制代码 代码如下:

ReadRSA = RSA.load_key ('jb51.net-private.pem', passphrase)

二、 X509正规措施变通的注脚

1.生成证书、公钥文件、私钥文件

复制代码 代码如下:

import time
from M2Crypto import X509, EVP, RSA, ASN1
def issuer_name():
    """
    证书编剧名称(专盛名称)。
    Parameters:
        none
    Return:
        X509正经的批发人obj.
    """
    issuer = X509.X509_Name()
    issuer.C = "CN"                # 国家名称
    issuer.CN = "*.jb51.net"       # 普通名字
    issuer.ST = "Hunan Changsha"
    issuer.L = "Hunan Changsha"
    issuer.O = "Geekso Company Ltd"
    issuer.OU = "Geekso Company Ltd"
    issuer.Email = "[email protected]"
    return issuer
def make_request(bits, cn):
    """
    创制四个X509标准的呼吁。
    Parameters:
        bits = 证书位数
        cn = 证书名称
    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):
    """
    从脚下时光算起证书有效期几天。
    Parameters:
        cert = 证书obj
        days = 证书过期的天命
    Return:
        none
    """
    t = long(time.time()) # 获取当前光阴
    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):
    """
    创立证书
    Parameters:
        bits = 证快的位数
    Return:
        证书, 私钥 key (EVP) 与 公钥 key (EVP).
    """
    req, pk = make_request(bits, "localhost")
    puk = req.get_pubkey()
    cert = X509.X509()
    cert.set_serial_number(1) # 证书的序例号
    cert.set_version(1) # 证书的版本
    cert.set_issuer(issuer_name()) # 编剧音信
    cert.set_subject(issuer_name()) # 主题音信
    cert.set_pubkey(puk)
    make_certificate_valid_time(cert, 365) # 证书的逾期时间
    cert.sign(pk, 'sha256')
    return cert, pk, puk
# 起头创立
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.用证件加密、私钥文件解密

复制代码 代码如下:

def geekso_encrypt_with_certificate(message, cert_loc):
    """
    cert证书加密,能够用私钥文件解密.
    Parameters:
        message = 要加密的串
        cert_loc = cert证书路径
    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):
    """
    私钥解密证雅人成的加密串
    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.用私钥加密、证书解密

复制代码 代码如下:

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证书解密.
    Parameters:
        message = 要解密的串
        cert_loc = cert证书路径
    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.用私钥具名、证书验证签字

复制代码 代码如下:

def geekso_sign_with_private_key(message, pk_loc, base64 = True):
    """
    私钥具名
    Parameters:
        message = 待签字的串
        pk_loc = 私钥路线
        base64 = True(bease64管理) False(16进制管理)
    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):
    """
    证书验证签字
    Parameters:
        message = 原来签字的串
        signature = 签字后的串
        cert_loc = 证书路线文件
        base64 = True(bease64管理) False(16进制处理)
    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')

企望本文所述对大家的Python程序设计具备利于。

本文实例陈述了python有证书的加密解密完结格局。共享给大家供我们参考。具体落实情势如...

近些日子在做python的加解密职业,相同的时间加完密的串能在php上能解出来,英特网也找了有的可相信的材质,刚好也可能有的时候间本人就总计了一下python在加密与解密那块的代码,今后恐怕还是能够用的上。相对于php来讲python这块加解密组件非常多的,分别是:
    python-crypto - 那些组件是骨干组件,使用的函式相对相比复杂。
    ezPyCrypto - 相对简便易行,但他作出?淼墓?皆课薹ㄓ肫渌?淌较嗉嫒荨?br />     SSLCrypto - 与 ezPyCrypto 是同样贰个小编开荒,效能上要比ezPyCrypto 好。
                         但同样无法与其余程序相宽容。
    pyopenssl - 就如是用在https 通信上的,而本人找不到加解密的用法。
    M2Crypto - 终于让本身找到了,但它有第一次全国代表大会缺?,它底层是用 SWIG 与 OpenSSL 交接的。
                        在Windows安装SWIG 程序是可怜难?的。
本人选拔选择的是M2Crypto,公钥与私钥证文士成有七个格局,一种接纳PAJEROSA生成,另一种是X509生成。笔者就把那三种加解密代码分享出来,供大家参谋,但转发或接纳时请写明出处。
一、 昂科威SA规范方法调换的证书
    1.加密解密、加密具名、验证加密具名

python完成无注脚加密解密实例,python加密解密

正文实例汇报了python完成无评释加密解密的法子,共享给我们供大家参照他事他说加以考察。具体贯彻格局如下:

无注明加密便是两岸无需爱护证书,加密与解密只须求相互约定六个key就能够,无注脚加解密的不二法门接纳更广阔一些,python官方也可以有那地点的相关例子表达,地址是: Crypto.Cipher import AES那一个模块,代码如下:

复制代码 代码如下:

'''
/**
* AES加密字符串
*
* @param string data 加密的串
* @param string key 密钥(只能是16、24、32位)
* @param string iv 拾陆人长度向量
* @param bool 编码格式(true:base64 / false:十六进制)
* @return string 加密后的结果
*/
'''
def encrypt_mode_cbc(data, key, iv = 'www.jb51.net!!', base64 = True):
lenth = len(data)
num = lenth % 16
data = data.ljust(lenth 16 - num)
obj = AES.new(key, AES.MODE_CBC, iv)
result = obj.encrypt(data)
return result.encode('base64') if base64 is True else result.encode('hex')
encrypt = encrypt_mode_cbc('hello geekso', 'www.jb51.net!!')
print encrypt
'''
/**
* AES解密字符串
*
* @param string encrypted 待解密的串
* @param string key 密钥
* @param string iv 十几人长度向量
* @param bool 编码(true:base64 / false:十六进制)
* @return string 解密后的结果 or bool
*/
'''
def decrypt_mode_cbc(encrypted, key, iv = 'www.jb51.net!!', base64 = True):
encrypted = encrypted.decode('base64') if base64 is True else encrypted.decode('hex')
if encrypted is not '':
obj = AES.new(key, AES.MODE_CBC, iv)
return obj.decrypt(encrypted)
else:
return False

print decrypt_mode_cbc(encrypt,'www.jb51.net!!')
exit()

企望本文所述对大家的Python程序设计具备助于。

 代码如下

 代码如下

二个简便的python数字加密解密算法

用hash呗。
import hashlib

a = "a test string"
print hashlib.md5(a).hexdigest()
print hashlib.sha1(a).hexdigest()
print hashlib.sha224(a).hexdigest()
print hashlib.sha256(a).hexdigest()
print hashlib.sha384(a).hexdigest()
print hashlib.sha512(a).hexdigest()

针对str类型的。
加密以来,能够对最终得出的hash值再管理就能够。比如左移,右移,某2位替换,某位加几等等就可以。
解密间接用逆序就能够了。  

/**
* AES加密字符串
*
* @param string data 加密的串
* @param string key 密钥(只能是16、24、32位)
* @param string iv 14个人长度向量
* @param bool 编码格式(true:base64 / false:十六进制)
* @return string 加密后的结果
*/
'''
def encrypt_mode_cbc(data, key, iv = 'www.111cn.net!!', base64 = True):
    lenth = len(data)
    num = lenth % 16
    data = data.ljust(lenth 16 - num)
    obj = AES.new(key, AES.MODE_CBC, iv)
    result = obj.encrypt(data)
    return result.encode('base64') if base64 is True else result.encode('hex')

#encoding: utf8
import os
import M2Crypto
#任性数生成器(10贰拾四个人随机)
M2Crypto.Rand.rand_seed(os.urandom(1024))
#改变贰个1025位公钥与私密钥证书
Geekso = M2Crypto.RSA.gen_key(1024, 65537)
Geekso.save_key('111cn.net-private.pem', None)
Geekso.save_pub_key('111cn.net-public.pem')

在python中怎完结3des加密 能够给个例子最棒 小编解密时用php的3des 怎能够对上接口

本文实例陈说了python实现无注脚加密解密的格局,分享给我们供大家仿照效法。具体贯彻方式如下...

encrypt = encrypt_mode_cbc('hello geekso', 'www.111cn.net!!')
print encrypt

#使用公钥证书加密初叶
WriteRSA = M2Crypto.RSA.load_pub_key('111cn.net-public.pem')
CipherText = WriteRSA.public_encrypt("那是一个潜在音讯,只好用私钥举行解密",M2Crypto.EnclaveSA.pkcs1_oaep_padding)
print "加密的串是:"
print CipherText.encode('base64')

'''
/**
* AES解密字符串
*
* @param string encrypted 待解密的串
* @param string key 密钥
* @param string iv 15人长度向量
* @param bool 编码(true:base64 / false:十六进制)
* @return string 解密后的结果 or bool
*/
'''
def decrypt_mode_cbc(encrypted, key, iv = 'www.111cn.net!!', base64 = True):
    encrypted = encrypted.decode('base64') if base64 is True else encrypted.decode('hex')
    if encrypted is not '':
        obj = AES.new(key, AES.MODE_CBC, iv)
        return obj.decrypt(encrypted)
    else:
        return False
   
print decrypt_mode_cbc(encrypt,'www.111cn.net!!')
exit()

#对加密串举办具名
MsgDigest = M2Crypto.EVP.MessageDigest('sha1')
MsgDigest.update(CipherText)
#唤醒,这里也足以运用私钥签字
#WriteRSA = M2Crypto.RSA.load_key ('111cn.net-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 ('111cn.net-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.字符串生成具名、验证具名

本文由bwin必赢发布,转载请注明来源

关键词: 56.net