dbJ*_*nes 5 .net c# cryptography rsa cng
我正在尝试使用 SHA-256 和 RSA 来使用 PKCS#8 密钥对字符串进行签名。
该RSACng.SignData()方法需要 RSASignaturePadding,其中选项为Pkcs1和Pss。我找不到任何明确的信息来告诉我哪个将用于 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)
密码学对我来说是全新的,所以如果我的方法有偏差,请告诉我。
PKCS#8 描述了一种对私钥进行编码/解码的方法。如果该密钥是 RSA 密钥,那么该密钥确实可以用于生成 RSA 签名。
填充不需要任何特定的关键属性。它只需要密钥的大小作为输入,对于 RSA,它与模数大小相同(作为无符号数,以位为单位)。
对于 RSA 签名生成,后面的模幂始终相同。它将填充的哈希值提高到私有指数。因此,您可以选择要用于特定协议的填充。
如果您不想指定协议,您可以查看 CMS(加密消息语法) - 以前称为 PKCS#7。
对于具有 PKCS#1 v1.5 填充的 RSA,填充是确定性的,这使得整个 RSA 签名生成具有确定性。在 PSS 的情况下,它是一个非确定性操作,即涉及随机数生成器。较新的 PSS 具有比 PKCS#1 v1.5 更好的安全性证明,但 PKCS#1.5 尚未被破解。