本文基于AES-CBC加密解密方法
一、php加密=>python解密
php加密:
$key = 'ABCDEFGHIJKLMNOP'; //16位
$vi = '0102030405060708'; //16位
$str = '需加密的字符串';
$sign = openssl_encrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $vi);
$sign = base64_encode($sign);
var_dump($sign);die();
//结果:F8dIExttsNN1WK5BCLHhkRZVwVIoI70W1G+pjPhgNRk=
python解密:
import base64
import re
from Crypto.Cipher import AES
key = 'ABCDEFGHIJKLMNOP' #16位
def AES_Decrypt(data):
vi = '0102030405060708'#16位
data = data.encode('utf8')
encodebytes = base64.decodebytes(data)
# 将加密数据转换为bytes类型数据
cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
text_decrypted = cipher.decrypt(encodebytes)
# 判断是否含有中文
zhmodel = re.compile(u'[\u4e00-\u9fff]')
match = zhmodel.search(text_decrypted.decode())
if match == False:
#无中文时补位
unpad = lambda s: s[0:-s[-1]]
text_decrypted = unpad(text_decrypted)
text_decrypted = text_decrypted.decode('utf8').rstrip()#去掉补位的右侧空格
return text_decrypted
print(AES_Decrypt("F8dIExttsNN1WK5BCLHhkRZVwVIoI70W1G+pjPhgNRk="))
#结果:需加密的字符串
二、python加密=>php解密
python加密:
import base64
import re
from Crypto.Cipher import AES
key = 'ABCDEFGHIJKLMNOP' #16位
def AES_Encrypt(data):
vi = '0102030405060708'#16位
cryptor = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
# 判断是否含有中文
zhmodel = re.compile(u'[\u4e00-\u9fff]')
match = zhmodel.search(data)
if match == None:
#无中文时
add = 16 - len(data) % 16
pad = lambda s: s + add * chr(add)
data = pad(data)
enctext = cryptor.encrypt(data.encode('utf8'))
else:
#含有中文时
data = data.encode()
add = 16 - len(data) % 16
data = data + add * (chr(add)).encode()
enctext = cryptor.encrypt(data)
encodestrs = base64.b64encode(enctext).decode('utf8')
return encodestrs
print(AES_Encrypt('abcd123'))
#结果:KeAJB/1sMcGk6HUmKeC5jA==
#python解密可直接调用print(AES_Decrypt("KeAJB/1sMcGk6HUmKeC5jA=="))
php解密:
key = 'ABCDEFGHIJKLMNOP'; //16位
$vi = '0102030405060708';//16位
$data = 'KeAJB/1sMcGk6HUmKeC5jA==';
$sign = openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, 1, $vi);
var_dump($sign);die();
//结果:abcd123