PHP与python通用AES加密解密(CBC,16位)
Python 2023-01-30
PHP代码:
<?php header("Content-Type:text/html;charset=utf-8"); $privateKey = "8E5EC1AC2191167DF9B753BA93A1E7B8"; $iv = "0102030405060708"; $data = "好好学习,天天向上"; //加密 $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv); echo(bin2hex($encrypted)); echo '<br/>'; //低版本PHP没有hex2bin函数,需要自己定义 function hex2bin($data){ $len=strlen($data); return pack("H".$len,$data); } //解密 $encryptedData = hex2bin(bin2hex($encrypted)); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv); echo($decrypted); ?>
Python代码:
from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex # 如果text不足16位的倍数就用空格补足为16位 def add_to_16(text): if len(text.encode('utf-8')) % 16: add = 16 - (len(text.encode('utf-8')) % 16) else: add = 0 text = text + ('\0' * add) return text.encode('utf-8') # 加密函数 def encrypt(text, key, iv): mode = AES.MODE_CBC text = add_to_16(text) cryptos = AES.new(key=key.encode('utf-8'), mode=mode, iv=iv.encode('utf-8')) cipher_text = cryptos.encrypt(text) # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串 jiemi = b2a_hex(cipher_text) return jiemi.decode('utf-8')# 返回字符串 # 解密后,去掉补足的空格用strip() 去掉 def decrypt(text, key, iv): mode = AES.MODE_CBC cryptos = AES.new(key=key.encode('utf-8'), mode=mode, iv=iv.encode('utf-8')) plain_text = cryptos.decrypt(a2b_hex(text)) return bytes.decode(plain_text).rstrip('\0') if __name__ == '__main__': e = encrypt("好好学习,天天向上", "8E5EC1AC2191167DF9B753BA93A1E7B8", "0102030405060708") # 加密 d = decrypt(e, "8E5EC1AC2191167DF9B753BA93A1E7B8", "0102030405060708") # 解密 print("加密:", e) print("解密:", d)
下一篇:Python模拟登陆网页的方法