C++ OpenSSL签名和CAPI验证

C++ OpenSSL签名和CAPI验证,c++,com,openssl,mscapi,C++,Com,Openssl,Mscapi,我正在使用CAPICOM Library,但它在Android和iOS上不可用。据我所知,CAPICOM签名消息是PKCS#7格式的,然后我想使用OpenSSL像CAPICOM那样创建签名消息 我使用的OpenSSL命令: iconv -f utf-8 -t utf-16le data.bin > data-utf16le.bin openssl smime -sign -binary -noattr -in data-utf16le.bin -signer demo.pem -inke

我正在使用CAPICOM Library,但它在Android和iOS上不可用。据我所知,CAPICOM签名消息是PKCS#7格式的,然后我想使用OpenSSL像CAPICOM那样创建签名消息

我使用的OpenSSL命令:

iconv -f utf-8 -t utf-16le data.bin > data-utf16le.bin

openssl smime -sign -binary -noattr -in data-utf16le.bin -signer demo.pem -inkey demo.key -out sign.txt -outform PEM
然后我用CAPICOM验证了这个示例:

验证方法为:

public bool VerifyDetachedSignature(string plaintextMessage, string signedContent, Encoding encodingType) 
{
    try
    {
        this._clearText = plaintextMessage;
        this._signedContent = signedContent;
        CAPICOM.SignedData signedData = new CAPICOM.SignedDataClass();
        CAPICOM.Utilities u = new CAPICOM.UtilitiesClass();
        IntPtr _content = u.ByteArrayToBinaryString(encodingType.GetBytes(plaintextMessage));
                signedData.set_Content(_content);
        int len = _signedContent.Length;
        signedData.Verify(_signedContent,true, CAPICOM.CAPICOM_SIGNED_DATA_VERIFY_FLAG.CAPICOM_VERIFY_SIGNATURE_ONLY);
        SignerCert=null;
        CAPICOM.Signer s = (CAPICOM.Signer) signedData.Signers[1];
        SignerCert = (CAPICOM.Certificate)s.Certificate;                
        return true;                    
    }
    catch(COMException e)
    {
        return false;
    }
}
encodingType
System.Text.Encoding.UTF8

结果无效

我再次使用CAPICOM进行签名,我发现在这种情况下,签名消息的长度比OpenSSL创建的签名消息的长度长


请帮助我理解

iconv-f utf-8-t utf-16le data.bin>data-utf16le.bin
-二进制数据不一定是格式良好的utf-8或utf-16。这种转换有时可能会失败。如果您需要演示格式,请使用Base64、Base32或十六进制(base16)编码。谢谢,尽管我使用了此openssl命令:
openssl smime-sign-binary-noattr-in data-utf16le.bin-signer demo.pem-inkey demo.key-out sign.txt-outform pem
,CAPICOM库仍然返回无效结果。现在我知道CAPICOM的签名包括证书链,这就是为什么它的长度比OpenSSL签名的长度长的原因。如何通过OpenSSL创建带有附加证书链的签名?