gpt4 book ai didi

Node.js verify.verify() 奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:24 28 4
gpt4 key购买 nike

我一直在开发数字签名 Node.js 应用程序,然后我遇到了我无法弄清楚的奇怪行为。

首先我生成了公钥/私钥对 described here

然后我实现了以下脚本

  const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('./private_key.pem');
const publicKey = fs.readFileSync('./public_key.pem');
const hashAlg = 'sha256'
const data = Buffer.from('test signature'.repeat(100), 'utf8');

let bytes = []
// sign
const sign = crypto.createSign(hashAlg);
sign.update(data);
const signature = sign.sign(privateKey);
fs.writeFileSync(`./signature.${hashAlg}`, publicKey);
const verifier = crypto.createVerify(hashAlg);
verifier.update(data);
const result = verifier.verify(publicKey, signature);
for(let i=0; i < publicKey.length ; i++){
try{
const verifier2 = crypto.createVerify('RSA-SHA256');
verifier2.update(data);
const invalidPublicKey = Buffer.from(publicKey);
invalidPublicKey[i] = invalidPublicKey[i]+1;
const result2 = verifier2.verify(invalidPublicKey, signature);
if(result2) {
bytes.push(i);
};
} catch (e) {
// error to be handled
}
}
if(bytes.length){
console.log('****************');
console.log(`key length: ${publicKey.length}`); // 451
console.log('Bytes to be changed, and the verify would be valid');
console.log(bytes.join(',')); // 49, 450
console.log('****************');
}

不同的公钥如何验证签名,我在这里遗漏了什么吗?

最佳答案

因此,鉴于您显然使用了 RSA-2048 key 对中的 OpenSSL rsa -pubout(如果这是在 Unix 上的话):

  • PEM 文件中偏移量 49 处的字符对偏移量 16 和 17 处的部分字节进行编码(特别是偏移量 16 的底部 4 位和偏移量 17 的顶部 2 位)。这些是 2 字节的 NULL,表示 X.509SubjectPublicKeyInfo 格式中 AlgorithmIdentifier 的参数部分。对于 RSA,没有算法参数(这就是编码使用 NULL 的原因),虽然该字段仍然应该被解码,但 Nodejs 可能不会这样做,因为知道它不需要并且会被忽略。

  • PEM 文件中偏移量 450 处的字符是终止页脚行的换行符。尽管格式定义要求这样做,但实际上并不需要解析它来提取文件的内容,即公钥 blob,也许 Nodejs 也不需要。

关于Node.js verify.verify() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52560322/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com