博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python AES加密解密,key的长度不受限制
阅读量:4070 次
发布时间:2019-05-25

本文共 2815 字,大约阅读时间需要 9 分钟。

上一篇文章,写了golang 下面如何实现AES的加密解密,这里就把python的实现AES的加密解密的代码贴出来

说明:

1、下面列举了2种加密解密的方法,一个是key的长度不收限制,必须为16,24,32位,另外一种就是key的长度不受限制

2、这里同样使用了PKCS5Padding做填充

3、之前说了,想实现python 加密解密,与go互通,也就是python 加密go解密,或者go加密,python解密,这2种情形的话,这里一定要选择下面的第一种方式,也就是key的值是受限制的,至于key不受限制,如何互通,这里先不介绍,后面在说明

直接上代码:

方式一、key 值受限制

from Crypto import Randomfrom Crypto.Cipher import AESimport base64from hashlib import md5from binascii import b2a_hex, a2b_hexBLOCK_SIZE = AES.block_sizedef pad(data):    length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)    #return data + (chr(length) * length).encode()    return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')def unpad(data):    return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]def encrypt(message, key):    salt = Random.new().read(BLOCK_SIZE+len(pad(message)))    iv = salt[:BLOCK_SIZE]    key = key.encode('utf-8')    aes = AES.new(key, AES.MODE_CBC, iv)    return base64.b64encode(iv+aes.encrypt(pad(message)))def decrypt(encrypted, key):    encrypted = base64.b64decode(encrypted)     iv = encrypted[0:16]    key =  key.encode('utf-8')    aes = AES.new(key, AES.MODE_CBC, iv)    return unpad(aes.decrypt(encrypted[BLOCK_SIZE:]))if __name__ == '__main__':    key = 'ABCDEFGHIJKLMNOp'    data = 'oracless'    encrypt_data = encrypt(data, key)    print(encrypt_data)    decrypt_data = decrypt(encrypt_data, key)    print(decrypt_data)

方式二、key 值不受限制

from Crypto import Randomfrom Crypto.Cipher import AESimport base64from hashlib import md5def pad(data):    length = 16 - (len(data) % 16)    return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')def unpad(data):    return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]def bytes_to_key(data, salt, output=48):    data=data.encode(encoding='utf-8')    assert len(salt) == 8, len(salt)    data += salt    key = md5(data).digest()    final_key = key    while len(final_key) < output:        key = md5(key + data).digest()        final_key += key    return final_key[:output]def encrypt(message, passphrase):    salt = Random.new().read(8)    key_iv = bytes_to_key(passphrase, salt, 32+16)    key = key_iv[:32]    iv = key_iv[32:]    aes = AES.new(key, AES.MODE_CBC, iv)    return base64.b64encode(b"Salted__" + salt + aes.encrypt(pad(message)))def decrypt(encrypted, passphrase):    encrypted = base64.b64decode(encrypted)    assert encrypted[0:8] == b"Salted__"    salt = encrypted[8:16]    key_iv = bytes_to_key(passphrase, salt, 32+16)    key = key_iv[:32]    iv = key_iv[32:]    aes = AES.new(key, AES.MODE_CBC, iv)    return unpad(aes.decrypt(encrypted[16:]))if __name__ == '__main__':    key = 'seurtl23'    data = 'oracless'    encrypt_data = encrypt(data, key)    print(encrypt_data)    decrypt_data = decrypt(encrypt_data, key)    print(decrypt_data)

 

转载地址:http://pzhji.baihongyu.com/

你可能感兴趣的文章
<转>文档视图指针互获
查看>>
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
关于进制转换的具体实现代码
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>