0

ある時点で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に入力されていないことです。

4

2 に答える 2

0

これは非常に有望に見える構造体/インポートのリストですただし、自分でテストしていません。

編集:
ブロブのサイズを計算するとき:実際にヘッダーを2回カウントしている可能性がありますか? また、KEYBLOB 構造体の宣言はどのように導出しましたか?

于 2009-02-05T20:09:09.107 に答える
0

一方で、なぜここで P/Invoke のすべてに煩わされているのでしょうか。.NET Framework には、これらすべてを行うための組み込みクラスがあります。

RSA 暗号化を使用していると仮定すると、RSACryptoServiceProvider クラスは、RSAParameters オブジェクトを受け入れる ImportParameters メソッドを提供します。
クリーンでシンプル、そして正しい方法です。

これを使えない理由はありますか?

于 2009-02-05T21:58:32.117 に答える