2013-02-25 1 views
0

서버용 암호화 된 비밀번호를 만들어야합니다. 이 서버는 Blowfish 암호화를 사용하여 암호화를 수행합니다.바이트 [24] 길이의 BLOWFISH로 암호화 된 비밀번호 생성

  1. KEY : "12345678abcdefgmypassword"
  2. 블록 크기 : 지금 여기서 I가 가지고있는 정보이다 8 바이트 - 64 비트
  3. END BYTES : 바이트 [24]

데이터 그 I 암호화하려는 "ABCDEFG12345678"입니다.

내가 겪고있는 문제는 매번 최대 48 바이트를 얻을 수있는 암호화를 얻는 것입니다. 내 가장 큰 문제는 내가 무슨 일이 일어날 지 내 머리를 감쌀 수 없기 때문이라고 생각합니다! 질문은 내가 가지고있는 지금

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

: 1. 블록 크기는 무엇입니까 여기

내 코드의 일부인가? 어떻게 사용합니까? 2. byte [24] 이하의 바이트를 얻으려면 어떻게해야합니까?

여러분 중 일부는 내 두뇌가 올바른 방향으로 나아갈 수 있도록 도와 주길 바랍니다. 감사합니다. .

+0

실제로 복어 암호화 또는 bcrypt 해싱을 의미합니까? – CodesInChaos

+0

어딘가에서 인코딩을 엉망으로 만든 것 같습니다. – CodesInChaos

+0

암호문에 ASCII를 사용할 수 없습니다. 'Encrypt_CBC'가 16 진수 문자열을 반환하면 16 진수 디코딩을 적용해야합니다. – CodesInChaos

답변

0

Block size은 블록 암호가 한 번에 작동하는 데이터의 양입니다. 예를 들어, 암호화 알고리즘의 블록 크기가 128 비트이면 ASCII로 16 문자가됩니다.

블록 크기를 사용하려면 "평문"(아직 암호화되지 않은 텍스트)을 64 비트 블록 (귀하의 경우)으로 분할해야합니다. 그런 다음 암호화를 통해 각 블록을 순환시키고 출력을 연결하십시오. (ECB 암호화를 구현하는 경우 권장하지 않음).

위에서 말했듯이 텍스트를 블록으로 조각해야합니다. 마지막 블록은 필요한 블록 크기 아래에있을 수 있으며 padding이 필요합니다.

는 희망이 오른쪽 라인에 당신을두고 :

+0

일부 코드는 어떻게 보이나요? > Blowfish b = 새로운 Blowfish (육각형). "12345678abcdefgmypassword"에서 16 진수 키를 얻으려면 어떻게해야합니까? –

0

는 현재 http://www.schneier.com/code/blowfish.cs 소스 코드를 살펴있을 수 있습니다 그것은 당신이 더 나은이 작동 방식을 이해하는 데 도움이 될 수 있습니다. 또한 이러한 알고리즘의 작업 Schneier에 의해 암호화 적용되는 방법의 세부 사항을 설명 암호화에 훌륭한 책은 여기 http://www.amazon.com/gp/aw/d/0471117099/ 발견

편집 :이 노는 시간을 했어 내가 무엇을 알고 있다고 생각 좋아

당신이 가진 문제입니다. 24 자 대신 48 바이트의 데이터로 끝나는 이유는 전체 cipher 텍스트를 ASCII로 표시하기 위해 길이가 48 바이트 인 cipherText의 문자열 표현을 조작하려고하기 때문입니다. 당신이해야 할 일은 아스키 문자열 표현을 바이트 배열로 변환하는 것뿐입니다. catch는 (올바른 경로에 있었음) 암호화 방법과 동일한 방식으로 수행해야합니다.

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 방법은 암호화하고 해독 할 때 일반 텍스트에 사용되는 것입니다 복어 클래스에서 직접 복사됩니다 여기에 그것을 할 수있는 코드입니다. 문자열의 CBC 모드에서 IV (초기화 벡터)가 문자열의 맨 앞에 복사되므로 처음 8 바이트가 IV입니다.이 코드의 샘플 실행은 다음과 같습니다.

암호문은 ascii 16 진수 표현법으로 "2866ccafa647d82e7c74e137dbdcb9060cefea39b9b84964"입니다. myByteArray는 byte [24]를 제외하고는 동일합니다.

나는 이것이 사람의 행운을 돕기를 바랍니다.

+0

나는 현재 복어 클래스를 사용하고 있지만 코드에서 어디에 사용해야하는지 잘 모르겠습니다. 나는 코드에 입력 할 암호 문자열에서 16 진수 문자열을 만들어야 만하는 것 같다. 그러나 그 부분은 나를 벗어난다! –

+0

@ Philill Kemp 수업 시간에 볼 수 있듯이 현 사용법은 괜찮습니다. 이후에 암호문을 사용하여 처리하는 것이 문제 일 가능성이 큽니다. 어떻게이 데이터를 서버에 보냅니 까? 네가 정확히 무엇을하려고하는지 명확하지 않니? – ValueforValue