2015-01-02 1 views
1

Blowfish 암호화 알고리즘을 이해하려고합니다. 내가 자세한 내용하게 설명하는 몇 가지 문제가 오전 : 여기C에서 Blowfish 암호화 함수 (BF_encrypt)

이다 기능 :

: 여기

#define BF_ENC(LL,R,S,P) \ 
    LL^=P; \ 
    LL^=(((S[  (R>>24L)  ] + \ 
     S[0x0100+((R>>16L)&0xff)])^ \ 
     S[0x0200+((R>> 8L)&0xff)])+ \ 
     S[0x0300+((R )&0xff)])&0xffffffff; 

내 질문 있습니다 : 여기

void BF_encrypt (data, encrypt) 
     BF_LONG *data; //data is array of two members i.e ti[0] and ti[1] 
         //and BF_LONG is defined as unsigned long in header file 
     int encrypt;  //encrypt is defined as 1 
    { 
    register BF_LONG l, r, *p, *s; //BF_LONG is defined as unsigned long in header file 
    p = key_P;      //key_P is declared as BF_LONG key_P[16 + 2]; 
    s = &(key_S[0]);    //key_S is declared as BF_LONG key_S[4 * 256]; 
    l = data[0];     //data[0]=ti[0] 
    r = data[1];     //data[1]=ti[1] 
    l ^= p[0];      //Bitwise ex-or of l with p[0]; 
    BF_ENC (r, l, s, p[1]); 
    } 

그리고는 BF_ENC 기능입니다 BF_ENC의 모든 결말 라인에서 "\"는 무엇을 의미합니까?

R >> 24L, 나는 그것이 오른쪽으로 이동하고 있다는 것을 알 수 있습니다. L은 여기에 오래 있지만 여기에 그 존재를 얻지는 않습니다. L이 데이터에 미치는 영향은 무엇입니까?

마지막 질문은 BF_ENC 기능이 무엇보다 중요하다는 것입니다.

더 많은 정보가 필요하면 여기에 있습니다. 감사합니다.

+0

암호화에 올바른 용어를 사용하지 않도록주의하십시오. 블로우 피쉬는 * 암호화 알고리즘 *이 아닌 * 블록 암호 *입니다. CBC와 같은 [조작 모드] (http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)에서 복어를 사용하여 암호화 알고리즘을 만들 수 있습니다. –

답변

1

BF_ENC은 C 스타일 매크로입니다. 일반적으로 줄 끝 문자로 구분됩니다. \ 이스케이프 문자는 다음 행이이 행의 일부로 간주되어야 함을 나타 내기위한 것입니다. 따라서 0xffffffff;까지의 모든 것이 매크로의 일부입니다.


L의 영향은 여러 언어에 대한 출력의 기본 유형은 두 피연산자에 의존 할 수 있다는 것이다. Llong 유형의 리터럴 인 24 (및 16 및 8) 이됩니다. 이렇게하면 출력이 올바른 기본 유형 (최소 32 비트)인지 확인할 수 있습니다. 특히 출력이 32 비트 정보를 저장할만큼 충분히 큰지 확인합니다.

교대로 들어 맞지 않습니다 (64 비트 이상의 시프트가 필요하지 않으므로 출력은 왼쪽 피연산자의 기본 유형일 수 있음)하지만 대칭과 같은 언어 디자이너 - 연산자 +*과 같이 특별한 경우는 싫어합니다.

내가 찾은 이전 질문에서 상대 :

그래, 이건 내 생각도했다. Afair이 정말 K에 & R I 코드는 어디에서 요청 이유 (1 << 1L1 + 1L 같은 유형 long이었다 ISO C에) ...

그래서

이 매크로 확인 확인을했다 귀하의 환경에서 올바르게 작동하고 있습니다. 복어를 이해하려면 매크로가 전혀없는 최신 코드를 보는 것이 좋습니다.


BF_ENC

라운드 기능 복어 (파이 스텔 함수)이다 Blowfishes F 기능을 나타낸다.

이 오른쪽에 그리고 of the Wikipedia page about Blowfish로서 설명된다

상부 오른쪽 그림은 복어 F의 기능을 나타낸다. 이 함수는 32 비트 입력을 4 개의 8 비트 분기로 나누고 분기를 S 박스의 입력으로 사용합니다. 출력은 모듈로 2^32 가산되고 XOR되어 최종 32 비트 출력이 생성됩니다.

+0

감사합니다. 네가 한 모든 것을 가지고있다. 이제는 이것이 의미하는 바가 하나 더 있다는 명확한 설명이 필요합니다. S [(R >> 24L)] 얼마나 오래 변화하고 있는지 모르겠습니다. 예를 들어, 만약 r = 20이면, 얼마나 많이 옮겨 질 것입니다. P.S : 나는이 물건에 익숙하지 않으므로 나를 약간 안내합니다. 감사! –

+0

생각은 R 값이 32 비트이고 오른쪽으로 24 비트 이동 했으므로 첫 번째 (가장 왼쪽) 8 비트가 남았음을 의미합니다. R이 20이면 물론 0으로 평가됩니다. –