gpt4 book ai didi

java - 如何在JAVA或SCALA中使用AES 256 CBC提取enc加密数据?

转载 作者:行者123 更新时间:2023-11-30 02:11:06 25 4
gpt4 key购买 nike

我需要有关使用 JAVA 或 SCALA 进行 AES 256 解密的帮助。我可以使用 openssl 进行提取。

Base 64 encoded Key: 5UX8IBWruBk1QmMZlZ1ESYmZRiC9w1DsrPpLIP9QF+Q=

Base 64 encoded payload: U2FsdGVkX19XO99r3f7LgNbPTW8tKexv26mCPUYTMTTiwSSayFvB/QraYJkfzKjEB+tisqzzrU9aZu/tQ5CIVrHHwkUxpyjKEjx3N5q+Ba3weNK/NthpcCsNw5GQxl3NWGoDPe2IFXHMpvpy9xb2mbMnPtwr3m4nF3JzRD6Ft34Q7bHmmTCDkh5kEF9Hx+nbeiLURqLJ1S5YeGq7xhZqalimuQPwT7cr3MPkWPGyZVtNtrKJfIRStoMqP9F2qvm6.

OpenSSL解密命令:

# extract the json from payload
$ openssl enc -d -aes-256-cbc -salt -in data.payload -out output.json -pass file:./key.otkey
上面提到的

输入key.otkeydata.payload文件包含上面提到的base64解码的字符串。我能够使用 openssl 进行解码并输出:

{"fields":["NSN","store_busn_dt","all_net_sales_amt","all_net_sales_qty","dt_net_sale_qty","brfst_net_sale_qty"],"data":[[38099,"2018-04-01",7675.900000000001,998,752,262]]}

但我无法使用 Scala 代码提取:

import java.nio.charset.StandardCharsets
import java.util.Base64

import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import javax.crypto.spec.IvParameterSpec
import javax.xml.bind.DatatypeConverter

object AesDecryption extends App {

val key: String = "5UX8IBWruBk1QmMZlZ1ESYmZRiC9w1DsrPpLIP9QF+Q="
val keyOut = Base64.getDecoder.decode(key)

val otKey: SecretKeySpec = new SecretKeySpec(keyOut, "AES")

val payload: String = "U2FsdGVkX19XO99r3f7LgNbPTW8tKexv26mCPUYTMTTiwSSayFvB/QraYJkfzKjEB+tisqzzrU9aZu/tQ5CIVrHHwkUxpyjKEjx3N5q+Ba3weNK/NthpcCsNw5GQxl3NWGoDPe2IFXHMpvpy9xb2mbMnPtwr3m4nF3JzRD6Ft34Q7bHmmTCDkh5kEF9Hx+nbeiLURqLJ1S5YeGq7xhZqalimuQPwT7cr3MPkWPGyZVtNtrKJfIRStoMqP9F2qvm6"

val encryptedData: Array[Char] = payload.toCharArray
//Base64.getDecoder.decode(payload)
val encData: Array[Byte] = DatatypeConverter.parseBase64Binary(new String(encryptedData))
println(new String(encData, StandardCharsets.ISO_8859_1))

val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")

// Generating IV.// Generating IV.
val ivSize = 16
val iv = new Array[Byte](ivSize)
// Extract IV.// Extract IV.
System.arraycopy(encData, 0, iv, 0, iv.length)
val ivParameterSpec = new IvParameterSpec(iv)

// extract data
cipher.init(Cipher.DECRYPT_MODE, otKey, ivParameterSpec)
val output: Array[Byte] = cipher.doFinal(encData)

// print result
println(new String(output, StandardCharsets.ISO_8859_1))

}

输出:

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)

上面提到的 json 输出除外。提前致谢。!

最佳答案

我认为您使用的初始化 vector (IV) 错误。

在您的代码中,您得出 ivParameterSpec (四)来自encData (反过来从有效负载中派生,即加密数据)

您在加密期间未明确指定它并基于 openssl docs :

If not explicitly given it will be derived from the password. See key derivation for details.

所以,我的建议是:

  1. 从用于加密的 key 文件中获取您需要使用的 IV openssl
  2. 在加密期间显式指定 IV ( openssl -iv <IV here> ) 并在解密期间重复使用它

更新:另外,请查看this answer代码示例(包括使用正确的 IV)。

关于java - 如何在JAVA或SCALA中使用AES 256 CBC提取enc加密数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093314/

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