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