2016-02-29 136 views
1

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

// 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)规范来初始化密钥。但是,当我测试加密和解密时,相同的密钥起作用。

回答

1

事实证明,我并没有正确构建我的钥匙。我使用Microsoft XML规范构建了这些部分。我的错误是当我调用parseBigInt()时,我没有指定基数为16,所以所有的算术都关闭了。一旦我拥有了关键权利,一切都或多或少地落空了。