Что является эквивалентом следующего кода 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)'