我正在尝试在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)
...
知道我在做什么错吗?任何帮助将不胜感激。
问题在于密钥和消息格式。密钥以十六进制字符串表示,调用.getBytes
将返回char字节,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}")
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句