AES-256-GCM模式解密在php中失败

时间:2015-02-14 15:03:17

标签: php encryption openssl aes aes-gcm

这是我的代码:

<?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。

1 个答案:

答案 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模式解密来再次检索明文。