encryption - ECIES:在 Javascript 中加密并在 Java/Kotlin 中解密
问题描述
我在 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
}
这是kotlin的解密代码
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 库引擎在后台使用的。现在,他们工作正常!
推荐阅读
- python - 如何在 setuptools_scm 中使用 PEP440 beta 标签?
- reactjs - 基于悬停或单击事件将类名添加到 React 组件
- laravel - 在 digitalocean 权限错误上部署 laravel 帆
- reactjs - 使用 ModuleFederationPlugin 在运行时将 publicPath 分配给单个遥控器
- android - 如何在运行时获取 Composable 的大小?
- javascript - 单击时将文件下载到特定位置
- python - 为什么 sklearn SVC 中 predict_proba 和 probA_ / probB_ 不匹配?
- arrays - 将项目动态添加到列表小部件
- python - pandas 根据前一行设置值,每组只设置一次
- excel - 查找一个表,与第二个“参考”表进行比较,并为第一个表中的单个条目输出多行