首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的3 3DES结果与Python中的3 3DES生成不同的结果

PHP中的3 3DES结果与Python中的3 3DES生成不同的结果
EN

Stack Overflow用户
提问于 2014-05-02 12:24:06
回答 1查看 628关注 0票数 0

PHP代码:

代码语言:javascript
复制
$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):

代码语言:javascript
复制
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):

代码语言:javascript
复制
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吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-02 12:41:12

PHP不处理PKCS5填充,而是使用简单的零填充。这就是与使用PKCS5填充的Python相比得到不同结果的原因。

这里有一个在PHP中获取PKCS5填充的解决方案:https://chrismckee.co.uk/handling-tripledes-ecb-pkcs5padding-php/

编辑

我确认它适用于这个人的自由库:

代码语言:javascript
复制
$key = '111111111111111111111111';
$x = "SECRET";
print(urldecode(encrypt($x, $key)));

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

代码语言:javascript
复制
$ php test.php 
LhBqW6pGRoQ=

EDIT2

下面是如何使用经典的pyDes填充

代码语言:javascript
复制
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相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23428128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档