我不确定我是否应该在这里或在 Security Stackexchange 中问这个问题。
无论如何,我最近在使用 TPM 处理 RSA 签名时遇到了一个问题,我将填充方案从 RSASSA-PKCS1-v1_5 切换到 RSASSA-PSS。我认为这应该没什么区别,但我注意到 TSS.MSR(.NET TPM 库)中的一个示例不再起作用。我在https://github.com/microsoft/TSS.MSR/issues/109开始了一个关于它的问题。
但我想检查一下,如果有人可以分享意见,是否需要做或注意一些明显的事情,而不是改变填充方案?
我认为不是,这也隐含在 .NET RSA 库等参数中,例如https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsasignaturepadding以及如何使用它喜欢
using(var rsaKey = RSA.Create(keySizeInBits: 2048))
{
byte[] message = /* Random data. */
var sig = rsaKey.SignData(message, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}
我从https://security.stackexchange.com/questions/183179/what-is-rsa-oaep-rsa-pss-in-simple-terms,https://crypto.stackexchange.com/questions/77881中的问题中看到/are-rsa-pss-parameters-standardized在其他地方,填充的实际发生方式更为复杂。但假设它是库的一个实现细节,并且签名检查似乎不匹配或不起作用,一个结论是可能需要检查此 TSS.NET 库中的各种内部参数,例如填充。所以,因此我想确保自己这个结论是正确的,并且可能没有非常明显的东西。举个例子:不要使用 SHA-256 或明确地将盐大小精确地设置为 nn (好的,这可能是一个通常不应该关心的实现细节)。
附录:
这是在接受Maarten Bodewes的优秀笔记后写的。
将散列从 SHA-256 切换到 SHA-1 并没有消除链接示例中验证签名的失败。不过,正如预期的那样,“nameSize”或摘要更改为 20 个字节。因此,如果在示例或某处的库中没有正确处理一些“挥之不去的默认值”,则仅此一项(可能是部分解决方案)并不是切换到 RSASSA-PSS 填充方案失败的原因。
探索仍在继续。:)