Node.js中的AES加密和Scala上的解密

谢伊·莫西(Shay Moshe)

我正在尝试在Scala上解密AES(使用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)
...

知道我在做什么错吗?任何帮助将不胜感激。

伊凡·斯坦尼斯拉夫(Ivan Stanislavciuc)

问题在于密钥和消息格式。密钥以十六进制字符串表示,调用.getBytes将返回char字节,UTF-8而不是实际的密钥字节。Java 8具有javax.xml.bind.DatatypeConverter可以将十六进制字符串转换为正确的字符串的功能Array[Byte]与相同msg,必须正确转换为Array[Byte]

您必须AES/ECB/NoPaddingecb在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}")

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android中的AES加密和Node.js中的解密

PHP中的加密和node.js中的解密

使用“ AES / GCM / NoPadding”在节点中加密文件并在Java中解密。在node.js中基本上是AES / GCM / NoPadding等效项

Node JS - 加密/解密

使用AES 256 CTR在Node JS中加密和在Golang中解密

在 Node.JS Crypto (aes-256-cbc) 中加密,然后在 OpenSSL CLI 中解密

Node.js AES解密iOS加密的NSString

使用 Node.js AES CTR 加密并使用 PyCrypto 解密

加快Node js中的AES解密

如何加密-解密Node.js加密aes256密码

在Coldfusion中加密,在Node.js中解密

如何使用node-rsa加密node.js中的数据并解密android中的加密数据?

Node JS和C#中的AES加密给出不同的结果

我是否在正确执行AES 256加密和解密Node.js?

如何在AES解密密文(Node.js加密)的开头修复“垃圾”?

node.js:加密需要解密的数据?

在 node.js 中重复 cryptojs aes 加密的替代方法

在Java中加密字符串,在node.js中解密,错误:解密错误

Node.js / Golang AES 256解密

使用Node.js加密模块加密并使用Java解密(在Android应用中)

使用python3和node js进行加密和解密

AWS开发工具包KMS-以Node.js加密和以Java解密

在node.js和android中使用JSON文件加密和解密

Node.js中的crypto模块与AES256解密中的CryptoJS的区别

在Node.js中加密字符串并在Java中解密

在node.js中解密使用A128CBC-HS256加密的JWT

为什么在C#中加密后,node.js中的RSA解密失败?

如何在Linux上为Node.js加密启用AES-NI(硬件加速)?

Node.js加密和解密使文件大小加倍