この質問がひどくフォーマットされている場合は申し訳ありません。このサイトで質問したのはこれが初めてです...
そのため、現在、証明書を使用せずに RSA 署名を検証することになっている Chrome の JavaScript 拡張機能に取り組んでいます。そして、私は一生、何がうまくいかないのか理解できません!いくつかの回答や代替方法を何時間も探しましたが、私のコードに特に適したものは見つかりませんでした。私の問題を明確にするためのこれまでのコードは次のとおりです。
署名生成機能
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と言っていますが、ハッシュは(私が推測するに)あるべきものです。