ある時点でC++Win32サービスで復号化されるデータを暗号化する前に、C#からCryptImportKeyをP / Invokeして、既知のキーを設定しようとしています。P / Invokeのメソッドシグネチャがあり、すべて正常に機能しますが、キーBLOBを受け入れることができません。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に渡すために、キーを取得することはないようです。それを使用して暗号化すると、キーを使用していないことを示す異なる暗号文時間が表示されます。
編集:
重要なblobのものは、データを正常に暗号化および復号化できるC++コードからのものです。ヘッダーが2回含まれているという点があると思いますが、私が抱えている主な問題は、Byte[]rgbKeyDataの値がバイト配列arrに入力されていないことです。