我正在尝试解密从智能设备获得的文本。它可以在 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;
}
?>
预先感谢您的任何提示!
使用 PHP 生成的值进行测试:
97093f1536825df218900bdd45d26a47
ecf6b43043e5e3444a89a39488
ea133e49
16d041edcde3ecfe6167d4da152d
在 PHP 中解密字符串“this is a test”没有问题。因此 13 字节 IV 不是问题。但是,Python 因这些测试值而失败并出现“InvalidTag”错误。该问题可能是有关标签验证的某些规范实现的差异。