这个问题是大量工作的结果,它极大地影响了我们在共享公钥的方式上可能做出的一些决定。
我们有一个内置在 Node 中的后端服务器,它使用未压缩的 base64 编码密钥发布公钥。我们使用这些公钥来创建可用于加密我们的有效负载的密钥。这在使用 ECDH 密钥对的 Node(并使用浏览器的加密包)中是微不足道的,如下所示:
const b64ServerPublicKey = "BDnHVd+/0f+JIQihtVONQ4le9bNJtnU01as7Y1ucIFn+SNnDpV/2f7P2tcD8OaBDfTAV6qjqBURFsxD+WcRcoGY=";
const b64ClientPublicKey = key_pair.getPublicKey("base64", "uncompressed"); //for sending to server
const secret_key = key_pair.computeSecret(b64ServerPublicKey, "base64", "base64");
不幸的是,我们正在尝试用其他语言(如 Java)构建密钥交换代码,这绝非易事。Java 似乎只想处理编码的X.509 公钥,因此如果不手动构造密钥,我们就无法创建或解析 base64 未压缩/未编码的密钥。我发现这篇文章展示了如何使用曲线上的 X/Y 坐标对 ECPublicKey 对象进行编码/解码,但我需要预先添加一个 0x04 字节并将偏移量增加 1。我是否缺少更简单的方法来做到这一点,或者我们应该改变我们的节点服务器生成公钥的方式?我担心我们支持其他语言,我们会遇到类似的问题。