我正在尝试从 C# P/Invoke 到 CryptImportKey 以设置一个已知密钥,然后再加密将在某个时候在 C++ Win32 服务中解密的数据。我有 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++ 代码。我认为您可能对包含两次的标头有所了解,但我遇到的主要问题是 Byte[] rgbKeyData 的值没有被放入字节数组 arr 中。