AES-шифрование / дешифрование Java => инструмент командной строки OpenSSL - PullRequest
0 голосов
/ 25 сентября 2018

Что является эквивалентом следующего кода Scala для шифрования / дешифрования AES с использованием AES/CBC/PKCS5Padding с IV f8/NeLsJ*s*vygV@ в качестве инструмента командной строки openssl:

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

1 Ответ

0 голосов
/ 25 сентября 2018

Мы можем использовать openssl с аргументом enc и ключом передачи и вектором 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

...