首页 > 解决方案 > 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 中的加密和解密也可以正常工作。

有什么我想念的吗?

标签: encryptionencryption-asymmetricecies

解决方案


我找到了解决方案(或者说找出了实际问题)。希望它可以帮助未来的开发人员:

javascript 和 java 实现之间的加密/解密不匹配是因为这些实现使用了不同的哈希算法和 AES 加密参数。

使用 BouncyCastle 在 Java 中的 ECIES 实现有一个糟糕的实现。它使用 128 位的 AES,不使用安全散列算法,没有对 MAC 进行稳健检查,并且测试用例很少。

作为一种解决方法,我现在为 Java 使用自定义编写的 ECIES 实现,它使用 SHA-512 进行哈希、AES 加密(使用 256 位密钥和 AES/CBC/PKCS7Padding 模式)。这个新的实现是eccryptojavascript 库引擎在后台使用的。现在,他们工作正常!


推荐阅读