上一篇文章,寫了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 Random
from Crypto.Cipher import AES
import base64
from hashlib import md5
from binascii import b2a_hex, a2b_hex
BLOCK_SIZE = AES.block_size
def 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 Random
from Crypto.Cipher import AES
import base64
from hashlib import md5
def 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)