【发布时间】:2021-02-04 16:26:11
【问题描述】:
首先,我对加密/签名还是新手,所以请容忍任何滥用术语。
我需要在 C# 中创建一个由 Python 库验证的签名。在 Python 中,解码/验证签名是一段简单的代码:
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
public_key.verify(signature, payload_contents,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH,
), hashes.SHA256(), )
我当前的 C# 代码如下所示:
private static string CreateSignature(byte[] data, string privateKeyFileLocation)
{
var cert = new X509Certificate2(privateKeyFileLocation);
byte[] signedBytes;
using (var rsa = cert.GetRSAPrivateKey())
{
signedBytes = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}
var finalString = Convert.ToBase64String(signedBytes);
return finalString;
}
但是,签名未通过 Python 代码中的验证检查。看起来 .Net 库中的 PSS 填充默认使用 MGF1。但是,我相信由于掩码生成函数 (MGF1) 在 Python 代码中使用 256 位哈希,但在 C# 中默认为 SHA1,我遇到了问题。我已经浏览了 .Net C# 文档,看起来没有办法覆盖它。我查看了 Bouncy Castle 的 C# 文档,只是找不到任何类似的如何使用自定义参数设置填充的示例。有没有人有这方面的经验,可以提供一些提示?
【问题讨论】:
-
看看here。 BC/C# 似乎允许规范摘要 (
PssSigner(IAsymmetricBlockCipher cipher, IDigest contentDigest, IDigest mgfDigest, int saltLen))。在网络上,您还可以找到示例,例如here。但我没有尝试。 -
做到了!非常感谢!
标签: c# cryptography rsa bouncycastle signing