2013-10-20 4 views
2

죄송합니다이 질문에 끔찍하게 포맷 된 경우,이 ... 그래서RSA 서명 확인

이 사이트에 하나의 요청했습니다 처음이다, 현재, 나는을위한 자바 스크립트 확장에 있어요 인증서를 사용하지 않고 RSA 서명을 확인해야하는 Chrome입니다. 그리고 나의 삶을 위해, 잘못되고있는 것이 무엇인지 알아낼 수는 없습니다! 나는 몇 가지 해답이나 대체 방법을 찾다가 몇 시간 씩 보았지만 특별히 코드에 맞는 것을 찾지 못했습니다.

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 해시 인 반면를 (말 나는 그것이 가정해야한다) 그것이 있어야하는 것.

+0

Math.pow()는 BigIntegers에서 작동하지 않을 것입니다. 나는 자바를 정말로 모른다. CryptoJS에는 상위 수준의 서명 및 확인 프리미티브가 있습니까? 그렇지 않다면, 당신은 key.doPublic() 같은 것을 찾아야한다. 또한 * 새 * RSA 키를 사용하여 확인을 수행 할 수 없으며 서명을 수행하는 데 사용 된 것과 동일한 * RSA 키 쌍의 공개 절반을 사용합니다. –

+0

@GregS 그건 내가 생각하고 있었지만 어떻게 접근 할 지 확신 할 수 없다. 나는 JS에 대해 거의 알지 못한다. 서명 된 메시지는 type, msg, certname, sig 형식으로 나오고 공개 키는 형식, n, e 형식으로 제공되므로 작성해야한다고 생각했다. 함수의 두 입력에 주어진 값을 사용하는 새 키. – BackwardsDDog

답변

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); 

}