我一直在开发一个数字签名node.js应用程序,后来我遇到了一些奇怪的行为,但我还是搞不懂。
首先,我以在此描述的形式生成了公钥/私钥对
然后,我实现了以下脚本
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('****************');
}不同的公钥如何验证签名,我在这里遗漏了什么吗?
发布于 2018-09-29 04:32:58
因此,如果您使用的是Unix上的OpenSSL rsa -pubout,那么显然您使用的是RSA-2048键盘中的rsa -pubout:
https://stackoverflow.com/questions/52560322
复制相似问题