この関数の奇妙な動作を観察しています。暗号化したい文字列に 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 を使用しています) を使用して、このファイルを検証 (復号化) する必要があります。ご覧のとおり、ほとんど機能します。
前もって感謝します。