Я пытаюсь 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.