我正在使用JavaScript中的eccrypto库通过ECIES算法(curve-secp256k1)进行加密。JS代码中加密生成的密码无法在Kotlin中解密。
这是Javascript代码。
var eccrypto = require("eccrypto");
eccrypto.encrypt(publicKeyA, Buffer.from("Sic Mundus Creatus Est")).then(function(encrypted) {
val ciphertext = encrypted.ciphertext
//the hex encoded ciphertext is then sent to the server
}
这是科特林的解密代码
val cipherBytes = DatatypeConverter.parseHexBinary(ciphertext)
val cipher: Cipher = Cipher.getInstance("ECIES", "BC")
cipher.init(Cipher.DECRYPT_MODE, privateKeyA)
print( cipher.doFinal(cipherBytes) )
使用此代码进行解密,我得到了错误的块异常。
但是,如果我只是使用Java进行加密和解密,那没有问题。同样,使用Javascript进行加密和解密也可以正常工作。
我有什么想念的吗?
我找到了解决方案(或者说找出了实际的问题)。希望它对未来的开发者有所帮助:
javascript和Java实现之间的加密/解密不匹配是因为这些实现使用哈希算法和AES加密的不同参数。
使用BouncyCastle的Java ECIES实现具有糟糕的实现。它使用具有128位的AES,不使用安全的哈希算法,不对MAC进行可靠的检查,并且测试用例很少。
解决方法是,我现在使用Java的自定义书面ECIES实现,该实现使用SHA-512进行哈希,AES加密(使用256位密钥和AES / CBC / PKCS7Padding模式)。这个新的实现是eccrypto
javascript库引擎在幕后使用的。现在,它们工作正常!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句