【发布时间】:2018-07-22 10:16:40
【问题描述】:
我已经使用 node-rsa 在 Node 中生成了一个私钥和公钥对,并且可以使用 node 中的这些密钥成功签名和验证。
我要做的是使用公钥的模数和指数来验证 .NET 中的签名(由节点中的私钥签名)。
例如我有一个字符串 =“foo”,它有一个由 Node.js 生成的签名“abc123”。 在 .NET 中,我想使用公钥的模数和指数来确认签名“abc123”对“foo”有效。
我想使用模数和指数而不是直接使用公钥的原因是因为我想创建一个 Web 服务,该服务在众所周知的地址公开一个 jwks.json 文件,任何人都可以在该地址验证令牌服务产生。
这是我在 node 中工作的代码:
let privateKey = fs.readFileSync('privateKeyPKCS1.pem');
let publicKey = fs.readFileSync('publicKeyPKCS1.pem');
let testpublicForExport = new NodeRSA(publicKey);
let keyComponents = testpublicForExport.exportKey('components-public');
console.log(keyComponents.n.toString('base64'));
let sign = crypto.createSign('RSA-SHA256');
let stringToSign = 'hello';
sign.update(stringToSign);
let sig = sign.sign(privateKey, 'base64');
console.log('sig='+sig);
let verify = crypto.createVerify('RSA-SHA256');
verify.update(stringToSign);
console.log(verify.verify(publicKey, sig, 'base64'));
这就是我为 .NET 准备的内容(我猜这部分有点错误):
string modulus = "AJ/dk3x2xQjvNTJpRh/yW6vURVhkubHVrXk33zd76k7/VnHS/8RE49IM+d137kvz8SgVQBOcN1P2yhOFuhbtYR7spwQ5lhob9GNkzR4l/ybgcriIIwGO0vmo264Xz2vERhZ7cVITOvn49VpWRbeVS3Gsn3ecSILdeoh2yNoevqwFGnuPeVyD4JOwo+JhEhXDlzth9UFu18x5k7NNLG2gywI7qX/qMd1+2rnDI33rSLpXiPXGQg9BCmatMx+R4sWV2AGOx9YxI/YBUTl0hSGcWtzsPxGA2zY3oBT0P9FGg+QYvVjHdAkuJsx9QpPo0TlNbrNvodj3KEUwxoGwnWu6Ick=";
int exponent = 65537;
string stringToSign = "hello";
string sig = "fGpD/SMPvS2CK9D4Z4ykUj+dRmPOIK92wdaRnhpAl3toOLdNT+96PUoCQKJ30UIRyXchIlmCvg+QH/MwimXueyY/oBwMH36EpajyraJZA/2RRA3/F7hRIT6/G9lJe69npeGyvMx+LlIov9B+I99KSLiVdYYPSrU4eUb3fe4wuZZd/cSIcwnIVvCrjOSUZAF09sfKx7Qt6LhTcQm2J332PsvotEZUuwTRsHh0QMMUd/eIWZ+yPfPGMX4D5WJEUxnlQT2f9Vfxx7JBnx5IDI9Jf6ohJCl5bymeKjh4ZsBqRINGG0aiElZdhGdcsGfhZGjRR2MMQkIo7ZSRrtaaKO5u9g==";
RSA rsa = RSA.Create();
rsa.ImportParameters(new RSAParameters()
{
Modulus = Convert.FromBase64String(modulus),
Exponent = BitConverter.GetBytes(exponent)
});
bool isVerified = rsa.VerifyData(Encoding.UTF8.GetBytes(stringToSign), Convert.FromBase64String(sig), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
如有必要,我很乐意使用充气城堡(虽然我不是很熟悉)。
TLDR;我正在尝试仅使用公钥的模数和指数来验证 RSA 签名。
谢谢。
【问题讨论】:
-
.NET 代码还能编译吗?
-
@MaartenBodewes 是的。它编译、运行并 isVerified = false
标签: .net node.js cryptography rsa