Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使AES.encrypt正确地包含Python3中的控制字符_Python_Php_Python 3.x_Encryption - Fatal编程技术网

如何使AES.encrypt正确地包含Python3中的控制字符

如何使AES.encrypt正确地包含Python3中的控制字符,python,php,python-3.x,encryption,Python,Php,Python 3.x,Encryption,我将把加密逻辑从php改为python3 原始代码具有填充ascii的逻辑,我将其引入python代码中 从 到 但当pkcs7得到11个字符(例如“12345678901”)并且返回结果包含控制字符(例如12345678901\x05\x05\x05\x05,chr(5)表示ENQ\x05)时,两个encrytor的工作方式不同 我认为python3的AES中忽略了结果的控制特征。 因为php-toPkcs7和python3-to_-pkcs7返回相同长度的字符串 比如说 # in php $

我将把加密逻辑从php改为python3

原始代码具有填充ascii的逻辑,我将其引入python代码中

但当pkcs7得到11个字符(例如“12345678901”)并且返回结果包含控制字符(例如12345678901\x05\x05\x05\x05,chr(5)表示ENQ\x05)时,两个encrytor的工作方式不同

我认为python3的AES中忽略了结果的控制特征。 因为
php-toPkcs7
python3-to_-pkcs7
返回相同长度的字符串

比如说

# in php
$message = toPkcs7($message);
echo strlen($message);  # 16
$encrypted = openssl_encrypt($message, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

# in python3
message = to_pkcs7(message) 
print(len(message))  # 16
cipher = AES.new(key, AES.MODE_CBC, iv())
encrypted = cipher.encrypt(message.encode("utf-8"))

我想知道如何使我的python代码像php一样工作。

在发布的php代码中,填充被做了两次,这是不必要的(实际上甚至是一个bug)

填充的目的是,明文的长度是块大小的整数倍(AES为16字节),这是块密码的一个要求。这已经通过第一次填充实现,即第二次填充是无用的。它只会导致附加(此处)0x10值的(冗余)完整块,这会不必要地膨胀密文

为了使用Python代码获取双填充明文的密文,还需要简单的双填充:

message=to_pkcs7(to_pkcs7(message))
要在PHP代码中只填充一次,请注意以下几点:
openssl\u encrypt()
隐式使用PKCS7填充,即自定义填充不是必需的,因此只需删除。但是,如果应该应用自定义填充,则只需禁用隐式填充(通过设置
OPENSSL\u ZERO\u padding
标志)。两种变体提供相同的结果


顺便说一句,PyCryptodome(与传统PyCrypto不同)以专用的方式支持PKCS7。

在发布的PHP代码中,填充被执行两次,这是不必要的(实际上甚至是一个bug)

填充的目的是,明文的长度是块大小的整数倍(AES为16字节),这是块密码的一个要求。这已经通过第一次填充实现,即第二次填充是无用的。它只会导致附加(此处)0x10值的(冗余)完整块,这会不必要地膨胀密文

为了使用Python代码获取双填充明文的密文,还需要简单的双填充:

message=to_pkcs7(to_pkcs7(message))
要在PHP代码中只填充一次,请注意以下几点:
openssl\u encrypt()
隐式使用PKCS7填充,即自定义填充不是必需的,因此只需删除。但是,如果应该应用自定义填充,则只需禁用隐式填充(通过设置
OPENSSL\u ZERO\u padding
标志)。两种变体提供相同的结果


顺便说一句,PyCryptodome(不同于传统的PyCrypto)以专用的方式支持PKCS7。

你太棒了!!它的工作原理是使用双重填充。我去检查一下。谢谢你太棒了!!它的工作原理是使用双重填充。我去检查一下。谢谢
def to_pkcs7(s):
    padding_size = 16 - (len(s) % 16)
    return s + (chr(padding_size) * padding_size)
# in php
$message = toPkcs7($message);
echo strlen($message);  # 16
$encrypted = openssl_encrypt($message, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

# in python3
message = to_pkcs7(message) 
print(len(message))  # 16
cipher = AES.new(key, AES.MODE_CBC, iv())
encrypted = cipher.encrypt(message.encode("utf-8"))