gpt4 book ai didi

java - AES 加密/解密 Java => OpenSSL 命令行工具

转载 作者:行者123 更新时间:2023-12-02 10:46:44 25 4
gpt4 key购买 nike

使用 AES/CBC/PKCS5Padding 和 IV f8/NeLsJ*s*vygV@ 作为 openssl 命令行进行 AES 加密/解密的下一个 Scala 代码的等效项是什么工具:

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

import javax.crypto.{BadPaddingException, Cipher}
import javax.crypto.spec.{IvParameterSpec, SecretKeySpec}

object AesCipher {
private val algo: String = "AES"

private val cipherCs: String = algo + "/CBC/PKCS5PADDING"

private val iv: IvParameterSpec = new IvParameterSpec("f8/NeLsJ*s*vygV@".getBytes("UTF-8"))

def encrypt(bytes: Array[Byte], secret: String): Array[Byte] = {
val encrypter = Cipher.getInstance(cipherCs)
val keySpec = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), algo)
encrypter.init(Cipher.ENCRYPT_MODE, keySpec, iv)
encrypter.doFinal(bytes)
}

def decrypt(bytes: Array[Byte], secret: String): Option[Array[Byte]] = {
try {
val decrypter = Cipher.getInstance(cipherCs)
val keySpec = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), algo)
decrypter.init(Cipher.DECRYPT_MODE, keySpec, iv)
Some(decrypter.doFinal(bytes))
}
catch {
case _: BadPaddingException => None
}
}

def main(args: Array[String]): Unit = {
val input = "Hello World"
val secret = "abcde1234567890*"
val inputBytes = input.getBytes(StandardCharsets.UTF_8)
val encryptedBase64 = Base64.getEncoder.encodeToString(encrypt(inputBytes, secret))
println(s"'$input' encrypted to '$encryptedBase64'")

val decryptedStr = decrypt(Base64.getDecoder.decode(encryptedBase64), secret).map { bytes =>
new String(bytes, StandardCharsets.UTF_8)
}
println(s"'$encryptedBase64' decrypted to '$decryptedStr'")
}
}

它给出下一个输出:

'Hello World' encrypted to 'f7YULyfM9wl/4tjNWvpwCQ=='
'f7YULyfM9wl/4tjNWvpwCQ==' decrypted to 'Some(Hello World)'

最佳答案

我们可以使用 openssl with enc argument 并传递 key 和 iv vector 作为参数来获得相同的结果。

初始步骤:

  1. 获取用作 key 的字符串的十六进制表示形式。我们的 key 是 abcde1234567890* 。我们可以运行 echo -n "abcde1234567890*" | od -A n -t x1 | tr -d ' ' 来获取十六进制表示形式,即 6162636465313233343536373839302a
  2. 获取用作 IvParameter 的字符串的十六进制表示形式。 IvParameter 是使用 f8/NeLsJ*s*vygV@ 构建的。我们可以运行 echo -n "f8/NeLsJ*s*vygV@" | od -A n -t x1 | tr -d ' ' 给出 66382f4e654c734a2a732a7679675640
  3. 根据 key 长度推导算法。我们的 key 大小是 16 字节或 16*8=128 位。所以它是 AES-128

加密: printf %s "Hello World" | openssl enc -e -aes-128-cbc -base64 -K 6162636465313233343536373839302a -iv 66382f4e654c734a2a732a7679675640 获取 Base64 格式的加密数据。它给出了 f7YULyfM9wl/4tjNWvpwCQ==

解密: printf "%s\n" "f7YULyfM9wl/4tjNWvpwCQ==" | openssl enc -d -aes-128-cbc -base64 -K 6162636465313233343536373839302a -iv 66382f4e654c734a2a732a7679675640 从 Base64 解密。它给出了 Hello World

关于java - AES 加密/解密 Java => OpenSSL 命令行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52498392/

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