PHP中的3DES结果与Python中的不同

0 投票
1 回答
645 浏览
提问于 2025-04-18 05:07

PHP代码:

$key = '111111111111111111111111'; //length: 24
$iv = "\0\0\0\0\0\0\0\0"; //8 bytes
$data = mcrypt_encrypt(MCRYPT_TRIPLEDES, $key, "SECRET", MCRYPT_MODE_CBC, $iv);  
base64_encode($data); 
// Result: ZGF0YQ==

Python代码(使用m2crypto库):

cipher = Cipher(alg='des_ede3_ecb', key="111111111111111111111111", op=encrypt, iv='\0'*8)
ciphertext = cipher.update("SECRET")
ciphertext += cipher.final()
base64.b64encode(ciphertext)
# Result: LhBqW6pGRoQ=

Python代码(使用pyDes库):

k = pyDes.triple_des('111111111111111111111111', mode=pyDes.CBC, IV=b'\0'*8, pad=None, padmode=pyDes.PAD_PKCS5)
d = k.encrypt("SECRET")
base64.b64encode(d)
# Result: LhBqW6pGRoQ=

所以Python在使用不同的库时得到的结果是一样的,但PHP却不是;/ 有人看到这里有什么问题吗?

谢谢!

1 个回答

1

PHP的mcrypt库不支持PKCS5填充,而是使用简单的零填充。这就是为什么你会发现它和使用PKCS5填充的Python库得到的结果不一样。

这里有一个解决方法,可以在PHP中实现PKCS5填充:https://chrismckee.co.uk/handling-tripledes-ecb-pkcs5padding-php/

编辑

我确认这个人的库可以正常工作:

$key = '111111111111111111111111';
$x = "SECRET";
print(urldecode(encrypt($x, $key)));

(出于某种原因,他决定对结果进行URL编码)

$ php test.php 
LhBqW6pGRoQ=

编辑2

这是如何使用经典填充与pyDes的方法:

import pyDes
import base64

k = pyDes.triple_des('111111111111111111111111', mode=pyDes.CBC, IV=b'\0'*8,
                     pad='\0', padmode=pyDes.PAD_NORMAL)
d = k.encrypt("SECRET")
print base64.b64encode(d)

它给出的结果和mcrypt是一样的。

撰写回答