Я пытаюсь выполнить 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.
То, где я получил подпись метода, но это не помогает для структур, я думаю, что я неправильно настроен. Спасибо в любом случае – 2009-02-05 20:14:02