Tenho um valor que foi criptografado usando PHP openssl usando a cifra AES-CBC-256, mas a senha para o valor final também foi criptografada usando o mesmo método.openssl_encrypt($key, $cipher, $passphrase, 0, $iv)
Preciso conseguir descriptografar esses dados usando Python, mas estou tendo problemas com o tamanho do bloco.
Aqui está parte do código que tenho até agora. Testei descriptografá-lo em PHP e funciona corretamente. Meu valor final neste exemplo deve ser "Jimmy".
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
localKey = base64.b64decode('Po0KPxyF')
localIv = base64.b64decode('s8W+/a4jkp9mhO3NkCL7Yg==')
encrypted_value = base64.b64decode('hl5n6Nq5QYtgKIyLEVCupA==')
encrypted_key = base64.b64decode('MGRHRFlaMzhCR0lxb2VHS1JHQXcrWkV2bkJpNWFZb3cybW9iQW5KYTlOU0xKK1FHc2pPUW1MUE9JRU5zTXN1Rg==')
encrypted_iv = base64.b64decode('J31SrExr7KKIOertYIPhpQ==')
# First need to encrypted key that uses the local key as the passphrase
cipher_key = AES.new(pad(localKey,16), AES.MODE_CBC, localIv)
decrypted_key = cipher_key.decrypt(encrypted_key)
# Then decrypted the final value using the newly decrypted key
cipher_key = AES.new(unpad(decrypted_key,16), AES.MODE_CBC, encrypted_iv)
decrypted_value = cipher_key.decrypt(encrypted_value)
Consegui descobrir o código PHP que faz a descriptografia:
Saída:
( Demonstração )
Observações:
$localKey
é menor que 256 bits, entãoopenssl_decrypt()
o preenche com bytes nulos$encrypted_key
foi codificado em base64 duas vezes, então você precisa decodificá-lo duas vezes$decrypted_value
foi serializado comserialize()
Aqui está uma implementação Python (baseada no PyCryptodome):
Saída:
( Demonstração )