【发布时间】:2017-05-05 19:57:05
【问题描述】:
我正在尝试在 PHP 和 Java 之间使用 AES-256 位 GCM 加密。问题是我在 Android 的 Java 端收到了这个异常:
Decryption Error.!
javax.crypto.AEADBadTagException: error:1e06e065:Cipher functions:aead_aes_gcm_open:BAD_DECRYPT
我正在使用的代码: 在 PHP 方面
$algo = 'aes-256-gcm';
$iv = random_bytes(openssl_cipher_iv_length($algo));
$key = "secretKey12345678998765432112345"; // 256 bit
$data = "HelloWorld";
$ciphertext = openssl_encrypt(
$data,
$algo,
$key,
OPENSSL_ZERO_PADDING,
$iv,
$tag
);
echo base64_encode($key);
echo base64_encode($iv);
echo $ciphertext;
在 Java、Android 上,我正在使用以下代码:
static final int GCM_TAG_LENGTH = 16;
...
String decryptedText = null;
byte[] encodedData = Base64.decode(data, Base64.DEFAULT);
byte[] decodediv = Base64.decode(iv, Base64.DEFAULT);
byte[] decodedKey = Base64.decode(key, Base64.DEFAULT);
Log.e("data", new String(encodedData, 0));
Log.e("iv", new String(decodediv, 0));
Log.e("key", new String(decodedKey, 0));
Log.d("test", "test");
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
try {
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
c.init(Cipher.DECRYPT_MODE, originalKey , new GCMParameterSpec(GCM_TAG_LENGTH * 8,decodediv));
byte[] decodedData = c.doFinal(encodedData);
decryptedText = new String(decodedData, "UTF-8");
Log.e("MainActivity", "After decryption : "+ decryptedText);
} catch (Exception e) {
Log.e("MainActivity", "Decryption Error.!", e);
}
return decryptedText;
我正在使用此页面中的 php 代码:
zimuel.it/blog/authenticated-encrypt-with-openssl-and-php-7-1
我使用的是php v7.1.4
异常原因可能是什么?
【问题讨论】:
-
$tag是在哪里定义的?它的定义是什么? -
我没有定义 $tag 变量,这是来自 zimuel 页面:身份验证哈希存储在 $tag 变量中。该值由 openssl_encrypt 函数填充并作为参考返回。我是这类事情的初学者。
标签: java php android encryption aes