0

C++ フグは 8 文字未満のブロックの暗号化をサポートしていますが、.NET はそうではありません。なぜですか?

-->C# NET フグ<-- -->C++ フグ<--

C++ と C# の両方のアプリケーションで、次の配列を暗号化します

    byte response[6] = 
    {
        0x00, 0x80, 0x01, 0x61, 0x05, 0x06
    };

C++ と C# の両方のアプリケーションで、同じパラメーターを使用して Encrypt 関数を呼び出します。

C++
Blowfish.Encrypt((LPBYTE)responce + 2,(LPBYTE)responce + 2, 4);

C#
Blowfish.Encrypt(responce, 2, responce, 2, responce.Length - 2);

ただし、C++ ではデータを暗号化しますが、C# では暗号化しません。

C# NET Blowfishの45、47、49行目は問題のある行です。45 行目の計算の後、結果は 0 になります。47 行目は 2 + 0 = 2 になり、49 行目 2 は 2 以上であるため、ループはありません。

C++フグにはパディングがありますが、理解しようとすると迷います。

私の問題は、C# ではパディングが C++ とまったく同じでなければならないため、有効な答えが得られることです。暗号化された配列を送信するサーバーが私のじゃない。

C++ フグで使用されるパディングと、C# NET での実装方法を教えてください。

//注: このパケットを複数回送信する必要はなく、1 回だけ送信する必要があります。

前もって感謝します!

4

1 に答える 1

2

あなたが貼り付けたコード(ちなみに、SOにはお勧めしません。しばらく誰も読んでいないと貼り付けが削除され、この質問が壊れたままになるためです)は、ヘッダーコメントに次のように述べています。

/// Note that the number of bytes must be adjusted to the block size of the algorithm.

(3 行目と 4 行目)。したがって、サイズの小さいデータを無視すると、仕様どおりに動作しているように見えます。

C++ コードは null バイトでパディングされているようです。コメントには次のように書かれています。

// pad end of data with null bytes to complete encryption

GetOutputLength()サイズの小さい入力を処理する方法を確認するには、C++ 関数を参照すると役立ちます。切り上げになると思いますが、確認してみるといいでしょう。

于 2009-04-01T07:33:08.013 に答える