【问题标题】:DES ECB decryption in PHP vs PythonPHP与Python中的DES ECB解密
【发布时间】:2020-05-26 23:11:02
【问题描述】:

我在 PHP 中有一个现有代码,用于解密 DES-ECB 模式加密字符串。我知道 DES 已被弃用,我应该改变一些东西,但现在就是这样。

示例代码如下所示:


$enc_string = '9bb6eab4c48319d09921c7400abdc811d54981744e9a2f40'; // A encrypted string in hex format
$key = 'F6d^*g'; // A 6 bytes decryption key

$decrypted_string = openssl_decrypt( 
                       pack("H*" ,$enc_string), //Use HEX to bin packing
                       'DES-ECB', $key, 
                       OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING ,''
                    );

请注意,我使用的是 6 字节长的解密密钥。

我现在必须将代码转移到 python。我想出了以下内容:

>>> from Crypto.Cipher import DES
>>> import binascii
>>> enc_string = '9bb6eab4c48319d09921c7400abdc811d54981744e9a2f40'
>>> key = 'F6d^*g'
>>> a = DES.new(key,DES.MODE_ECB) # This gives me error

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/DES.py", line 99, in new
    return DESCipher(key, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/DES.py", line 63, in __init__
    blockalgo.BlockAlgo.__init__(self, _DES, key, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
    self._cipher = factory.new(key, *args, **kwargs)
ValueError: Key must be 8 bytes long, not 6

>>> decrypted = a.decrypt(binascii.unhexlify(enc_string)) # This can't work with 6 bytes long key

问题:

  1. 为什么 6 字节长的密钥适用于 PHP 而不适用于 python?
  2. python 中有没有其他模块可以完成这项工作?

【问题讨论】:

  • 也许OPENSSL_ZERO_PADDING 选项意味着密码被填充。你可以在 python 中这样尝试:"F6d^*g\0\0" 。如果这不起作用,请尝试在字符串前面加上零。

标签: python php des


【解决方案1】:

PHP 实现向键添加零填充。手动为键添加填充后,以下代码可以正常工作:

from Crypto.Cipher import DES
import binascii
enc_string = '9bb6eab4c48319d09921c7400abdc811d54981744e9a2f40'
key = 'F6d^*g'.encode('utf-8')
key = key + b'\0' * (8 - len(key) % 8) ## add padding
a = DES.new(key, DES.MODE_ECB) # This gives me error

decrypted = a.decrypt(binascii.unhexlify(enc_string))
print(decrypted.hex())

【讨论】:

  • 谢谢,已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多