P / Invoking CryptImportKey и структуры маршалинга - PullRequest
0 голосов
/ 05 февраля 2009

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

        // 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:

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2009

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

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

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

0 голосов
/ 05 февраля 2009

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

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

...