我正在尝试使用带有RSA的SHA-256签署带有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, <??????>);
密码学对我来说都是新手,所以如果我的方法有所了解,请告诉我。
答案 0 :(得分:3)
PKCS#8描述了一种编码/解码私钥的方法。如果此密钥是RSA密钥,则该密钥确实可用于生成RSA签名。
填充不需要任何特定的键属性。它只需要键的大小作为输入 - 对于RSA - 与模数大小相同(作为无符号数,以位为单位)。
随后的模幂运算对于RSA签名生成始终是相同的。它将填充的哈希值提升为私有指数。因此,您可以选择要用于特定协议的填充。
如果您不想指定协议,可以查看CMS(加密消息语法) - 以前称为PKCS#7。
对于具有PKCS#1 v1.5填充的RSA,填充是确定性的,这使得整个RSA签名生成具有确定性。在PSS的情况下,它是非确定性操作,即涉及随机数发生器。较新的PSS具有比PKCS#1 v1.5更好的安全性证明,但PKCS#1.5尚未被破坏。