0

サーバーの暗号化されたパスワードを作成する必要があります。このサーバーは、Blowfish暗号化を使用して暗号化を行います。今ここに私が持っている情報があります:

  1. キー:「12345678abcdefgmypassword」
  2. ブロックサイズ:8バイト-64ビット
  3. バイトの終了:byte [24]

暗号化したいデータは「ABCDEFG12345678」です。

私が抱えている問題は、最大24バイトの暗号化を取得することですが、毎回48バイトを取得します。私の最大の問題は、何が起こるべきか頭を包むことができないからだと思います!

これが私のコードの一部です:

>  BlowFish b = new BlowFish("12345678abcdefgmypassword");
>  Here I get the key array of byte[12]
>  plainText = "0123456789ABCDEF";
>  cipherText = b.Encrypt_CBC(plainText);
>  var encodedString = System.Text.Encoding.ASCII;
>  byte[] myByteArray = encodedString.GetBytes(cipherText);

今私が持っている質問:1。ブロックサイズは何ですか?そして、どのように使用しますか?2. byte [24]以下のバイトを取得するにはどうすればよいですか?

皆さんの何人かが私の脳が正しい方向に進み始めるのを助けてくれることを本当に望んでいます。ありがとう。

4

2 に答える 2

0

http://www.schneier.com/code/blowfish.csのソース コードを参照すると、これがどのように機能するかをよりよく理解できる場合があります。また、これらのアルゴリズムがどのように機能するかの詳細を説明する暗号化に関する優れた本は、ここにある schneier による暗号化に適用されますhttp://www.amazon.com/gp/aw/d/0471117099/

編集:

さて、私はこれで遊ぶ時間があり、あなたが抱えている問題が何であるかを知っていると思います. 24 バイトではなく 48 バイトのデータになってしまうのは、暗号文全体を ASCII で表示するために、48 バイトの長さの暗号文の文字列表現を操作しようとしているためです。行う必要があるのは、ASCII 文字列表現をバイト配列に変換することだけです。問題は (あなたは正しい道を進んでいた)、暗号化メソッドと同じ方法でそれを行う必要があることです。これを行うコードは次のとおりです。

class Program
{
    private static byte[] HexToByte(string hex)
    {
        byte[] r = new byte[hex.Length / 2];
        for (int i = 0; i < hex.Length - 1; i += 2)
        {
            byte a = GetHex(hex[i]);
            byte b = GetHex(hex[i + 1]);
            r[i / 2] = (byte)(a * 16 + b);
        }
        return r;
    }



    private static byte GetHex(char x)
    {
        if (x <= '9' && x >= '0')
        {
            return (byte)(x - '0');
        }
        else if (x <= 'z' && x >= 'a')
        {
            return (byte)(x - 'a' + 10);
        }
        else if (x <= 'Z' && x >= 'A')
        {
            return (byte)(x - 'A' + 10);
        }
        return 0;
    }

    static void Main(string[] args)
    {
        BlowFish b = new BlowFish("12345678abcdefgmypassword");
        string plainText = "ABCDEFG12345678";
        string cipherText = b.Encrypt_CBC(plainText);
        MessageBox.Show(cipherText);
        plainText = b.Decrypt_CBC(cipherText);
        byte[] myByteArray = HexToByte(cipherText);
        MessageBox.Show(plainText);

    }
}

HexToByte および GetHex メソッドは、暗号化および復号化の際に平文で使用される Blowfish クラスから直接コピーされます。文字列の CBC モードでは、IV (初期化ベクトル) が文字列の先頭にコピーされるため、最初の 8 バイトが IV であることに注意してください。このコードのサンプル実行で得たものは次のとおりです。

cipherText は、ASCII 16 進数表現で「2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964」です myByteArray は、バイト [24] 以外は同じです。

これが男の幸運に役立つことを願っています!

于 2013-02-25T20:34:44.820 に答える
0

ブロック サイズは、ブロック暗号が一度に処理するデータの量です。たとえば、暗号化アルゴリズムのブロック サイズが 128 ビットの場合、ASCII では 16 文字になります。

ブロックサイズを使用するには、「プレーンテキスト」(まだ暗号化されていないテキスト) を 64 ビットブロック (この場合) に分割する必要があります。次に、暗号化を通じて各ブロックを循環させ、出力を連結します。(推奨されないECB暗号化を実装している場合)。

上で述べたように、テキストをブロックに分割する必要があります。最後のブロックは、必要なブロック サイズを下回っている可能性があり、パディングが必要になります。

うまくいけば、これはあなたを正しい方向に導きます:)

于 2013-02-25T19:07:36.380 に答える