2
很抱歉,如果这个问题是可怕的格式,这是第一次我问一个在这个网站...RSA签名验证与无证书的JavaScript
所以,目前,我正在一个JavaScript扩展Chrome应该在不使用证书的情况下验证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,而哈希(我会假设)它应该是什么。
Math.pow()肯定不会使用BigIntegers,对不对?我不太了解Javascript。 CryptoJS不具有高级签名和验证原语吗?如果没有,你应该寻找类似key.doPublic()的东西来用于验证操作。此外,您无法使用* new * RSA密钥进行验证,因此您已使用用于执行签名的* same * RSA密钥对的公共一半。 –
@GregS这是有点我在想什么,但我不知道我将如何访问它。我对JS的知识知之甚少......签名的消息采用type,msg,certname,sig的格式,公钥以格式输入:type,n,e,所以我想我必须创建使用该函数的两个输入中给出的值的新密钥。 – BackwardsDDog