我在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 errorTraceback (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問題:為什么 6 字節長的密鑰適用于 PHP,但不適用于 Python?Python中是否有任何其他模塊可以使它工作?
1 回答

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
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())
- 1 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消