Decrpyt AES-CCM Python 与 PHP

问题描述 投票:0回答:1

我正在尝试解密从智能设备获得的文本。它可以在 Python 中运行,但不能在 PHP 中运行。我只是从

openssl_decrypt
得到一个空答案,
openssl_error_string()
中没有错误或警告,也没有任何错误。我需要用 PHP 来做。我已经阅读了这个答案https://stackoverflow.com/a/61797909,但我仍然无法修复我的 PHP 脚本。因为我从设备获取数据,所以我无法更改随机数的长度(如果这会成为问题的话)(它是 13 个字节)。

此示例的修改版 AES-CCM https://www.geeksforgeeks.org/how-to-encrypt-and-decrypt-a-php-string/ 可以工作,所以这似乎不是问题与我的 PHP 安装一起。

工作的 python 脚本(不用担心,key 和 nonce 将会改变):

from __future__ import annotations

import binascii
import base64

from cryptography.hazmat.primitives.ciphers.aead import AESCCM

def decrypt_payload(
    payload: bytes, mic: bytes, key: bytes, nonce: bytes
) -> dict[str, float] | None:
    cipher = AESCCM(key, tag_length=4)
    try:
        data = cipher.decrypt(nonce, payload + mic, None)
        print("Decryption succeeded, decrypted data:", data.hex())
    except ValueError as error:
        print()
        print("Decryption failed:", error)
        return None

# =============================
# main()
# =============================
def main() -> None:
    payload = bytes(bytearray.fromhex("73ad3f07fe89"))
    mic = bytes(bytearray.fromhex("d8c82d06"))
    key = bytes(bytearray.fromhex("D77B34645356FB1333BAD6357B38CCCF"))
    nonce = bytes(bytearray.fromhex("7cc6b66242d3e3fc4512ac1267"))
    decrypt_payload(payload=payload, mic=mic, key=key, nonce=nonce)

if __name__ == "__main__":
    main()

工作的PHP代码:

<?php
$cipher = 'aes-256-ccm';
$payload = hex2bin("73ad3f07fe89");
$mic = hex2bin("d8c82d06");
$key = hex2bin("D77B34645356FB1333BAD6357B38CCCF");
$nonce = hex2bin("7cc6b66242d3e3fc4512ac1267");
if (in_array($cipher, openssl_get_cipher_methods())){
    $decrypted = openssl_decrypt($payload, $cipher, $key, OPENSSL_RAW_DATA, $nonce, $mic);
    echo "Error: " . openssl_error_string();
    echo $decrypted;
}
?>

预先感谢您的任何提示!

python php encryption aes
1个回答
0
投票

使用 PHP 生成的值进行测试:

  • 键:
    97093f1536825df218900bdd45d26a47
  • IV(随机数):
    ecf6b43043e5e3444a89a39488
  • 标签(麦克风):
    ea133e49
  • 有效负载:
    16d041edcde3ecfe6167d4da152d

在 PHP 中解密字符串“this is a test”没有问题。因此 13 字节 IV 不是问题。但是,Python 因这些测试值而失败并出现“InvalidTag”错误。该问题可能是有关标签验证的某些规范实现的差异。

© www.soinside.com 2019 - 2024. All rights reserved.