CAPICOM против P / Invoke - PullRequest
       41

CAPICOM против P / Invoke

3 голосов
/ 28 июля 2011

Я хотел бы использовать CryptoAPI в C # для доступа к хранилищу сертификатов и подписать сообщение.

В этой статье MSDN "CAPICOM: CryptoAPI Made Easy" показано 2 способа сделать это: использование CAPICOMили P / Invoke.

  1. Что лучше?CAPICOM.dll или P / Invoke [DllImport("crypt32.dll", ...)]

  2. Будет ли "crypt32.dll" всегда присутствовать на любом компьютере?

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

CAPICOM - это старая технология, которую Microsoft устарела. P / Invoke (Platform Invoke) позволяет управляемому коду вызывать неуправляемый код, реализованный в DLL.

Это оболочка на основе COM для библиотеки CryptoAPI. Статья, которую вы опубликовали, написана в 2003 году. Это было более 8 лет назад, и технологии развивались.

Эта статья в MSDN здесь рекомендует использовать .NET Framework для функций безопасности вместо CAPICOM.

1 голос
/ 28 июля 2011

Требуется ли использование CAPICOM?Это будет работать, но у него есть несколько действительно раздражающих недостатков, и, если вы его не используете, вам лучше использовать System.Security.Cryptography.

В любом случае: чтобы использовать CAPICOM,Вы должны сначала добавить ссылку на него в свой проект.Тогда:

    CAPICOM.SignedData signeddata = new CAPICOM.SignedData();
    FileStream file = File.Open(tbSourceFile.Text, FileMode.Open);
    byte[] Content = new byte[(int)file.Length];

    file.Read(Content, 0, (int)file.Length);
    file.Close();

    StringWriter sw = new StringWriter();
    sw.Write(Content);

    signeddata.Content = sw.ToString();

    IStore store = new CAPICOM.Store();
    store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
    ICertificates2 certificates = (ICertificates2)store.Certificates;

    certificates = certificates.Find(CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE, true);

    if (certificates.Count > 0)
    {
        certificates = certificates.Select();
    }
    if (certificates.Count > 0)
    {
        ISigner2 signers = new CAPICOM.Signer();
        signers.Certificate = certificates[1];
        tbSignatureBlock.Text = signeddata.Sign(signers, true);
    }
1 голос
/ 28 июля 2011

доступность crypt32 не должна противодействовать проблеме, в то время как capicom делает.

На той же заметке вы должны убедиться, что в .Net нет управляемой оболочки, прежде чем отправиться в p \ invoke

...