javascript - 从 Javascript 中的 X509 结构读取公钥

标签 javascript public-key x509certificate2

您好,我有一个具有 X509 结构的编码公钥,我想从中提取模数和公共(public)指数,我正在使用以下 ASN.1 解码器 http://lapo.it/asn1js/读取 key ,但我在得到的结果中看不到模数或公共(public)指数。

这是我想读的关键。

30819e300d06092a864886f70d010101050003818c00308188028180599a96c54ef07f5288a061a56386376fd9e2e0a253cb035f2b0c65c85c99153a848a8247d9e28d8be1dbad5e754e8393e591cc53e5abec2f0a44b4844646cc283123fdd799c50dd5acd1277fd9afeb9c5a12a53b9edfff0ac53d6e94e5f1678c3bd0ccd8d08b18d4a42f845b79b8b19203e24e189801ca396f5732bfe628edeb0203010001

这是我从解码器得到的结果。

SEQUENCE(2 elem)
SEQUENCE(2 elem)
OBJECT IDENTIFIER1.2.840.113549.1.1.1
NULL
BIT STRING(1 elem)
SEQUENCE(2 elem)
INTEGER(1023 bit)
INTEGER65537

提前致谢。

//Example of what I am expecting to find.
    30 819f // SEQUENCE
      30 0d // SEQUENCE
        06 09 2a864886f70d010101 // OBJECT IDENTIFIER of RSA
        05 00 // NULL (parameter)
      03 818d // BIT STRING
        00 // using all following bits
        30 8189 // SEQUENCE
          02 8181 // (signed) INTEGER
            00 // padding (signed INTEGER) followed by the modulus
            95e15f182ec7b6e84786c0ee54e3bb72af0461e6fd859a3625f38dcd3fdec80d
            fcc51a44756ec7cd6c14b430d55670460c5143efadd1ade7380e890e9957d6e6
            b38f35412862cc955e04d1928f21c0d2f7bc48c3855276f0e7c1b45a558e3a01
            3b969cbfaebca42b748e64bff787f86ec5f0adcd94428c4ab8ca6d2b710d785b
          02 03 // (signed) INTEGER
            010001 // public exponent (4th number of Fermat)

最佳答案

假设您像这样使用 asn1js,

var hex = Hex.decode("30819e300d06..."); // key truncated for this example

// decode key
var mykey = ASN1.decode(hex);

您首先需要找到模数字节的起始位置以及模数长度

var modStart = mykey.sub[1].sub[0].sub[0].posContent();
var modLen = mykey.sub[1].sub[0].sub[0].length;

现在循环流并填充 modbytes 数组

// read modulus bytes
var modbytes = [];

for(var x = 0; x < modLen; x++) {
    modbytes.push(mykey.stream.enc[x+modStart]);
}

// modbytes now contains array like [89, 154, 150, 197, 78...]

由于指数是整数,因此可以很容易地这样读取

var exponent = mykey.sub[1].sub[0].sub[1].content();
// returns 65537

您可以将值转换为十六进制,如下所示,

// in the case of the exponent its simple
exponent.toString(16); // returns "10001"

对于模数,您需要迭代模数字节并连接它们的十六进制值

var modulusHex = "";
for(var x = 0; x < modbytes.length; x++) {
    var hexByte = modbytes[x].toString(16);

    // might need padding before appending
    modulusHex += (hexByte.length == 1) ? "0"+hexByte : hexByte;
}

// modulusHex now contains something like
// 599a96c54ef07f5288a061a5... 

关于javascript - 从 Javascript 中的 X509 结构读取公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14059579/

相关文章:

javascript - 读取 SharePoint 列表并通过 JavaScript 函数将数据放在 HTML 文件中

javascript - 如何颠倒图像顺序

javascript - 使用 Angular.js 从 json 文件获取数据时出现错误

algorithm - 有没有公​​钥/私钥的快速简单的加密算法?

c# - 仅从公钥创建 RSACryptoServiceProvider

c# - Xamarin。 X509Certificate 和 ClientBase

saml-2.0 - 仅使用公钥的 CER 证书

javascript - Materializecss 工具提示不适用于 Angularjs

c# - 尝试从 Windows certstore 读取私钥时出现异常

git - 将 Nitrous.io 连接到 Bitbucket Git SSH 公钥