2012-03-30 3 views
1

저는 암호화에 매우 관심이 있습니다. 프로그래밍을 좋아하기 때문에 XTEA 암호화 알고리즘을 사용하여 파일을 암호화하는 작은 프로그램을 만들기로 결정했습니다. 내가 Wikipedia에서 영감을 얻고, 그래서 암호화를 수행하는이 기능을 썼다 (거의 동일로 공간을 절약하기 위해, 나는 해독 기능을 게시하지 않습니다) :XTEA 암호화 기능을 사용하는 유형

void encipher(long *v, long *k) 
{ 
    long v0 = v[0], v1 = v[1]; 
    long sum = 0; 
    long delta = 0x9e3779b9; 
    short rounds = 32; 
    for(uint32 i = 0; i<rounds; i++) 
    { 
     v0 += (((v1 << 4)^(v1 >> 5)) + v1)^(sum + k[sum & 3]); 
     sum += delta; 
     v1 += (((v0 << 4)^(v0 >> 5)) + v0)^(sum + k[(sum>>11) & 3]); 
    } 
    v[0] = v1; 
    v[1] = v1; 
} 

을 지금은 할 때 그것을 사용하는,이 코드 작성 :

long data[2]; // v0 and v1, 64bits 
data[0] = 1; 
data[1] = 1; 

long key[4]; // 4 * 4 bytes = 16bytes = 128bits 
*key = 123; // sets the key 

cout << "READ: \t\t" << data[0] << endl << "\t\t" << data[1] << endl; 
encipher(data, key); 
cout << "ENCIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

decipher(data, key); 
cout << "DECIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

을 나는 항상 얻을 중 런타임 충돌이나 잘못된 암호문 해독 텍스트 : enter image description here

나는 프로그램의 기초를 이해 할 수 있지만 난 정말 안 무엇인지 알아라. 내 코드가 잘못되었습니다. 암호화 된 데이터 [0]와 데이터 1이 같은 이유는 무엇입니까? 그리고 해독 된 데이터가 시작 데이터와 완전히 다른 이유는 무엇입니까? 유형을 잘못 사용하고 있습니까? 내 문제를 해결하는 데 도움이되기를 바랍니다. :).

답변

4

문제는 여기에 있습니다 : 또한

v[0] = v1; // should be v[0] = v0 
v[1] = v1; 

, 당신은 단지 키의 처음 4 바이트를 설정합니다. 나머지 12 바이트는 초기화되지 않습니다. 이런 식으로 뭔가를 시도 :

key[0] = 0x12345678; 
key[1] = 0x90ABCDEF; 
key[2] = 0xFEDCBA09; 
key[3] = 0x87654321; 

The fixed code 날이 출력을 제공 : 대한 답변을

READ:   1 
       1 
ENCIPHERED:  -303182565 
       -1255815002 
DECIPHERED:  1 
       1 
+0

감사합니다! v1과 v0에서 내 어리석은 실수를 볼 수 있습니다. 키의 바이트 설정을 설명해 주시겠습니까? 난 정말 16 진수에 대해 많이 알지는 못하지만, 키 [1 ... 3]을 0으로 설정할 수는 없습니까? 불행히도 귀하의 대답은 주요 문제를 해결하지 못했지만 많은 도움이되었습니다. – Janman

+0

@Janman : 물론 키 [1], 키 [2] 및 키 [3]을 0으로 설정할 수 있지만 * something *로 설정해야합니다. 그것들을 아무것도 설정하지 않으면, 그들은 unintialized이며, 메모리의 그 부분에서 임의의 값을 가지게됩니다. 변화와 함께 작동하지 않았나요? 아마도'해독 '에서 비슷한 문제가 있습니까? –

+0

대단히 고맙습니다. 지금은 효과가 있습니다. 내가 할 수있는 질문이 하나 더 있습니다. 파일에서 데이터를 읽으려는 경우 'myIfstream.readsome ((char *) & data [0], 4);' 그런 다음이 절차를 사용하여 암호화하십시오. – Janman

관련 문제