gpt4 book ai didi

java - 无法在java中解密aes-256-gcm加密数据

转载 作者:行者123 更新时间:2023-12-02 08:50:34 28 4
gpt4 key购买 nike

我已使用 OpenSSL aes-256-gcm 加密了一个文件。由于命令行不支持 aes-256-gcm,我已经安装了 LibreSSL,并且可以使用以下命令来加密文件的数据。

openssl enc -aes-256-gcm -K 61616161616161616161616161616161 -iv 768A5C31A97D5FE9 -e -in file.in -out file.out

我需要用Java解密file.out的数据,但我无法做到这一点。

示例代码:

    // Get Cipher Instance
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

String key = "61616161616161616161616161616161";
byte[] IV = "768A5C31A97D5FE9".getBytes();

// Create SecretKeySpec
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

// Create GCMParameterSpec
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(128, IV);

// Initialize Cipher for DECRYPT_MODE
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);

// Perform Decryption
byte[] decryptedText = cipher.doFinal(cipherText); // for the data by reading file.out

但是,我收到一个异常,提示 javax.crypto.AEADBadTagException: 标签不匹配!

最佳答案

这应该行不通。命令行 openssl enc 不支持 AEAD 密码/模式,尽管 1.0.1 的早期版本(2012-2014 年补丁 h 以下)无法捕获如果您错误地指定了这样的密码并默默地产生了错误输出。如果您实际上使用的是 LibreSSL 而不是 OpenSSL,它似乎继承了这个问题并且没有修复它,即使 LibreSSL 项目的重点是他们将修复由无能的 OpenSSL 人员造成的所有错误。

如果这是一个在 OpenSSL(以及 Java)中正常工作的密码,例如 aes-256-ctr,那么您唯一的问题就是 openssl enc -K -iv 将其参数放入hex(适用于 shell 上下文),而 Java crypto 是从可以处理二进制数据并期望其参数采用该形式的代码中调用的。因此,您提供给 OpenSSL 的值实际上是 16 字节(128 位)和 8 字节(64 位),而不是应有的 256 位和 128 位(对于 CTR;对于 GCM 和 IV 96 位是正确的,但如上所述,GCM 在这里不起作用)。 openssl enc 自动用(二进制)零填充-K -iv,但 Java 不会。因此你需要更多类似的东西

 byte[] key = Arrays.copyOf( javax.xml.bind.DatatypeConverter.parseHexBinary("61616161616161616161616161616161"), 32);
// Arrays.copyOf zero-pads when expanding an array
// then use SecretKeySpec (key, "AES")
// and IVParameterSpec (iv) instead of GCMParameterSpec

// but after Java8 most of javax.xml is removed, so unless you
// are using a library that contains this (e.g. Apache)
// or have already written your own, you need something like

byte[] fromHex(String h){
byte[] v = new byte[h.length()/2];
for( int i = 0; i < h.length(); i += 2 ) v[i] = Integer.parseInt(h.substring(i,i+2),16);
return v;
}

比较 AES encrypt with openssl command line tool, and decrypt in JavaBlowfish encrypt in Java/Scala and decrypt in bash (后者是相反方向,但需要匹配是一样的)

关于java - 无法在java中解密aes-256-gcm加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60802646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com