首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从PKCS#7中提取PKCS#1签名

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

Stack Overflow用户
提问于 2019-08-06 15:07:31
回答 2查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-07 04:27:42

SignedCms类可以为.NET核心2.1+或.NET框架4.7.2+执行此操作:

代码语言:javascript
复制
SignedCms cms = new SignedCms();
cms.Decode(message);
return cms.SignerInfos[0].GetSignature();

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

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

票数 3
EN

Stack Overflow用户

发布于 2019-08-08 17:31:13

感谢@bartonis的帮助和指导

下面是使用bouncy castle的实现

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57370663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档