【发布时间】:2020-05-13 18:18:45
【问题描述】:
我试图在 PHP 中解密一个用 AES-256-CCM 在 python 中使用 cryptography.hazmat 加密的密文
我在 python 代码中所做的是:
from cryptography.hazmat.primitives.ciphers.aead import AESCCM
from os import urandom
import base64
#Text To Encrypt
plaintext = bytes("message from python", encoding='utf-8')
#AES 256 Key Genrator
key = AESCCM.generate_key(256)
#Genrate Nonce
nonce= urandom(12)
#chipher
cipher = AESCCM(key, tag_length=8)
#Encryption
ciphertext = cipher.encrypt(nonce, plaintext, None)
然后我将 key 、 nonce 和 ciphertext 转换为 base64
key_b64 = base64.standard_b64encode(key)
ciphertext_b64 = base64.standard_b64encode(ciphertext)
nonce_b64 = base64.standard_b64encode(nonce)
在我的例子中我得到了这个结果
key = b'\xcb\x14\x96{,0(\x15\x86 \xda\xf8\x1b"i|M\xbd\xc5d\xe7\xa6I\xdf\x7f\xe11\xae\xe8\x8a\xb3j'
key_b64 = b'yxSWeywwKBWGINr4GyJpfE29xWTnpknff+ExruiKs2o='
nonce = b'\xc7f\xdc\xe3\xe4\x03>M\x9by\x92\x9d
nonce_b64 = b'x2bc4+QDPk2beZKd'
ciphertext = b'R\x9f\xe6D\\_\xdexC\x82\xf8\x8e\x9b;\x91\xc7OLo\xc2\t/\x8fV>G='
ciphertext_b64 = b'Up/mRFxf3nhDgviOmzuRx09Mb8IJL49WPkc9'
我在我的 PHP 代码中使用 base64 结果
<?php
$key_from_python = base64_decode('yxSWeywwKBWGINr4GyJpfE29xWTnpknff+ExruiKs2o=');
$ciphertext_from_python = base64_decode('ooGUzo0YiwKPs9+2wXySYEpdBNfSpyLUHm1M');
$nonce_from_python = base64_decode('Up/x2bc4+QDPk2beZKd');
$cipher = "aes-256-ccm";
if (in_array($cipher, openssl_get_cipher_methods())){
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$decrypted_mesage_from_pythom =
openssl_decrypt($encrypted_from_python_,$cipher,$key_from_python,$options=0 , $iv, $tag);
echo $decrypted_mesage_from_pythom;
}
它基于我在这里找到的一个例子http://php.babo.ist/#/en/function.openssl-encrypt.html 我找不到另一个例子
解密过程不会返回任何内容
真正让我困惑的是:
- python 代码中我们没有使用 IV 加密,但 PHP 需要 非NULL IV,如何解决?
-
$tag在 PHP 代码和 $tag_lenght 在 PHP 和 python(cipher = AESCCM(key, tag_length=8)) ? - 如果解密需要
nonce如何在我的PHP代码中使用?
如何获得这项工作?从 python 加密并在 PHP 中解密相同的密文
注意:我必须使用python加密和php解密,我必须使用AES-CCM,python代码是固定的,谢谢你的理解
谢谢
【问题讨论】:
-
您的 PHP 代码充满了如此多的错误,并且您的大量数据被错误转录或完全损坏,以至于无法为您提供任何有用的信息。我可以肯定地说的一件事是,您需要在 PHP 中打开错误报告,这样您才能看到代码生成的错误页面。
-
如果我在 PHP 中完成所有操作,解密和加密工作正常,但如果我尝试解密用 python 加密的内容,以及关于数据我将所有内容转换为 base64 以不丢失数据,它就不起作用,是的,错误报告已打开,并且没有错误报告,你能告诉我 php 中的错误是什么,至少是专业的错误
-
那么您运行的 PHP 肯定与您发布的完全不同。我敢打赌python中的
nonce是PHP中的iv。如果您想查看错误,只需复制/粘贴您发布的 PHP 并尝试运行它。变量被使用但未初始化,变量名称中的拼写错误,密文和随机数被完全错误转录,即使在修复 后密文长度不正确。 -
如果你很好地阅读了我的问题,你就会明白我在寻找什么,问题是,在 python 中我们有
noncekeyciphertext但在 PHP 中它需要$tag和$IV$ciphertext和可选的$tag_length,如果nonce被错误转录,你能给我一个更好的方法在 PHP 中重用,它给你错误的问题是因为它需要$tag这就是为什么我首先问这个问题的原因,它代表什么标签,如果你把IV写成nonce那么tag是什么,如果你把tag写成nonce我们要做什么IV怎么办?
标签: python php cryptography aes