2014-07-05 5 views
1

나는 C에서 텍스트 파일을 암호화 할 수있는 프로그램의 구현을 작성했으며 그 반대의 경우도 마찬가지입니다.Blowfish 알고리즘이 "표준"인가요?

BLOWFISH 알고리즘이 기본 제공됩니다. 하지만 내 생각은 다음과 같습니다. 긴 파일에 4 개의 문자 집합을 만드는 경우 0x12345678이라고 가정 해 봅니다. 파일을 읽는 올바른 순서를 알고 있기 때문에 디코딩 할 수 있습니다.

한편, memcpy()과 같이 사전에 만들어진 함수를 사용하면 읽는 내용은 이전 함수처럼 0x87654321처럼 정렬됩니다. 그러나 사용 된 알고리즘은 동일합니다.

파일에서 데이터를 읽고 획득하는 "표준"방법이 있습니까? 아니면 이전 예제 모두 괜찮습니까? 온라인 사이트 (blowfish online)에서 memcpy()과 함께 사용 된 버전은 ECB 모드를 사용할 때 해당 버전과 호환되지 않습니다. 0x1234567과 같은 데이터를 얻는 버전은 사이트에서 잘 작동합니다. (작업이란 내 프로그램으로 암호화 된 파일을 만들고 온라인으로 해독하는 것을 의미합니다.)

예를 들어 프로그램에서 코드를 작성하고 코드를 해독하는 경우 은 내 프로그램을 알지 못하는 다른 사람 (최소한 코드)이 코드화/해독해야합니다.

EDIT : memcpy() 함수는 배열의 가장 낮은 인덱스를 INT 번호의 오른쪽 끝으로 변환합니다.

는 64 비트 블록에 대한 데이터를 처리하는 코드이다

memcpy(&cl, &file_cache[i], sizeof(unsigned long)); 
memcpy(&cr, &file_cache[i + 4], sizeof(unsigned long)); 

그리고 이것은 (정확하게 블록마다 8 번 반복, 즉 버퍼로부터 판독을 정리하여, 잘 작동)의 핵심 부분 memcpy가 아닌 비트 마법을 사용하여 동일한 부() 및 엔디안 문제 준수 :

if (i==0){ 
    cl <<= 24; 
    L |= 0xff000000 & cl; 
    } 
    else if (i==1){ 
    cl <<= 16; 
    L |= 0x00ff0000 & cl; 
    } 
    else if (i==2){ 
    cl <<= 8; 
    L |= 0x0000ff00 & cl; 
    } 
    else if (i==3){ 
    //cl <<= 24; 
    L |= 0x000000ff & cl; 
    } 
    else if (i==4){ 
    cl <<= 24; 
    R |= 0xff000000 & cl; 
    } 
    else if (i==5){ 
    cl <<= 16; 
    R |= 0x00ff0000 & cl; 
    } 
    else if (i==6){ 
    cl <<= 8; 
    R |= 0x0000ff00 & cl; 
    } 
    else if (i==7){ 
    //cl <<= 8; 
    R |= 0x000000ff & cl; 
    } 

이어서 L과 R이 암호화되도록 전송된다. 이 마지막 구현은 다른 복어 버전을 온라인으로 사용하는 경우 작동하므로 원칙적으로 개선되어야합니다.

어떤 구현이 더 빠르거나 더 좋고/더 가벼운/강합니까? memcpy()이 권장되는 경우 cl 및 cr의 내용을 반대로/미러링하는 편리하고 빠른 방법이 있습니까? 당신은 4 바이트 일련의 단어로 파일을 읽을 경우 일관된 순서로 처리되는 개별 바이트를 확인하기 위해 필요에 따라

+3

귀하의 질문에 답변하려면 귀하의 구현이 그 결과와 일치하는지 확인하기 위해 [이 복어 테스트 벡터] (https://www.schneier.com/code/vectors.txt)를 검토하십시오. –

+5

암호화는 바이트 스트림을 통해 정의됩니다. 여러 바이트를 정수로 읽는 경우 리틀 엔디안 값과 빅 엔디안 값의 차이가있는 것으로 보입니다. 바이트 스트림에서 코드가 올바르게 작동하는지 확인해야합니다. Blowfish 알고리즘을 올바르게 구현하는 경우 Blowfish 알고리즘을 올바르게 구현 한 다른 사람들도 키를 알고 있고 해독 할 수 있어야하는 데이터를 보낼 수 있어야하며 암호화 된 데이터를 보낼 수 있어야합니다. 그들은 키를 알고 있고 암호를 해독 할 수 있어야합니다. 이것이 알고리즘이 표준화 된 이유입니다. –

답변

0

는 당신이 바이트를 교환, 메모리 레이아웃에서 그 단어의 endianness을 설명 할 필요가 .

그러나 파일을 일련의 바이트로 읽고 쓰고 메모리에 순서대로 직접 저장하면 (예 : 서명되지 않은 char 배열) 파일의 데이터는 메모리와 동일한 레이아웃이어야합니다. 그렇게하면 메모리에서 직접 또는 파일에서 직접 인코딩 할 때도 일관된 인코딩/디코딩을 얻을 수 있습니다.

1

맨 왼쪽 바이트는 일반적으로 암호화를위한 "첫 번째 바이트 보내기/받기"입니다. 즉 배열이있는 경우 가장 낮은 인덱스가 왼쪽에 있습니다. 아무 것도 지정되지 않은 경우이 표준은 임시입니다.그러나

Blowfish test vectors - GregS으로 표시된 바와 같이 - 명시 적으로 기본 순서를 지정, 그렇게 추측 할 필요가 없습니다 :

... 
All data is shown as a hex string withloading as 
data[0]=0x01; 
data[1]=0x23; 
data[2]=0x45; 
... 

을만큼 코드를 확인을있어 다음 같은 테스트 벡터를 생산으로는 입/출력은 테스트 벡터의 순서에 따라야한다는 것을 명심하십시오.

내부적으로 32 비트 또는 64 비트 워드으로 처리되는 경우에도 다른 데이터 유형 이 아닌 바이트 (또는 오중)를 암호화 API로 작동하도록 적극 권장합니다. 바이트와의 변환에 소요되는 시간은 실제 암호화/암호 해독과 비교하여 최소가되어야합니다.

+0

여기에서 사용하려는 경우 : [link] (https://www.schneier.com/code/vectors2.txt) 내 응용 프로그램이 /에서 /로 /에서 읽고 쓰는 경우 적절한 방법으로 테스트 할 수 있습니까? 파일? – thexeno

+0

Btw, 내 코드는'memcpy()'를 사용합니다.이 함수는 32 비트 int 변수 인 경우 문자열 4의 문자를 복사하여 폭을 채 웁니다. 가장 낮은 문자열 색인이 내 번호의 오른쪽 끝에 복사됩니다. 그래서 가장 낮은 인덱스가 오른쪽에 있으며 이는 내 코드가 사이트에서 구현 된 코드와 작동하지 않는 이유를 설명합니다. 이 양식을 사용했습니다 : 'memcpy (& cl, & file_cache [i], sizeof (unsigned long)); 복어에 대한 c_left 및 c_right 변수를 채우기 위해 memcpy (& cr, & file_cache [i + 4], sizeof (unsigned long)), ' . 비트/쉬프트 (on cl and cr) 8 비트를 한 번에 수행하면 더 효율적이지 않습니까? – thexeno

관련 문제