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没有;/有人在这里看到任何bug吗?
谢谢!
发布于 2014-05-02 12:41:12
PHP不处理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=EDIT2
下面是如何使用经典的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相同。
https://stackoverflow.com/questions/23428128
复制相似问题