【问题标题】:3DES result in PHP produces different result from 3DES in PythonPHP 中的 3DES 结果与 Python 中的 3DES 产生不同的结果
【发布时间】:2014-05-02 23:49:33
【问题描述】:

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 没有;/ 有人在这里看到任何错误吗?

谢谢!

【问题讨论】:

  • 你在 PHP sn-p 的最后一行有 data 没有美元符号。
  • 谢谢,但在源代码中是好的 ;-) 我解决了这个问题。

标签: php python 3des


【解决方案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=

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 相同。

【讨论】:

  • 感谢您的回答。但问题是如何在 Python 中获得相同的 PHP 结果?
  • 好的,我解决了。 k = pyDes.triple_des('111111111111111111111111', mode=pyDes.CBC, IV=b'\0'*8, pad=b'\0')
  • 不,这不是您最初的问题。我编辑了我的答案以使用pyDes 演示普通填充的用法。
  • 你是对的,这是额外的问题 ;-) 。无论如何,非常感谢您的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2021-03-09
  • 2012-03-10
  • 2013-09-16
  • 2016-02-22
  • 1970-01-01
  • 2019-03-06
相关资源
最近更新 更多