繁体   English   中英

如何从 PKCS#7 中提取 PKCS#1 签名

[英]How to extract PKCS#1 signature from PKCS#7

我知道PKCS#7 = Certificate + Optional raw data + Signature in PKCS#1 format我需要从 PKCS#7 签名中提取 PKCS#1 我如何在 C# 中做到这一点。 我可以使用充气城堡来做到这一点,这是我的实现,即。 将 PKCS#7 转换为 ASN.1 并采用最后一个序列,因为它是 PKCS#1

Asn1InputStream asn1 = new Asn1InputStream(pkcs7Stream);
Asn1Sequence sequence = (Asn1Sequence)asn1.ReadObject().ToAsn1Object();
var sequenceString = sequence.ToString();
var lastCommaIndex = sequenceString.LastIndexOf(",");
var pkcs1HexStr = sequenceString.Substring(lastCommaIndex + 3).Replace("]", string.Empty);

有没有其他合法的方式来获得 PKCS#1

SignedCms 类可以为您、.NET Core 2.1+ 或 .NET Framework 4.7.2+ 执行此操作:

SignedCms cms = new SignedCms();
cms.Decode(message);
return cms.SignerInfos[0].GetSignature();

当然,假设您想要第一个签名者的签名。 (GetSignature 方法是需要 net472+ 的)

其他签名者或会签者也将可用,只是通过对象模型的不同方面。

谢谢,@bartonis 的帮助和指导

这是使用充气城堡的实现

public static byte[] GetRaw(byte[] input)
{
    SignerInfo signerInfo = GetSignerInfo(input);
    return signerInfo?.EncryptedDigest?.GetOctets();
}
private static SignerInfo GetSignerInfo(byte[] input)
{
    Asn1InputStream cmsInputStream = new Asn1InputStream(input);
    Asn1Object asn1Object = cmsInputStream.ReadObject();

    Asn1Sequence asn1Sequence = Asn1Sequence.GetInstance(asn1Object);
    SignedData signedData = GetSignedData(asn1Sequence);
    SignerInfo signerInfo = GetSignerInfo(signedData);
    if (signerInfo?.UnauthenticatedAttributes != null)
    {
        signedData = GetSignerInfo(signerInfo);
        signerInfo = GetSignerInfo(signedData);
    }
    return signerInfo;
}
private static SignerInfo GetSignerInfo(SignedData signedData)
{
    Asn1Encodable[] Asn1Encodables = signedData?.SignerInfos?.ToArray();
    if (Asn1Encodables != null)
    {
        if (Asn1Encodables.Length > 0)
        {
            SignerInfo signerInfo = SignerInfo.GetInstance(Asn1Encodables[0]);
            return signerInfo;
        }
    }
    return null;
}
private static SignedData GetSignedData(Asn1Sequence sequence)
{
    var rootContent = ContentInfo.GetInstance(sequence);
    var signedData = SignedData.GetInstance(rootContent.Content);
    return signedData;
}
private static SignedData GetSignerInfo(SignerInfo signerInfo)
{
    Asn1Encodable[] asn1Encodables = signerInfo.UnauthenticatedAttributes.ToArray();
    foreach (var asn1Encodable in asn1Encodables)
    {
        Asn1Sequence sequence = Asn1Sequence.GetInstance(asn1Encodable);
        DerObjectIdentifier OID = (DerObjectIdentifier)sequence[0];
        if (OID.Id == "1.2.840.113549.1.9.16.2.14")
        {
            Asn1Sequence newSequence =Asn1Sequence.GetInstance(Asn1Set.GetInstance(sequence[1])[0]);
            SignedData signedData = GetSignedData(newSequence);
            return signedData;
        }
    }
    return null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM