1

我有一个 html 文件来测试使用 jsrsasign 库的签名和验证。我使用 2048 RSA 密钥对字符串进行签名。然后我转身验证签名。这是我的代码:

// initialize
var hex = "48656c6c6f20776f726c6421"; // "Hello world!"
var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA", "prov": "cryptojs/jsrsa"});
// initialize for signature generation
sig.initSign(this.key); // at this point the key is a private key
// update data
sig.updateHex(hex); 
// calculate signature
var sigValueHex = sig.sign();

...

// initialize
var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA", "prov": "cryptojs/jsrsa"});
// initialize for signature validation
sig.initVerifyByPublicKey(this.key); // at this point the key is a public key
// update data
sig.updateHex(hex);
// verify signature
var isValid = sig.verify(sigValueHex);

// at this point isValid is still false

我究竟做错了什么?我已经通过代码追踪到一个名为“_rsasign_getAlgNameAndHashFromHexDisgestInfo”的方法调用。当它将摘要信息头与摘要的十六进制字节的头进行比较时,它们不匹配,因此验证失败。我签名的方式有问题吗?我没有使用 PEM (ASN.1/DER) 规范来初始化密钥。但是当我测试加密和解密时,相同的密钥有效。

4

1 回答 1

1

事实证明我没有正确构建我的密钥。我正在使用 Microsoft XML 规范来构建这些部分。我的错误是当我调用 parseBigInt() 时,我没有将基数指定为 16,所以所有算术都关闭了。一旦我掌握了正确的关键,一切都或多或少地到位了。

于 2016-03-02T20:34:26.327 回答