2009-03-31 1 views
0

Blowfish.NET 최신 버전을 사용하고 있지만 한 가지 문제가 있습니다. 내가 2 바이트를 사용 해달라고하기 때문에,이 -C# : 적은 수의 문자로 복어가 작동하지 않습니다.

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); 

나는 그것이 올바른 방법, 나는 그것이 세 번째 바이트에서 읽기/쓰기 시작하고 길이가 6이고 싶어했다.

문제 :

 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; 
    } 

내가 더 이상 데이터를 전달하는,하지만이 곳 이겠지 문제를 발견 암호화해야하지만 내 질문 경우, 복어가 잘 작동 : 어떻게 그것을 해결하기 위해?!

+0

어, 문제점은 무엇인가요? 당신은 문제가 있다고 말했지만 그것이 무엇인지는 말하지 않았습니다. 암호화의 결과는 무엇입니까? – JoshJordan

답변

7

나는 Blowfish 알고리즘에 익숙하지 않거나 사용중인 라이브러리에 익숙하지 않습니다. 하지만 일반적으로 데이터를 암호화하는 데 시간이 오래 걸리지 않으면 문제가 발생할 수 있습니다. 다른 말로하면 ... 데이터가 충분히 길지 않은 경우 데이터를 암호화하기 전에 데이터의 시작 부분이나 끝 부분에 0의 묶음 (또는 다른 문자가 0 인 경우 특수 문자)을 추가하십시오. 그런 다음 암호를 해독 할 때 패딩 문자를 잘라냅니다.

2

정확히 한 블록 크기가 아닌 블록 암호를 사용하려고합니다. 데이터 길이가 정확히 8 바이트가되지 않으면 잘 정의 된 모드와 함께 기존 패딩 알고리즘을 사용해야합니다. 그렇다면 왜 사전 제작 된 라이브러리를 사용하는 대신 자신의 복어 기능을 구현하고 있습니까?

2

주어진 블록 암호화 알고리즘에 올바른 길이를 갖도록 데이터를 채우는 표준 방법이 있습니다.

This page에는 사용 가능한 옵션에 대한 개요가 포함되어 있습니다.

우리는 필요한 길이를 만들기 위해 패드에 패딩 바이트 블록이 필요합니다. 0x80으로와 패드가 마지막 바이트을 제외하고는 제로에 0 바이트

  • 패드 다음
  • 바이트

    1. 패드 패딩 바이트 수와 같은 값의 모든 : 적어도 다섯 일반적인 규칙이 있습니다 패딩 바이트
    2. 패드 제로 (NULL)와 문자의 수와 같은 공백 문자와
    3. 패드

    방법 1은 PKCS # 5, PKCS # 7 및 RFC 3852 섹션 6.3 (이전의 RFC 3369 및 RFC 2630)에 설명 된 방법입니다. 가장 일반적으로 사용되는 것으로 다른 고려 사항이없는 경우에 권장됩니다.

  • 하지만 짧은 고정 길이 메시지를 항상 암호화하는 것처럼 보이기 때문에 패딩은 암호화를 효과적으로 약화시킬 수 있습니다. 암호 해독 후 임의의 숫자로 채우고 버릴 수 있습니다.

    +0

    짧은 고정 길이 일반 텍스트 및 패드에 대한 설명은 +1입니다. 모든 표준 패드는 암호화 분석을 훨씬 쉽게 할 것입니다. 독점적 인 무작위 패드는 해결책 일 가능성이 높습니다. 해독 측은 단순히 얼마나 많은 패드를 끝까지 잘라야하는지 알고 있어야합니다. –