0

この関数の奇妙な動作を観察しています。暗号化したい文字列に 14 バイトが含まれています。この関数を使用してバッファの長さ = 14 を送信すると、失敗します (「内部エラー」 - 非常に説明的で最も役立つエラー コード)。ですが、バッファ長 (およびバッファ自体) が 128 バイトの場合に機能します。

サイズが 128 バイトの配列を作成することでこの問題を克服し、(暗号化したい) プレーン テキストから 14 バイトをコピーしました。

これらのバイトを復号化するときは、もう一度関数に 128 バイト配列全体を渡す必要があります (これで、#13 から #127 までのすべてのバイトが暗号化されます (これは当然のことだと思います))。幸いなことに、最初の 14 バイトは正常に復号化され、残りは意味不明です。

着信バッファが 128 バイトではない場合に暗号化メソッドが失敗する理由と、復号化関数にも 128 バイト配列が必要な理由を知りたいのですが、それはパディングですか?

これは、暗号化関数を呼び出す方法です。

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();  // encoding type
byte[] buff = new byte[128];     // this is my buffer array, instantiated and initiated
string String2Encrypt = "Testing";      // this is the string I need encrypted
byte[] tempo = encoding.GetBytes(String2Encrypt);   // getting bytes from string
Buffer.BlockCopy(tempo, 0, buff, 0, tempo.Length);    // copying the small array into the large one
uint inputlength = Convert.ToUInt32(tempo.Length);   // getting the size of the small array 


bool DidIt = UnsafeNativeMethods.CryptEncrypt(MyKey, IntPtr.Zero, 1, 0, buff, ref inputlength, outputdatalength);     // calling the function

// この場合、MyKey は暗号鍵へのポインタ、2 番目の引数は null、3 番目は「true」(これ以上データがない)、フラグなし、バッファ バイト配列 (128)、Testing.Length この場合は 7 、128

これは私がそれを解読する方法です:

IntPtr UserKeyLocal = MyUserKey;     // taking an argument (MyUserKey) and "filling" the local variable, not really relevant
byte[] dataCopy = new byte[buff.Length];   // init and insta the datacopy array (128 byte)
Buffer.BlockCopy(buff, 0, dataCopy, 0, (int)buff.Length);   // copying the argument array into a local version (I used this for testing to go around another problem), irrelevant
uint locinputlength = inputlength;  // another argument made local
bool DidIT = UnsafeNativeMethods.CryptDecrypt(UserKeyLocal, IntPtr.Zero, true, 0, dataCopy, ref locinputlength);     // calling the function

結果は次のようになります: Testing?R????7?q?????$??uj??m%?b??e?a?74p?)?n9??w?R*O )え?i?+?>[?S???}Ct?n?&??b?P!?u1??%?JQ???/?mP?5wB????

ほぼ意図したとおりに機能しますが、サブストリングなどのトリックを使用せずに、文字列の「テスト」部分のみを取得できるようにする必要があります。

私がやろうとしていること(おそらく別の方法があるかもしれません)はこれです; SmartCard からエクスポートした証明書から取得した公開鍵で暗号化された「テスト」を含むバイナリ (ファイル) があります。秘密鍵を使用して SmartCard (私はその適切な CSP を使用しています) を使用して、このファイルを検証 (復号化) する必要があります。ご覧のとおり、ほとんど機能します。

前もって感謝します。

4

2 に答える 2

2

バッファが 128 バイトでなければならない理由は、ブロック暗号が使用されているためだと思います。その場合、バッファ長はブロック サイズの倍数である必要があります。ブロック暗号では、暗号化または復号化されたデータを書き込むことができるように、バッファはデータのサイズよりも大きくする必要がある場合があります (長さ (暗号化) != 長さ (平文))。

CryptDecrypt を呼び出した後、パラメーターpdwDataLen(locInputLengthコード内) には、復号化された実際のデータの長さが含まれます。locInputLengthの最初のバイトだけを取得するdataCopyと、必要なものが得られますか?

参考文献: http://msdn.microsoft.com/en-us/library/aa379913(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa379924(VS.85).aspx

于 2011-03-20T02:38:12.067 に答える
0

うん、やった!やさしい!

            byte[] buffer = new byte[locinputlength];
            Buffer.BlockCopy(dataCopy, 0, buffer, 0, (int)locinputlength);
            return buffer;

少し戻って、少し違う視点から物事を見るまでは、「見る」ことができないものの1つです;)

于 2011-03-21T11:56:23.347 に答える