2009-02-05 5 views
0

Я пытаюсь выполнить P/Invoke в CryptImportKey с C#, чтобы установить известный ключ перед тем, как шифровать данные, которые будут дешифрованы в службе C++ Win32 в какой-то момент. У меня есть подпись метода для P/Invoke, и все работает отлично, но я не могу заставить его принять мой ключевой blob. Структуры C++ находятся в комментариях ниже, а мои C# для маршалинга ниже.P/Invoking CryptImportKey и marshaling structs

 // typedef struct _PUBLICKEYSTRUC 
    // { 
    // BYTE bType; 
    // BYTE bVersion; 
    // WORD reserved; 
    // ALG_ID aiKeyAlg; 
    // } BLOBHEADER, PUBLICKEYSTRUC; 
    [StructLayout(LayoutKind.Sequential)] 
    public struct PUBLICKEYSTRUC 
    { 
     public Byte bType; 
     public Byte bVersion; 
     public Int16 reserved; 
     public Int32 aiKeyAlg; 
    } 

    //typedef struct __KEYBLOB 
    //{ 
    // BLOBHEADER hdr; 
    // DWORD cbKeySize; 
    // BYTE* rgbKeyData; 
    //} KEYBLOB; 

    [StructLayout(LayoutKind.Sequential)] 
    public struct KEYBLOB 
    { 
     public PUBLICKEYSTRUC hdr; 
     public Int16 cbKeySize; 
     public Byte[] rgbKeyData; 
    } 

Затем я использую:

 int len = (Marshal.SizeOf(typeof(PUBLICKEYSTRUC) + Marshal.SizeOf(typeof(KEYBLOB)) + KeySize; 
     byte[] arr = new byte[len]; 
     IntPtr ptr = Marshal.AllocHGlobal(len); 
    Marshal.StructureToPtr(keyBlob, ptr, true); 
    Marshal.Copy(ptr, arr, 0,len); 
     Marshal.FreeHGlobal(ptr); 

Чтобы попасть в массив байтов, чтобы перейти к CryptImportKey, но он никогда не кажется, взять ключ с ним и когда я зашифровать с ним я получаю различный шифрованный текст время, предполагающее, что он не использует мой ключ.

EDIT:

Ключ блоб материал из кода C++ У меня есть, что можно успешно шифровать и дешифровать данные. Я думаю, вы, возможно, имеете точку в том, что заголовок включен дважды, но главная проблема, которую я имею, - это значение байта []. RgbKeyData не помещается в массив байтов arr.

ответ

0

Here - это список структур/импорта, которые выглядят довольно многообещающими. Однако я не проверял его сам.

Edit:
Когда вы вычислить размер вашего сгустка: это может быть на самом деле вы подсчетом заголовок дважды? Кроме того, как вы получили декларацию своей структуры KEYBLOB?

+0

То, где я получил подпись метода, но это не помогает для структур, я думаю, что я неправильно настроен. Спасибо в любом случае – 2009-02-05 20:14:02

0

С другой стороны, почему вы вообще беспокоитесь обо всем этом P/Invoke? У .NET Framework есть встроенные классы, чтобы сделать все это для вас.

Предполагая, что вы используете шифрование RSA, класс RSACryptoServiceProvider предоставляет метод ImportParameters, который принимает объект RSAParameters.
Чистый, простой и правильный способ сделать это.

Есть ли причина, по которой вы не можете использовать это?

+0

RSACryptoServiceProvider был представлен в .NET 3.5, и мы застряли на .NET 2.0 :( – 2009-02-05 22:17:51

+0

Совсем нет - Определенно существует в 2.0, довольно уверен, что он был там от 1.0/1.1 :-). Проверьте еще раз - это должно быть прямо в System.Security.Cryptography. Как вы делаете остальную часть шифрования, это все через P/Invoke ...? – AviD

+0

Yup и все мои p/invokes работают отдельно от этого. Я попробовал RijdaelManaged (sp?), Но я не мог заставить его расшифровать с помощью API-интерфейсов Win32 Crypto. При всех вещах, равных (ключи, соли и IV), попытка дешифрования текста шифрования не удалась. – 2009-02-05 22:56:05