0

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

4

2 回答 2

0

是一个结构/导入列表,看起来很有希望。不过还没有自己测试过。

编辑:
当您计算 blob 的大小时:您实际上是在计算标题两次吗?此外,您是如何得出 KEYBLOB 结构的声明的?

于 2009-02-05T20:09:09.107 回答
0

另一方面,你为什么还要在这里烦恼所有这些 P/Invoke 的东西?.NET Framework 具有内置类来为您完成所有这些工作。

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

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

于 2009-02-05T21:58:32.117 回答