【问题标题】:Python des-ede-cbc equivalentPython des-ede-cbc 等价物
【发布时间】:2018-04-05 18:22:51
【问题描述】:

我目前在 PHP 中有一个 3DES (des-ede-cbc) 的加密和解密如下:

php > $key = '0000000000000000';
php > $iv = '00000000';
php > $plaintext = '1234567812345678';
php > $ciphertext = openssl_encrypt($plaintext, 'des-ede-cbc', $key, 0, $iv);
php > echo $ciphertext;
LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P

php > $plaintext = openssl_decrypt($ciphertext, 'des-ede-cbc', $key, 0, $iv);
php > echo $plaintext;
1234567812345678

我需要能够获取密文并在 python 中解密。我找到的最接近的是 pycrypto:https://gist.github.com/komuw/83ddf9b4ae8f995f15af

我的尝试:

>>> key = '0000000000000000'
>>> iv = '00000000'
>>> cipher_decrypt = DES3.new(key, DES3.MODE_CBC, iv)
>>> plaintext = cipher_decrypt.decrypt('LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P')
>>> plaintext
b']v\xdf\xa7\xf7\xc0()\x08\xdf\xcb`4\xa7\x10\x9e\xaf\x8c\xb6\x00+_\xb3?2\x1d\\\x08\x01\xfa\xf2\x99'

我不确定它有什么不同。它是 CBC 模式的 3DES。我不确定 ede 部分是什么意思,但我似乎找不到任何东西来模拟确切的 openssl 模式。

版本信息:
Python 3.6.5
PHP 7.1.3

【问题讨论】:

  • IIRC,“EDE”代表“加密-解密-加密”;它只是意味着您使用的是加密-解密-加密 3DES,而不是其他更罕见(且不太有用)的三倍 DES 方法之一。
  • 是的:see here 了解详情。 (我很确定这里的所有细节都无关紧要——您几乎可以肯定在这两种情况下都使用 TDEA 3-key EDE——但即使我是对的,它也可能值得一读。)
  • 密文采用base64编码,plaintext = cipher_decrypt.decrypt(base64.decodebytes(b'LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P'))返回b'1234567812345678\x08\x08\x08\x08\x08\x08\x08\x08'。这能回答你的问题吗?

标签: php python 3des


【解决方案1】:

您从 PHP 获得的字符串是 base64 编码的。

from Crypto.Cipher import DES3
from base64 import decodebytes

key = b'0000000000000000'
iv = b'00000000'

cipher_decrypt = DES3.new(key, DES3.MODE_CBC, iv)
plaintext = cipher_decrypt.decrypt(decodebytes(b'LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P'))

print(plaintext.decode("utf-8"))

>>>1234567812345678

【讨论】:

  • 救命稻草。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2016-10-10
  • 2012-06-24
相关资源
最近更新 更多