python 上的 DES3 加密结果与 php 的 des-ede3-cbc 结果不同

问题描述 投票:0回答:1

PHP 代码

// php 8.1.13
$text = '1';
$key = base64_decode('3pKtqxNOolyBoJouXWwVYw==');
$iv = base64_decode('O99EDNAif90=');
$encrypted = openssl_encrypt($text, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv);
$hex = strtoupper(bin2hex($encrypted));
echo $hex;

结果是

FF72E6D454B84A7C

Python3.8 pycryptodome 3.20.0

import binascii
import base64
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad

key = base64.b64decode('3pKtqxNOolyBoJouXWwVYw==')
iv = base64.b64decode('O99EDNAif90=')

cipher = DES3.new(key, DES3.MODE_CBC, iv)

data = '1'
data = data.encode('utf-8')
data = pad(data, DES3.block_size)

encrypted = cipher.encrypt(data)

print(binascii.hexlify(encrypted).decode('utf-8').upper())

结果是

A311743FB5D91569

为什么这两个结果不同,如何使python的结果与PHP的结果一致?

我尝试过使用 pycryptodome 和 pyDes,但无法达到与 PHP 相同的结果

python encryption 3des
1个回答
0
投票

两个代码都使用不同的 TripleDES 变体:PHP 代码中的

des-ede3-cbc
指定 3TDEA,它需要 24 字节密钥。由于使用的密钥大小只有 16 字节,PHP/OpenSSL 会默默地用 0x00 值将其填充到所需的 24 字节大小。

使用 PyCryptodome,密钥长度决定变体。由于密钥大小为 16 字节,因此应用2TDEA。由于这个原因,结果是不同的。

为了也使用 3TDEA,必须在 Python 代码中显式填充密钥,即使用 0x00 值扩展到 24 个字节:

key = base64.b64decode('3pKtqxNOolyBoJouXWwVYw==') + b'\x00'*8

如果在Python代码中应用此键,结果与PHP代码中相同。

© www.soinside.com 2019 - 2024. All rights reserved.