什么样的 RSASignaturePadding 与 PKCS#8 密钥一起使用?

dbJ*_*nes 5 .net c# cryptography rsa cng

我正在尝试使用 SHA-256 和 RSA 来使用 PKCS#8 密钥对字符串进行签名。

RSACng.SignData()方法需要 RSASignaturePadding,其中选项为Pkcs1Pss。我找不到任何明确的信息来告诉我哪个将用于 PKCS#8。

    // Decode Token (token is Base64 & PKCS8 encoded)
    byte[] decodedKey = Convert.FromBase64String(myBase64String);
    CngKey key = CngKey.Import(decodedKey, CngKeyBlobFormat.Pkcs8PrivateBlob);

    // Build signature
    string signature = "123abc";

    byte[] bytes = Encoding.UTF8.GetBytes(signature);

    // Sign signature using key & SHA256 w RSA
    var unsigned = new RSACng(key);
    byte[] data = unsigned.SignData(bytes, HashAlgorithmName.SHA256, <??????>);
Run Code Online (Sandbox Code Playgroud)

密码学对我来说是全新的,所以如果我的方法有偏差,请告诉我。

Maa*_*wes 4

PKCS#8 描述了一种对私钥进行编码/解码的方法。如果该密钥是 RSA 密钥,那么该密钥确实可以用于生成 RSA 签名。

填充不需要任何特定的关键属性。它只需要密钥的大小作为输入,对于 RSA,它与模数大小相同(作为无符号数,以位为单位)。

对于 RSA 签名生成,后面的模幂始终相同。它将填充的哈希值提高到私有指数。因此,您可以选择要用于特定协议的填充。

如果您不想指定协议,您可以查看 CMS(加密消息语法) - 以前称为 PKCS#7。


对于具有 PKCS#1 v1.5 填充的 RSA,填充是确定性的,这使得整个 RSA 签名生成具有确定性。在 PSS 的情况下,它是一个非确定性操作,即涉及随机数生成器。较新的 PSS 具有比 PKCS#1 v1.5 更好的安全性证明,但 PKCS#1.5 尚未被破解。