首页 > Python > PHP与python通用AES加密解密(CBC,16位)

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)