c++ 无法通过CNG API将NodeJS生成的公钥加载到Windows中

kmbjn2e3  于 2023-04-13  发布在  Windows
关注(0)|答案(1)|浏览(156)

我在NodeJS中使用crypto库生成RSA公钥/私钥对:

crypto.generateKeyPair(
    "rsa",
    {
        modulusLength: 1024,
        publicKeyEncoding: {
            type: "pkcs1",
            format: "pem",
        },
        privateKeyEncoding: {
            type: "pkcs1",
            format: "pem",
        },
    },
    (err, publicKey, privateKey) => {
        fs.writeFileSync("/home/dev/priv.pem", privateKey);
        fs.writeFileSync("/home/dev/pub.pem", publicKey);
    } );

现在,当我想使用Windows Cryptographic CNG API加载公钥时,它失败了。CryptDecodeObjectEx返回0x 8009310 b(ASN 1错误标记值错误)。我使用this链接加载公钥。您知道我做错了什么吗?我应该以特定方式生成密钥吗?

8xiog9wr

8xiog9wr1#

请将“pkcs 1”字符串替换为“spki”。该代码不需要RSA密钥,它需要SubjectPublicKeyInfo编码的密钥。
SPKI是在X.509标准中定义的,它允许ASN.1编码指示任何类型的密钥。例如,它还可以包含基于椭圆曲线的各种类型的密钥。在内部,它包含PKCS#1编码密钥,但在这种情况下,密钥类型的指示符-在这种情况下是RSA密钥-是二进制编码而不是文本编码。
备注:

  • 您不应该使用“教科书RSA”,而应始终使用某种安全填充,如PKCS#1填充或OAEP填充。BCRYPT_PAD_NONE仅在您定义自己的方案或实现另一个现有方案时有用,这可能是最好的避免方法。如果您想加密更大的消息,请考虑混合加密(例如,加密AES密钥)。
  • 现在认为1024位的密钥太小;请使用至少2048位的密钥。
  • 您可能希望查看CMS甚至PGP等容器格式,而不是直接执行RSA加密。

相关问题