我正在尝试从C#调用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。
答案 0 :(得分:0)
Here是一个结构/导入列表,看起来很有希望。但是,我没有亲自测试过。
修改强>
当你计算blob的大小时:你实际上是在计算两次头部吗?此外,您是如何得出KEYBLOB结构的声明的?
答案 1 :(得分:0)
另一方面,为什么你甚至在这里打扰所有这些P / Invoke的东西? .NET Framework具有内置类,可以为您完成所有这些操作。
假设您正在使用RSA加密,RSACryptoServiceProvider类提供了一个接受RSAParameters对象的ImportParameters方法。
干净,简单,正确的方法。
你有什么理由不能使用它吗?