2012-11-23 3 views
0

Jim Conger가 C++ 코드로 변환 한 Bruce Schneier의 클래스로 텍스트를 암호화하고 싶습니다. 암호화 한 후 암호화 된 텍스트를 해독하고 싶습니다. 이 문제를 해결하려면 파일을 사용하고 있습니다. 샘플 프로젝트를 만들었지 만 해독 된 파일에는 초기 파일과 동일한 텍스트가 포함되어 있지 않습니다. 무엇이 문제 일 수 있습니까?코코아 프로젝트에서 C++ 코드로 복어 암호화

복어 클래스 파일은 link입니다.

나는 XCode에서 Command line tool 프로젝트를 만들고 main.m 파일을 main.mm으로 변경했습니다. 여기서 당신은 main.mm 파일의 내 내용을 찾을 수 있습니다 당신은 스트림을 암호화하는 패딩 블록 암호를 (CBlowFish::Encode의 소스 코드를 볼)를 사용하는

#import "blowfish.h" 
#include <stdlib.h> 
#include <stdio.h> 

#define my_fopen(fileptr, filename, mode) \ 
fileptr = fopen(filename, mode); \ 
if (fileptr == NULL) { \ 
fprintf(stderr, "Error: Couldn't open %s.\n", filename); \ 
exit(1); \ 
} 

const char *input_file_name = "test.txt"; 
const char *encoded_file_name = "encoded.txt"; 
const char *decoded_file_name = "decoded.txt"; 
unsigned char key[] = "thisisthekey"; 

int main(void) { 
    FILE *infile, *outfile; 
    int result, filesize; 
    const int n = 8; // make sure this is a multiple of 8 
    const int size = 1; 
    unsigned char input[n], output[n]; 

    CBlowFish bf; 
    bf.Initialize(key, sizeof(key)-1); // subtract 1 to not count the null terminator 

    my_fopen(infile, input_file_name, "rb") 
    my_fopen(outfile, encoded_file_name, "wb") 

    filesize = 0; 
    while (result = fread(input, size, n, infile)) { 
     filesize += result; 
     fwrite(output, size, bf.Encode(input, output, result), outfile); 
    } 

    fclose(outfile); 
    fclose(infile); 

    my_fopen(infile, encoded_file_name, "rb") 
    my_fopen(outfile, decoded_file_name, "wb") 

    while (result = fread(input, size, n, infile)) { 
     bf.Decode(input, output, result); 
     fwrite(output, sizeof(output[0]), filesize < result ? filesize : result, outfile); 
     filesize -= result; 
    } 

    fclose(outfile); 
    fclose(infile); 

    return 0; 
} 

답변

1

. 암호 해독 작업은 해독해야하는 채워진 청크가 무엇인지 알 수있는 방법이 없기 때문에 그렇게 할 수 없습니다.

예를 들어 "FOOBAR"을 암호화하고 있지만 "FOO"를 처음 읽으면 "XYZZY"로 암호화됩니다. 그런 다음 "BAR"을 "ABCDE"로 암호화합니다. 작성한 파일에는 "XYZZYABCDE"가 포함됩니다. 하지만 "XY" "ZZYA" "BCDE"입니까? 아니면 하나의 블록, "XYZZYABCDE"또는 무엇?

스트림을 암호화하려면 스트림 암호를 사용하십시오. 또는 임의의 블록으로 잘라 내고 싶다면 블록을 해독 할 수 있도록 출력 블록 경계를 보존해야합니다.

+0

예가 있습니까? –

+0

@ David 제발 내 질문에보십시오 : http://stackoverflow.com/questions/19031842/dycrypt-value-from-blowfish-objective-c – QueueOverFlow

1

해당하는 데이터 블록을 인코딩/디코딩해야합니다. fread()와 fwrite()는 같은 번호를 반환하지 않습니다. 바이트 (결과)를 가져와 평문 데이터 블록과 암호 텍스트 데이터 블록이 정렬되지 않도록하십시오.

데이터 블록 길이 (예 : 64 바이트)를 정의하고 인코딩 및 디코딩 할 때이를 고정하십시오.

그렇지 않으면 1 바이트의 "데이터 블록"을 사용하는 스트림 암호를 사용하십시오.)

+0

어떤 예도 있습니까? –

+1

http://en.wikipedia.org/wiki/Stream_cipher –

+0

감사합니다. 이제 어디서부터 시작해야할까요? –