我有问题。
var contentInfo = new ContentInfo(message);
var signedCms = new SignedCms(contentInfo);
var cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
data = signedCms.Encode();
.Net Framework 4.7 和 .Net Core 2.1 中的此代码会产生不同的结果...
我的消息长度是73字节
.Net Framework 中的结果 - 1520 字节
.Net Core 中的结果 - 1523 字节
为什么?
最佳答案
在 .NET Framework 上,如果您的 .exe 目标版本为 4.7 或更早版本,则 new CmsSigner(cert)
指示签名者应使用 SHA-1 作为其摘要,在 4.7.1 及更高版本中默认算法更改为 SHA-2-256。
在 .NET Core 2.1 上,默认值已经是 SHA-2-256。
您可以通过设置 CmsSigner
的 DigestAlgorithm
属性将其中任何一个更改为您喜欢的任何摘要算法。例如cmsSigner.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
现在使它们都使用 SHA-2-256。
此外,.NET Framework 将 RSA 签名算法标识符编码为 { id-rsaEncryption, NULL }
,.NET Core 将其编码为 { id-rsaEncryption }
(省略可选的第二个值)。这部分不会改变内容的语义解释,但意味着当对两者使用相同的摘要算法时,它们仍然不会达到相同的长度。
SHA-2-256 算法标识符的 DER 编码比 SHA-1 标识符的 DER 编码长两个字节(假设省略 SHA-2-256 的参数值,对于 SHA-1 则省略参数值)一片空白)。这会被写两次(+4 到核心),然后 RSA 签名算法标识符表示方式的差异使 .NET Core 版本小 2 个字节(净:+2 到核心)
您看到三个字节差异而不是两个字节的原因是文档结构的某些部分最终通过了长度前缀(可变长度)所需的阈值之一获得额外的字节来保存该值。除了 127 -> 128 之外,这些点是标准的“字节边界”(255 -> 256、65535 -> 65536 等)。您的 SignerInfo block 在 .NET Framework 文档上可能是 254 或 255 字节,并且跨越到256 或 257,因为 SHA-2-256 的标识符值较长。
关于.net - 为什么.Net Framework和.Net Core中的ComputeSignature会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51671217/