python AES加密解密,key的长度不受限制

今天药忘吃喽~ 2023-06-30 08:58 53阅读 0赞

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

说明:

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

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

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

直接上代码:

方式一、key 值受限制

  1. from Crypto import Random
  2. from Crypto.Cipher import AES
  3. import base64
  4. from hashlib import md5
  5. from binascii import b2a_hex, a2b_hex
  6. BLOCK_SIZE = AES.block_size
  7. def pad(data):
  8. length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)
  9. #return data + (chr(length) * length).encode()
  10. return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')
  11. def unpad(data):
  12. return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]
  13. def encrypt(message, key):
  14. salt = Random.new().read(BLOCK_SIZE+len(pad(message)))
  15. iv = salt[:BLOCK_SIZE]
  16. key = key.encode('utf-8')
  17. aes = AES.new(key, AES.MODE_CBC, iv)
  18. return base64.b64encode(iv+aes.encrypt(pad(message)))
  19. def decrypt(encrypted, key):
  20. encrypted = base64.b64decode(encrypted)
  21. iv = encrypted[0:16]
  22. key = key.encode('utf-8')
  23. aes = AES.new(key, AES.MODE_CBC, iv)
  24. return unpad(aes.decrypt(encrypted[BLOCK_SIZE:]))
  25. if __name__ == '__main__':
  26. key = 'ABCDEFGHIJKLMNOp'
  27. data = 'oracless'
  28. encrypt_data = encrypt(data, key)
  29. print(encrypt_data)
  30. decrypt_data = decrypt(encrypt_data, key)
  31. print(decrypt_data)

方式二、key 值不受限制

  1. from Crypto import Random
  2. from Crypto.Cipher import AES
  3. import base64
  4. from hashlib import md5
  5. def pad(data):
  6. length = 16 - (len(data) % 16)
  7. return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')
  8. def unpad(data):
  9. return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]
  10. def bytes_to_key(data, salt, output=48):
  11. data=data.encode(encoding='utf-8')
  12. assert len(salt) == 8, len(salt)
  13. data += salt
  14. key = md5(data).digest()
  15. final_key = key
  16. while len(final_key) < output:
  17. key = md5(key + data).digest()
  18. final_key += key
  19. return final_key[:output]
  20. def encrypt(message, passphrase):
  21. salt = Random.new().read(8)
  22. key_iv = bytes_to_key(passphrase, salt, 32+16)
  23. key = key_iv[:32]
  24. iv = key_iv[32:]
  25. aes = AES.new(key, AES.MODE_CBC, iv)
  26. return base64.b64encode(b"Salted__" + salt + aes.encrypt(pad(message)))
  27. def decrypt(encrypted, passphrase):
  28. encrypted = base64.b64decode(encrypted)
  29. assert encrypted[0:8] == b"Salted__"
  30. salt = encrypted[8:16]
  31. key_iv = bytes_to_key(passphrase, salt, 32+16)
  32. key = key_iv[:32]
  33. iv = key_iv[32:]
  34. aes = AES.new(key, AES.MODE_CBC, iv)
  35. return unpad(aes.decrypt(encrypted[16:]))
  36. if __name__ == '__main__':
  37. key = 'seurtl23'
  38. data = 'oracless'
  39. encrypt_data = encrypt(data, key)
  40. print(encrypt_data)
  41. decrypt_data = decrypt(encrypt_data, key)
  42. print(decrypt_data)

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读