很抱歉,如果这个问题的格式非常糟糕,这是我第一次在这个网站上问过一个......
因此,目前,我正在开发Chrome的JavaScript扩展程序,该扩展程序应该在不使用证书的情况下验证RSA签名。我不能,为了我的生活,弄清楚出了什么问题!我已经找了几个小时的答案或替代方法,但找不到任何专门为我的代码工作的东西。到目前为止,这是我的代码,以澄清我的问题:
签名生成功能
function sign(sk, m, certname) {
var key = new RSAKey();
key.setPrivate(sk.n, sk.e, sk.d);
var h = CryptoJS.SHA256(JSON.stringify(m)).toString(CryptoJS.enc.Hex);
h = new BigInteger(h, 16);
var sig = key.doPrivate(h).toString(16);
var obj = { "type": "SIGNED", "msg": m, "certname": certname, "sig": sig };
return JSON.stringify(obj);
}
验证
function verify(pk, signed) {
var key = new RSAKey();
var s = JSON.stringify(signed.sig).toString(CryptoJS.enc.Hex);
s = parseInt(s, 16);
var e = JSON.stringify(pk.e).toString(CryptoJS.enc.Hex);
log(e);
var n = JSON.stringify(pk.n).toString(CryptoJS.enc.Hex);
log(n);
var v = Math.pow(s, e) % n;
var hash = CryptoJS.SHA256(signed.msg).toString(CryptoJS.enc.Hex);
log(v);
log(hash);
return (v == hash);
}
在日志中,由于某种原因,v总是具有无穷大的值。我使用了错误的技术吗?有没有办法解决我当前的功能还是完全错误?
更新
我尝试将代码更改为:
function verify(pk, signed) {
var key = new RSAKey();
var s = JSON.stringify(signed.sig).toString(CryptoJS.enc.Hex);
s = new BigInteger(s, 16);
log("s: " + s);
var e = JSON.stringify(pk.e).toString(CryptoJS.enc.Hex);
e = new BigInteger(e, 2);
log("e: " + e);
var n = JSON.stringify(pk.n).toString(CryptoJS.enc.Hex);
n = new BigInteger(n, 16);
log("n: " + n);
key.setPublic(n, e);
var v = key.doPublic(s).toString(16);
log("v: " + v);
var hash = CryptoJS.SHA256(JSON.stringify(signed.msg)).toString(CryptoJS.enc.Hex);
log("hash: " + hash);
return (v == hash);
}
我知道我给出的值应该导致传递,但现在日志说v = 1而hash是(我会假设)它应该是什么。
答案 0 :(得分:2)
我想通了,我正在将n和e值解析为错误的类型。工作代码是:
function verify(pk, signed) {
var key = new RSAKey();
var s = JSON.stringify(signed.sig).toString(CryptoJS.enc.Hex);
s = new BigInteger(s, 16);
log("s: " + s);
key.setPublic(pk.n, pk.e);
var v = key.doPublic(s).toString(16);
log("v: " + v);
var hash = CryptoJS.SHA256(JSON.stringify(signed.msg)).toString(CryptoJS.enc.Hex);
log("hash: " + hash);
return (v == hash);
}