AES-шифрование в Node.js и дешифрование в Scala - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь расшифровать AES в Scala (используя javax.crypto.Cipher ), зашифрованный текст был зашифрован в приложении Node.js (используя aes-js ).и получаю ошибку

  • Я использую электронную кодовую книгу

Узел (шифрование)

var aesjs = require("aes-js");

// An example 128-bit key
var key = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];
var key_128_array = new Uint8Array(key);

var key_128_hex = aesjs.utils.hex.fromBytes(key_128_array);
console.log(key_128_hex);
// 0102030405060708090a0b0c0d0e0f10


// Convert text to bytes
var text = 'TextMustBe16Byte';
var textBytes = aesjs.utils.utf8.toBytes(text);

var aesEcb = new aesjs.ModeOfOperation.ecb(key_128_array);
var encryptedBytes = aesEcb.encrypt(textBytes);

// To print or store the binary data, you may convert it to hex
var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
console.log(encryptedHex);
// "a7d93b35368519fac347498dec18b458"

Scala (расшифровка)

import org.bouncycastle.jce.provider.BouncyCastleProvider
import javax.crypto.Cipher

val cipher = Cipher.getInstance("AES", new BouncyCastleProvider())

val key = "0102030405060708090a0b0c0d0e0f10";
val aesKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES")
cipher.init(Cipher.DECRYPT_MODE, aesKeySpec)

val msg = "a7d93b35368519fac347498dec18b458"
val decrypted = cipher.doFinal(msg.getBytes())
log.debug(s"decrypted data ${decrypted}")

И я получаю следующую ошибку:

javax.crypto.BadPaddingException: pad block corrupted
        at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
        at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
        at javax.crypto.Cipher.doFinal(Cipher.java:2164)
...

Есть идеи, что я делаю не так?Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 13 февраля 2019

Проблема с ключом и форматами сообщений.Ключ представлен в виде шестнадцатеричной строки, и вызов .getBytes вернет байты символов в UTF-8, а не фактические байты ключа.В Java 8 есть javax.xml.bind.DatatypeConverter, который может преобразовать шестнадцатеричную строку в правильную Array[Byte].То же самое с msg, оно должно быть правильно преобразовано в Array[Byte]

Вы должны указать шифр AES/ECB/NoPadding, поскольку вы используете ecb в node-js.

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

object DecryptApp extends App {

  import org.bouncycastle.jce.provider.BouncyCastleProvider
  import javax.crypto.Cipher

  val cipher = Cipher.getInstance("AES/ECB/NoPadding", new BouncyCastleProvider())

  val key = "0102030405060708090a0b0c0d0e0f10"
  val keyBytes = DatatypeConverter.parseHexBinary(key)
  val aesKeySpec = new SecretKeySpec(keyBytes, "AES")
  cipher.init(Cipher.DECRYPT_MODE, aesKeySpec)

  val msg = "a7d93b35368519fac347498dec18b458"
  val decrypted = cipher.doFinal(DatatypeConverter.parseHexBinary(msg))
  println(s"decrypted data ${decrypted.map(_.toChar).mkString}")

}
...