2012-03-11 3 views
1

Cipher Block Chaining (CBC) 모드를 사용하여 AES를 코딩하려고합니다. 나는 구조가 정확하다는 것을 확신한다. (해독 할 때 AES와 역으로 보내기 전에 새로운 암호문을 xoring한다. 암호화 된 파일을 원래의 평문에 복호화하는 것이 문제 다. 그것은 xored 방법과 관련이있을 수 있습니다. 나는 내 AES 알고리즘이 정확하다는 것을 알고 있습니다. 두 문자 배열을 함께 xor. 두 가지를 함께 xor 한 결과를 취한 다음 xor 또는 xor 중 하나를 반환하면 내가 그 기능을 확인할 때 대답으로, 다시 다른 피연산자를 받아야합니다. 그러나, 내가 일반 텍스트로 읽을 경우. 그런C에서 xoring에 문제가 있습니다

작동하고 이전 암호문

//THERE IS A RANDOM INITIALIZATION VECTOR BEFORE GETTING INTO THE WHILE LOOP 
    while ((bytes_in = (read(fin, plaintext, AES_BLOCK)))) 
    { 
     for (count = 0; count < AES_BLOCK; count++){ 
     xor[count] = (plaintext[count])^(ciphertext[count]); 
     } 
     //AES STUFF NOT SHOWN SO THERE ISN'T MUCH CODE 
     status = write (fdsk, ciphertext, strlen (ciphertext)); 
     for (count =0; count < AES_BLOCK; count++) 
     plaintext[count] = '0'; 
    } 
함께에 xor하지 않습니다

복호화 부분 :

bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector 
while(total_bytes < aes_length) 
{ 
bytes = read(fin, ciphertext, AES_BLOCK); 
for(count = 0; count < AES_BLOCK; count++){ 
    plaintext[count] = (xor[count])^(previous_CT[count]); 
    printf("plaintext %d", plaintext[count]); 
} 
} 

내 문제/질문을 요약하면 : 내가 할 필요가 인식하지 오전 문자를 XOR 연산 뭔가가있는 경우 가 궁금하네요. 내가 올바른 방법으로하고있는 것 같지만 어떤 이유로 정확한 결과를 얻지 못하고있다. 나는 그것이 내 프로그램을 어지럽히는 정보를 읽는 방법 일 수 있는지 궁금합니다. 제발 도와주세요! 감사합니다.

+0

하나의 디버깅 기술은 코드에서 모든 AES 내용을 제거하고이를 시도하는 것입니다. 코드는 이전 블록 (또는 IV)과 함께 각 블록을 xoring하게됩니다. 이것은 디버거에서 따라하기 쉽고 아마도 문제가 더 쉽게 발견 될 것입니다. 그것이 작동 할 때 AES 코드를 다시 놓을 수 있습니다. –

+0

해독하는 동안 왜 'fin'에서 두 번 연속으로 읽는 지 궁금합니다. – Elalfer

+0

어떤 종류의 시스템입니까? 파일이 바이너리 모드로 열렸습니까? (유닉스 시스템에서는 중요하지 않습니다)? 'xor','plaintext', ciphertext'와'previous_CT'의 타입은 무엇입니까? –

답변

0

나를 밖으로 점프 버그는이 라인에 : 나는 당신이 정말로 원하는 확신

status = write (fdsk, ciphertext, strlen (ciphertext)); // bug here 

:

status = write (fdsk, ciphertext, AES_BLOCK); 

두 버전 모두 동일한 결과를 생성 할 수 있지만 때로는 암호가 '\ 0'바이트를 생성합니다. e를 암호문의 중간에 놓은 다음 첫 번째 버그 버전은 쓰기를 원하는 것보다 더 짧게 자릅니다. (동일한 문제가 XORing "Hello World!" cuts off string에서 발생합니다).

나는 당신이 XOR 연산의 왼쪽과 오른쪽에 정확히 같은 값을 가질 경우에만 발생

하는 XOR 연산에서 모든 공의의를 얻을. 실수로 잘못된 버퍼에 데이터를 복사했거나 나중에 사용할 수 있도록 데이터를 중간에 복사하여 왼쪽과 오른쪽에 중복 데이터 복사본이 생겼습니까?

0

질문에있는 코드가 실제로 사용하는 코드 인 경우 문제는 해독 할 때 암호화 텍스트가 실제로 xoring되지 않는다는 것입니다. 파일에서 ciphertext으로 읽되 previous_CT으로 xor 연산을 수행합니다. 아래의 추가 의견에

봐 :

// NOTE - here you read into `previous_CT` 
bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector 

while(total_bytes < aes_length) 
{ 
bytes = read(fin, ciphertext, AES_BLOCK); // NOTE: here you read into `ciphertext` 
for(count = 0; count < AES_BLOCK; count++){ 
    plaintext[count] = (xor[count])^(previous_CT[count]); // NOTE: using `previous_CT` 
    printf("plaintext %d", plaintext[count]); 
} 
} 
+0

나는 똑같은 것을 보았습니다 만,'read()'와'for' 루프 사이에서'ciphertext'를'xor'로 해독 한 AES 코드가 없다고 생각했습니다. –

+0

@ GregHewgill 당신 말이 맞습니다. xor 변수에 해독되는 AES 코드가 있습니다. xor 변수를 암호문으로 변경하더라도 작동하지 않습니다. xor 연산에서 0을 모두 얻습니다. – tpar44

+0

즉, 'xor' 또는'ciphertext '가 될지 확실하지 않은 코드가'previous_CT '로 이동하는 것으로 보이는 코드가 있어야한다는 의미입니까? 그런 일이 있습니까? –

관련 문제