javascript - 无证书 JavaScript 的 RSA 签名验证

标签 javascript rsa signature verification sha256

抱歉,如果这个问题的格式很糟糕,这是我第一次在这个网站上问这个问题......

目前,我正在为 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,而哈希值(我认为)应该是它应该的样子。

最佳答案

我发现了,我将 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);

}

关于javascript - 无证书 JavaScript 的 RSA 签名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474389/

相关文章:

Java 服务器的 Swift RSA 加密公钥失败

c++ - 证书颁发机构的 openssl 函数问题

c++ - 使用基指针调用派生对象函数

javascript - d3 将刻度日期变换到 x 位置?

javascript - 在 body 中定义不同的 window.open 目标 URL

javascript - 如何使用 Javascript 库选择元素

javascript - http-Get 请求,响应为空

node.js 加密签名和 openssl 签名不匹配

c# - 解析通用方法签名时是否考虑了约束?

java - 获取用 Java 或 Groovy 填充的有效 oauth_signature 的绝对最小代码?