You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#生成PKCS#1 v2.1签名的问题求助

PKCS#12证书签名挑战从Java到C#的迁移问题

我正尝试将Java中使用PKCS#12证书签名挑战的参考实现迁移到C#。根据理解,该签名应为PKCS#1 v2.1签名,原Java实现采用Bouncy Castle库,优先考虑使用C#系统库实现。

我尝试了多种方法,但生成的签名始终不被目标API认可:

  • 基于Bouncy Castle的1:1移植:生成的签名前约30字节匹配,但后续内容不符,长度也不同(Java生成2324字节,C#生成2231字节)。
  • 使用System.Security.Cryptography.Pkcs实现:代码更简洁,但同样未成功。

Java参考代码

private byte[] signChallenge(final byte[] challenge) {
    X509Certificate sigCert = ...;
    PrivateKey sigKey = ...;

    ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSAandMGF1").setProvider("BC").build(sigKey);
    CMSTypedData cmsData = new CMSProcessableByteArray(challenge);

    CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator();
    cmsGenerator.addSignerInfoGenerator(
        new JcaSignerInfoGeneratorBuilder(
            new JcaDigestCalculatorProviderBuilder().build()
        ).build(signer, sigCert)
    );
    Store certs = new JcaCertStore(Collections.singletonList(sigCert));
    cmsGenerator.addCertificates(certs);

    CMSSignedData cms = cmsGenerator.generate(cmsData, false);
    byte[] signedMessage = cms.getEncoded();
    return signedMessage;
}

基于Bouncy Castle的C#尝试代码

private byte[] SignChallenge(byte[] challenge)
{
    var sigCert = DotNetUtilities.FromX509Certificate(Cert);
    var sigKey = DotNetUtilities.GetRsaKeyPair(Cert.GetRSAPrivateKey()).Private;
    
    var signer = SignerUtilities.InitSigner("SHA256withRSAandMGF1", true, sigKey, new());
    var cmsData = new CmsProcessableByteArray(challenge);

    var cmsGenerator = new CmsSignedDataGenerator();
    var factory = new Asn1SignatureFactory("SHA256withRSAandMGF1", sigKey);
    cmsGenerator.AddSignerInfoGenerator(new SignerInfoGeneratorBuilder().Build(factory, sigCert));
    cmsGenerator.AddCertificate(sigCert);

    var cms = cmsGenerator.Generate(cmsData, false);
    var signedMessage = cms.GetEncoded();
    return signedMessage;
}

使用C#系统库的尝试代码

private byte[] SignChallenge(byte[] challenge)
{
    var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(challenge);

    var signedCms = new SignedCms(contentInfo, true);
    var signer = new CmsSigner(Cert);
    signer.DigestAlgorithm = Oid.FromFriendlyName("SHA256", OidGroup.HashAlgorithm);
    signer.SignaturePadding = RSASignaturePadding.Pss;

    signedCms.ComputeSignature(signer);
    var signedMessage = signedCms.Encode();
    return signedMessage;
}

内容的提问来源于stack exchange,提问作者BaerMitUmlaut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:11:10