Javascript ECDSA 获取私钥和​​公钥?

Posted

技术标签:

【中文标题】Javascript ECDSA 获取私钥和​​公钥?【英文标题】:Javascript ECDSA get private and public keys? 【发布时间】:2013-01-06 09:12:46 【问题描述】:

我只需要为 ECDSA 获取私钥和​​公钥对。斯坦福 javascript 加密库以非标准方式 (https://groups.google.com/forum/?fromgroups#!topic/sjcl-discuss/UaWUyMWS3Rs) 执行此操作,这对我来说毫无用处 - 比如制作一个为其他所有内容提供不同结果的 MD5 库有什么意义?

是否有在 javascript 中使用 ECDSA 的实际可行的方法?

【问题讨论】:

基本上我会远离 SJCL。原因很简单:已经发现了多个类似的问题——包括非常严重的验证错误,尽管 Mike 似乎知道他在说什么,但该库的测试还不够好,无法使用加密库。我会认真尝试通过使用 SSL(用于基于浏览器的加密)或包装​​库(用于“本地”开发)来解决问题。注意,我写了一个Java兼容库,所以我宁愿推广这个软件。 【参考方案1】:

jsrsasign 4.0.0 现在支持使用 EC 私钥和公钥进行 ECDSA 签名和验证。

http://kjur.github.io/jsrsasign/

我认为这符合您的需求。 这是一个演示页面。

http://kjur.github.io/jsrsasign/sample-ecdsa.html

【讨论】:

【参考方案2】:

首先,您链接到的评论谈论的是 ECDSA 签名的格式,而不是密钥对。其次,有点误导:

ECDSA 算法的输出是区间 [1, n-1] 中的两个整数。 ECDSA 标准 (FIPS 183-3) 没有指定将这对数字编码为字节数组的标准方法。

一种方法是将数字封装在 ASN.1 SEQUENCE 中。这是ANSI X9.62 和RFC3278 指定的方式。它是 Java 和 (AFAIR) Microsoft CNG/.NET 的标准输出。

另一种方法是用零填充数字,使它们具有与n 相同的字节长度,然后将它们连接起来。这是由 PKCS#11 和大多数智能卡实现完成的。

如果我正确阅读了源代码,SJCL 会以第二种方式对 ECDSA 签名进行编码。您可以轻松地将这种格式转换为第一种格式。

【讨论】:

是的,这是从 2 个二进制八位字节字符串到以相对简单的 BER 格式(带有两个 INTEGER 的 SEQUENCE)包装的两个 有符号 整数的简单转换。但请好好测试一下,因为这类转换经常确实出错。

以上是关于Javascript ECDSA 获取私钥和​​公钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hyperledger Fabric 中生成的 ECDSA 私钥和公钥进行加密和解密

Javascript:从私钥生成 ECDSA 公钥

如何使用 RustCrypto (ECDSA) 签署文件?

获取 X509Certificate2 私钥和公钥

如何从 OpenSSL 中的 ECDSA 私钥获取公钥?

如何读取 .pem 文件以获取私钥和​​公钥