P /调用CryptImportKey和编组结构

时间:2009-02-05 19:52:40

标签: c# pinvoke cryptoapi

我正在尝试从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。

2 个答案:

答案 0 :(得分:0)

Here是一个结构/导入列表,看起来很有希望。但是,我没有亲自测试过。

修改
当你计算blob的大小时:你实际上是在计算两次头部吗?此外,您是如何得出KEYBLOB结构的声明的?

答案 1 :(得分:0)

另一方面,为什么你甚至在这里打扰所有这些P / Invoke的东西? .NET Framework具有内置类,可以为您完成所有这些操作。

假设您正在使用RSA加密,RSACryptoServiceProvider类提供了一个接受RSAParameters对象的ImportParameters方法。
干净,简单,正确的方法。

你有什么理由不能使用它吗?