【发布时间】:2018-08-20 02:03:50
【问题描述】:
我有一些 AES/GCM 加密数据并想对其进行解密。我想绕过身份验证对其进行解密,因为数据不包含身份验证信息(数据由第三方应用程序加密)。我尝试使用 javax.crypto 包解密,它总是抛出标签不匹配错误。有没有办法绕过这个标签检查和解密数据。数据采用 AES128 加密,使用 12 字节初始化向量。
编辑:我为这个问题找到了一个临时解决方案。不确定这是否是正确的方法。
Key key = new SecretKeySpec(hlsKey, "AES");
GCMParameterSpec gCMParameterSpec = new GCMParameterSpec(96, initialisationVector);
final Cipher c = Cipher.getInstance("AES/GCM/NoPadding", "BC");
c.init(Cipher.DECRYPT_MODE, key, gCMParameterSpec);
byte[] nodata = new byte[len * 2];
System.arraycopy(cipherText, 0, nodata, 0, len);
byte[] plaindata = new byte[len * 2];
try {
int decrypted_index = 0;
while (decrypted_index < len) {
int cp = c.update(nodata, decrypted_index, nodata.length - decrypted_index, plaindata, decrypted_index);//doFinal(nodata);
decrypted_index += cp;
}
if(decrypted_index>=len){
System.arraycopy(plaindata, 0, plainText, 0, len);
retvalue=1;
}
} catch (Exception e) {
e.printStackTrace();
}
【问题讨论】:
-
描述没有任何意义。你说它是 AES-GCM 加密的。好的,这意味着它有一个身份验证标签。不支持零标签长度,最小长度(仅针对特殊情况)为32。然后您说它不包含身份验证信息。也许它没有使用 AES-GCM 加密。
-
@user1802492 也许您的意思是没有关联的数据,而不是它没有身份验证。没有身份验证的 GCM 模式毫无意义..
-
@JamesKPolk ,我从使用 AES/GCM 加密数据的第三方应用程序获取此数据,并且它不提供身份验证信息,我想对此进行解密以了解来自设备的实际数据。
-
我得到了这个问题的临时解决方案,不确定这是否正确
-
请将编辑放在答案而不是问题中。代码没问题,但前提是
c.update在验证身份验证标签之前总是返回明文数据。这是特定于实现的。它的内存效率也相对较低,但对于临时解决方案来说还可以。哦,是的,考虑到 while 循环内的测试,if(decrypted_index>=len){测试当然是废话;decrypted_index必须是>= len。
标签: java encryption aes-gcm