【问题标题】:Verify a signature using a certificate RSA Javascript使用证书 RSA Javascript 验证签名
【发布时间】:2013-10-23 09:00:01
【问题描述】:

我正在尝试使用证书验证签名。我们必须从 CA 下载所需的证书,验证证书,然后验证签名。我不知道,我希望有人能解释一下。这是我到目前为止所知道的。

为了给消息签名,我使用了以下代码:

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 = new BigInteger(s, 16);
key.setPublic(pk.n, pk.e);
var v = key.doPublic(s).toString(16);
var h = CryptoJS.SHA256(JSON.stringify(signed.msg)).toString(CryptoJS.enc.Hex);
return (v == h);
}

为了验证证书,我使用了以下代码:(编辑:这是新的证书验证功能)。

function verifyCertificate(signedCert, certname) {
var key = new RSAKey();
var s = JSON.stringify(signedCert.sig).toString(CryptoJS.enc.Hex);
s = new BigInteger(s, 16);
key.setPublic(CApk.n, CApk.e);
var v = key.doPublic(s).toString(16);
var h = CryptoJS.SHA256(JSON.stringify(signedCert.msg)).toString(CryptoJS.enc.Hex);
return (v == h);
}

就是这样。任何人都可以请帮忙。我不知道该怎么做。

编辑:好的,我想我已经解决了自己的问题(在回复的帮助下)。这是返回所有积极结果的代码:

function verifyWithCert(sig) {
// 1. Download the required certificate from the CA
// 2. Verify the certificate
// 3. Verify the message
var certKey = new RSAKey();
var loadedCert = loadCert(sig.certname);
var certS = JSON.stringify(loadedCert.sig).toString(CryptoJS.enc.Hex);
certS = new BigInteger(certS, 16);
certKey.setPublic(CApk.n, CApk.e);
var certV = certKey.doPublic(certS).toString(16);
var certH = CryptoJS.SHA256(JSON.stringify(loadedCert.msg)).toString(CryptoJS.enc.Hex);
var verifyResult;
if (certV == certH) {
    verifyResult = true;
}
var Sigkey = new RSAKey();
var s = JSON.stringify(sig.sig).toString(CryptoJS.enc.Hex);
s = new BigInteger(s, 16);
Sigkey.setPublic(loadedCert.msg.subject.pk.n, loadedCert.msg.subject.pk.e);
var v = Sigkey.doPublic(s).toString(16);
var h = CryptoJS.SHA256(JSON.stringify(sig.msg)).toString(CryptoJS.enc.Hex);
var verifySignature;
if (v == h) {
    verifySignature = true;
}
var result = { "certificateFound": loadedCert ,"certificateVerified": verifyResult ,"signatureVerified": verifySignature };
return result;
}

【问题讨论】:

标签: javascript json cryptography rsa cryptojs


【解决方案1】:

(给 StackOverflow 的其他成员的说明,我也在这个课程中,所以我提到了一些关于变量和其他引用的东西。)

在 verifyCertificate 函数中:

function verifyCertificate(signedCert, certname) {
    var loadedCert = loadCert(certname);

    // signedCert is the same as loadedCert above, the button runs the
    // loadCert function and outputs the contents into the textarea,
    // so the following will always be true.

    var originalSig = JSON.stringify(signedCert.sig);
    var loadedSig = JSON.stringify(loadedCert.sig);
    log(loadedSig);
    return (originalSig == loadedSig);
}

那我应该如何验证证书呢?我将加载的 CA 证书与什么进行比较?我想也许可以将证书中的公钥与用于签署消息的公钥进行比较,但是......我不知道。我很困惑。

不过,您在正确的轨道上,请考虑 verify() 函数,以及文件顶部 CApk 变量中包含的详细信息。您能否对来自 loadCert() JSON 响应的消息进行哈希处理,并将其与以下输出相匹配:

function verify() {
    //[...]
    key.setPublic(pk.n, pk.e);
    //[...]
}

假设您更改了一些变量?

这至少与我使用的方法相似,所以我希望它是正确的。我想您是否可以使用 CApk 中的详细信息对消息进行哈希处理,并将其与 JSON 响应中包含的消息的哈希值进行比较,从而验证证书。希望。

【讨论】:

  • 我已经调整了验证证书功能,它可以工作,但现在我试图将其应用于验证 RSA 签名和证书一,它只是不工作。所以我又迷路了。我讨厌 JavaScript。我几乎没有这方面的经验,这只是一种折磨。
  • 注意:刚刚编辑了原始问题以添加新的 certverify 功能
  • 好的,我想我已经成功了。它说它正在验证一切,没有错误等。所以我认为这是正确的。除了... 你知道他怎么说他的核心任务解决方案在 5 到 10 行之间吗?好吧,这大约是 20 行代码,所以我不知道我是否应该怀疑我的代码。我会将其添加到原始问题中。
【解决方案2】:

“验证证书”方法存在错误。 您需要使用 355a3_main 中给出的 CA 的公钥来测试证书的签名以进行验证,此处给出的代码只会验证您的证书,并且会给出假阳性以供休息

我认为这应该可行

var loadedCert = loadCert(certname);
var originalSig = JSON.stringify(signedCert.sig);
var loadedSig = JSON.stringify(loadedCert.sig);
log(loadedSig,originalSig);

var key = new RSAKey();
var s = JSON.stringify(signedCert.sig).toString(CryptoJS.enc.Hex);
s = new BigInteger(s, 16);
key.setPublic(CApk.n, CApk.e);
var v = key.doPublic(s).toString(16);
var h = CryptoJS.SHA256(JSON.stringify(signedCert.msg)).toString(CryptoJS.enc.Hex);

if (originalSig == loadedSig && v==h)
return true;
else
return false;

【讨论】:

    【解决方案3】:

    既然如此,那么任意长度的长消息呢?

    【讨论】:

    • 是的,没有。我只是被困住了。我收到了短消息,但是是的……没有长消息哈哈
    • 如果我们以 s 为模来计算长消息,n 应该这样吗? ar m= asciiToHex(msg); var key = new RSAKey(); var s = JSON.stringify(m).toString(CryptoJS.enc.Hex); s= new BigInteger(s, 16);
    • 我们可以但是....到底要怎么做呢?您必须编写所有数学代码。我们认为也许将消息分成单独的块,然后对单独的块进行编码/解码,然后组合在一起返回会起作用,但是......对于一个不是“编程单元”(或“数学单元”)的单元来说,工作量很大正如他们不断告诉我们的那样。所以是的......现在我们也在尝试一些完全不同的东西,涉及对称密码。但它不起作用(加密是……但是描述,不是那么多)。我们迷路了哈哈
    【解决方案4】:
    Except... you know how he says his solutions for the core tasks are between 5 and 10 lines? well this is about 20 lines of code, so i don't know if I should be suspicious of my code
    

    我在带有证书功能的RSA签名验证中再次使用了verify和verifycertificate功能。这将使您的代码相当短。我真的很感激这篇文章,你们都是我的救星。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2016-01-15
      • 2019-11-24
      • 1970-01-01
      • 2016-09-26
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多