【问题标题】:Decrypt a ciphertext with Python that was encrypted using PHP使用 Python 解密使用 PHP 加密的密文
【发布时间】:2021-08-22 07:04:40
【问题描述】:

我有一个使用 PHP 加密的密文,我需要使用 Python 对其进行解密。 我有下面的 PHP 代码可以完美地解密密文。

$cryptText = "ciphertext";
$iv = "some iv"
$cipher = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CFB);

$password = "some password";
$salt = "some salt";

$cipher->setPassword($password, 'pbkdf2', 'sha512', $salt, 1000, 256 / 8);
$cipher->setIV($iv);
$plaintext = $cipher->decrypt(base64_decode($cryptText));

现在要使用 Python 解密它,我使用了 2 种方法

  1. 使用pyaes
from base64 import b64encode, b64decode
import hashlib
import pyaes
import os

ciphertext = 'ciphertext'
ciphertext = b64decode(ciphertext)

password = b'some password'
salt = b'some salt'
iv=b'some iv'

key = hashlib.pbkdf2_hmac('sha512', password, salt, 1000, 32)

aes = pyaes.AESModeOfOperationCFB(key, iv = iv)
decryptedData = aes.decrypt(ciphertext)
  1. PyCryptodome (Crypto.Cipher.AES)
import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
import hashlib

ciphertext = 'ciphertext'
ciphertext = b64decode(ciphertext)

password = b'some password'
salt = b'some salt'
iv=b'some iv'

key = hashlib.pbkdf2_hmac('sha512', password, salt, 1000, 32)

cipher = AES.new(key, AES.MODE_CFB, iv)
decryptedData = cipher.decrypt(ciphertext)

1 和 2 的结果相同,但与 PHP 的结果不匹配

【问题讨论】:

    标签: python php encryption cryptography aes


    【解决方案1】:

    PHP 代码使用与两个 Python 代码不同的段大小1)phpseclib v1 使用 CRYPT_RIJNDAEL_MODE_CFB 指定 CFB 模式,段大小为 128位(全块 CFB),而 PyCryptodomepyaes 默认使用 8 位的段大小。
    因此,可以用 PHP 代码解密的密文不能用任何一种 Python 代码解密。为此,必须在 Python 代码中将段大小显式设置为 128 位,

    • 对于PyCryptodome

      cipher = AES.new(key, AES.MODE_CFB, iv=iv, segment_size=128)
      
    • 对于pyaes

      cipher = pyaes.AESModeOfOperationCFB(key, iv=iv, segment_size=16)
      

      请注意,对于 pyaes,段大小以字节而不是位为单位指定。此外,pyaes 要求明文必须是段大小的整数倍,即对于全块 CFB,是 16 字节的整数倍。


    1) CFB 模式的段大小对应于每个加密步骤加密的位数,请参阅CFB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2018-09-23
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多