这是我的代码:
<?php
$secret="This is a secret message.";
$key="Secret key.";
$iv=openssl_random_pseudo_bytes(12);
$method="aes-256-gcm";
$encrypted=openssl_encrypt($secret,$method,$key,false,$iv);
$decrypted=openssl_decrypt($encrypted,$method,$key,false,$iv);
echo $encrypted;
echo "<br>";
echo $decrypted;
?>
我收到了加密邮件,但解密没有给出结果或错误消息。 相同的代码正在使用另一种方法,如aes-256-cbc。
答案 0 :(得分:2)
在我的系统上测试他的(在内部使用返回OpenSSL 1.0.1的PHP 5.3.10)返回一个与明文(消息)长度相同的密文。
这意味着GCM加密不会返回身份验证标记,只会返回内部CTR模式加密。这很可能是因为PHP包装器只是直接调用OpenSSL接口而不使用以下代码:
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
handleErrors();
在使用GCM的OpenSSL EVP(“更高级别”)加密的示例代码中找到。换句话说,标签需要单独检索。
单独处理标签确实有意义 - 它可以创建一个使用较少缓冲的更多在线实现 - 但这对您没有帮助。您可以使用AES-CBC,然后使用HMAC而不是IV和密文来替换GCM模式。使用单独的密钥进行加密和身份验证标记可以使此方案更安全。
PS由于初始化的不同,你无法直接使用CTR模式解密来再次检索明文。