PHP函数到Python的转换

PHP函数到Python的转换,php,python,Php,Python,我只是想知道有没有可能将PHP加密函数转换成Python?我正在使用PHP函数加密用户ID并将其存储在数据库中,现在我需要在Python中解密用户ID,我使用此PHP函数: function decrypt($id) { $cryptKey = '123'; $decoded = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), base64_decode( $id ),

我只是想知道有没有可能将
PHP
加密函数转换成Python?我正在使用
PHP
函数加密
用户ID
并将其存储在
数据库中
,现在我需要在
Python
中解密
用户ID
,我使用此
PHP
函数:

function decrypt($id) {
       $cryptKey  = '123';
       $decoded    = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ),         base64_decode( $id ), MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ), "\0");
       return( $decoded );
    }

下面是您的函数“翻译”为python

from Crypto.Cipher import AES
from hashlib import md5

def decrypt(id): 
    cryptKey  = '123'
    cipher = AES.new(key=md5(cryptKey).hexdigest(), mode=AES.MODE_CBC, IV=md5(md5(cryptKey).hexdigest()).hexdigest()[:16])
    decoded = cipher.decrypt(id.decode('base64')).rstrip('\0')
    return decoded
五条建议
1.使用随机静脉注射
2.使用更复杂的键
3.不要硬编码钥匙
4.使用
openssl\u decrypt
mcrypt\u decrypt
不推荐使用

注意
这不适用于
MCRYPT_RIJNDAEL_256
,因为它使用32字节块。
但是您可以使用
MCRYPT\u RIJNDAEL\u 128
openssl

以下是PHP中openssl AES CBC的一个示例:

function encrypt($data, $key) {
    $method = "aes-" . strlen($key) * 8 . "-cbc";
    $iv = openssl_random_pseudo_bytes(16);
    $encoded = base64_encode($iv . openssl_encrypt($data, $method, $key, TRUE, $iv));
    return $encoded;
}

function decrypt($data, $key) {
    $method = "aes-" . strlen($key) * 8 . "-cbc";
    $iv = substr(base64_decode($data), 0, 16);
    $decoded = openssl_decrypt(substr(base64_decode($data), 16), $method, $key, TRUE, $iv);
    return $decoded;
}
Python代码:

from Crypto.Cipher import AES
from Crypto import Random
import base64

def encrypt(data, key): 
    pkcs7pad = lambda data: data + chr(16-(len(data)%16)).encode() * (16-(len(data)%16))
    iv = Random.new().read(16)
    cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
    encoded = base64.b64encode(iv + cipher.encrypt(pkcs7pad(data)))
    return encoded

def decrypt(data, key): 
    pkcs7unpad = lambda data: data[:-ord(data[-1:])]
    cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=base64.b64decode(data)[:16])
    decoded = cipher.decrypt(base64.b64decode(data)[16:])
    return pkcs7unpad(decoded)
使用上述函数,您可以在PHP中加密,在python中解密,反之亦然

假设密钥的大小有效(16、24或32字节)

可能与“谢谢”重复,您已保存了我的一天!:)是的,我尝试过,但收到错误:“binascii.error:填充不正确”我的编码PHP id:“VjceE1sAhxf2kUJYJX5q1BruIco2ne9SBAjzmbgjfno%3D”据我所知,我的编码ID字符串有问题,我现在正在寻找解决方案。我收到了相同的错误:/decode函数中可能有错误吗?错误:“output=base64.decodestring(input)File”/usr/local/lib/python2.7/base64.py”,decodestring返回binascii.a2b_base64(s)中的第328行binascii.错误:不正确的填充“我可以使用
RIJNDAEL 128
openssl_decrypt
(128和256),但不能使用
RIJNDAEL 256