【问题标题】:AES Encryption/decryption Java => OpenSSL command line toolAES 加密/解密 Java => OpenSSL 命令行工具
【发布时间】:2018-09-25 12:36:12
【问题描述】:

使用 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)'

【问题讨论】:

    标签: java scala encryption openssl aes


    【解决方案1】:

    我们可以使用openssl with enc argument,并将key和iv向量作为参数传递,得到相同的结果。

    初始步骤

    1. 获取用作密钥的字符串的十六进制表示。我们的密钥是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. 从密钥长度推导出算法。我们的密钥大小是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2013-01-07
      • 2020-01-20
      • 2012-06-25
      相关资源
      最近更新 更多