2009-03-31 15 views
0

私はBlowfish.NETの最新バージョンを使用していますが、問題が1つあります。C#:Blowfishは少ない文字では機能しません

responce = new byte[6] 
{ 
    0x00, 0x80 ,0x01, 0x61, 0x00, 0x00 
}; 
byte[] encrypted = new byte[responce.Length]; 
blowfish.Encrypt(responce, 2, encrypted, 2, input.Length - 2); 

私は正しい方法、それを呼び出し、私はそれが第3バイトから読み取り/書き込みと長さが6で開始したい - 私は2つのバイトを使用していけないので、2。

問題:

 public int Encrypt(
     byte[] dataIn, 
     int posIn, 
     byte[] dataOut, 
     int posOut, 
     int count) 
    { 
     uint[] sbox1 = this.sbox1; 
     uint[] sbox2 = this.sbox2; 
     uint[] sbox3 = this.sbox3; 
     uint[] sbox4 = this.sbox4; 

     uint[] pbox = this.pbox; 

     uint pbox00 = pbox[ 0]; 
     uint pbox01 = pbox[ 1]; 
     uint pbox02 = pbox[ 2]; 
     uint pbox03 = pbox[ 3]; 
     uint pbox04 = pbox[ 4]; 
     uint pbox05 = pbox[ 5]; 
     uint pbox06 = pbox[ 6]; 
     uint pbox07 = pbox[ 7]; 
     uint pbox08 = pbox[ 8]; 
     uint pbox09 = pbox[ 9]; 
     uint pbox10 = pbox[10]; 
     uint pbox11 = pbox[11]; 
     uint pbox12 = pbox[12]; 
     uint pbox13 = pbox[13]; 
     uint pbox14 = pbox[14]; 
     uint pbox15 = pbox[15]; 
     uint pbox16 = pbox[16]; 
     uint pbox17 = pbox[17]; // till this line count is 4 

     count &= ~(BLOCK_SIZE - 1); //count becomes 0 after that calc :((

     int end = posIn + count; // 2 + 0 = 2 

     while (posIn < end) //no loop :[ 
     { 
      uint hi = (((uint)dataIn[posIn + 3]) << 24) | 
         (((uint)dataIn[posIn + 2]) << 16) | 
         (((uint)dataIn[posIn + 1]) << 8) | 
           dataIn[posIn ]; 

      uint lo = (((uint)dataIn[posIn + 7]) << 24) | 
         (((uint)dataIn[posIn + 6]) << 16) | 
         (((uint)dataIn[posIn + 5]) << 8) | 
           dataIn[posIn + 4]; 
      posIn += 8; 

      hi ^= pbox00; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox01; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox02; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox03; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox04; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox05; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox06; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox07; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox08; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox09; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox10; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox11; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox12; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox13; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox14; 
      lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)])^sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)])^pbox15; 
      hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)])^sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)])^pbox16; 

      lo ^= pbox17; 

      dataOut[posOut + 3] = (byte)(lo >> 24); 
      dataOut[posOut + 2] = (byte)(lo >> 16); 
      dataOut[posOut + 1] = (byte)(lo >> 8); 
      dataOut[posOut ] = (byte) lo; 

      dataOut[posOut + 7] = (byte)(hi >> 24); 
      dataOut[posOut + 6] = (byte)(hi >> 16); 
      dataOut[posOut + 5] = (byte)(hi >> 8); 
      dataOut[posOut + 4] = (byte) hi; 

      posOut += 8; 
     } 

     return count; 
    } 

私は長いデータを渡すとフグが正常に動作しますが、私はこのone.We'veを暗号化する必要があるが、問題を見つけましたが、私の質問は:それを修正する方法!

+0

問題は何ですか?あなたは問題があると言いましたが、それは何かではありません。暗号化の結果は何ですか? – JoshJordan

答えて

7

私はBlowfishのアルゴリズムに精通しているわけではありません。しかし、一般的には、データの暗号化に時間がかからないなどの問題がある場合は、それを埋め込むことができます。言い換えれば...データの長さが十分でない場合、暗号化する前に、データの先頭または末尾に一連のゼロ(または、ゼロが特殊な意味を持つ場合は他の文字)を追加します。次に、解読するときに、パディング文字をトリミングします。

2

サイズがブロック1つではないブロック暗号を使用しようとしています。データの長さが正確に8バイトにならない場合は、既存のパディングアルゴリズムと明確に定義されたモードを使用する必要があります。それでは、あらかじめ作られた図書館を使うのではなく、なぜあなた自身のブローフィッシュの機能を実装しているのですか?

2

与えられたブロック暗号化アルゴリズムに適切な長さになるようにデータを埋め込む標準的な方法があります。

This pageには、利用可能なオプションの概要が含まれています。

は、我々は必要な 長さにそれを補うためにパッドにパディング バイトのブロックを必要としています。 0x80を持つパッドは最後のバイトを作る除いてゼロでゼロバイト

  • パッド続い
  • バイトの

    1. パッドパディングバイトの数と同じ値のすべて:少なくとも5つの共通 規則があります。 パディングバイト
    2. パッドゼロ(ヌル)と文字の数に等しい空白文字で
    3. パッド

    方法1は、PKCS#5、PKCS#7およびRFC 3852のセクション6.3(以前のRFC 3369およびRFC 2630)で説明されている方法です。これは最も一般的に使用され、他の考慮事項がない場合には、私たちが推奨するものです。

  • しかし、短い固定長のメッセージを常に暗号化しているように見えるので、パディングは効果的に暗号化を弱める可能性があります。あなたは乱数でそれを埋め込み、解読の後にそれらを放棄することができます。

    +0

    短い固定長のプレーンテキストとパッドに対するコメントは+1。どんな標準的なパッドでも、暗号分析がはるかに簡単になります。独自のランダムパッドはおそらく解決策にすぎません。解読側は、どれだけ多くのパッドを終わらせるかを意識する必要があります。 –

    関連する問題