2013-01-07 6 views
-1

암호화 :C의 AES256 패딩 7 표준

while(!feof(fp)){ 
    memset(plain_text, 0, sizeof(plain_text)); 
    retval = fread(plain_text, 1, 16, fp); 
    if(!retval) break; 
    for(i=0; i<16; i++){ 
     if(plain_text[i] == 0){ 
      for(j=i; j<16; j++){ 
       plain_text[j] = 0x0i; 
      } 
      break; 
     } 
    } 
    gcry_cipher_encrypt(hd, encBuffer, txtLenght, plain_text, txtLenght); 
    fwrite(encBuffer, 1, 16, fpout); 
} 

해독 : 내가 PKCS # 7 표준에서 이동식 패딩을 추가하기 위해 노력하고있어하지만 난 문제가

while(!feof(fp)){ 
    memset(plain_text, 0, sizeof(plain_text)); 
    retval = fread(plain_text, 1, 16, fp); 
    if(!retval) break; 
    gcry_cipher_decrypt(hd, encBuffer, txtLenght, plain_text, txtLenght); 
    for(i=0; i<16; i++){ 
     if(encBuffer[i] == 0x0i){ 
      j = 0; 
      j += i; 
      if(encBuffer[++i] == 0x0j){ 
       last = 1; 
       i--; 
       j=i; 
       printf("found a %d\n", i); 
       break; 
      } 
      else i--; 
     } 
    } 
    //printf("%d\n", j); 
    if(last == 1) fwrite(encBuffer, 1, j, fpout); 
    else fwrite(encBuffer, 1, 16, fpout); 
} 

.
txt 파일로 작업하면 프로그램이 제대로 작동하지만 을 해독하려고 시도하면 일부 tar.gz 또는 pdf 파일의 크기가 파일 크기의 절반으로 줄어 듭니다!

28272 prova 
28272 out 
12147 origdec 

내가 libgcrypt를에 사용하고 있습니다 : 예를 들어
가의 크기는 28,272 바이트입니다 tar.gz의 아카이브를 보자 (PROVA 원본 파일, 밖으로 암호화 된 파일 및 origdec는 해독 된 파일입니다) GNU/linux!

+1

'while'조건이 약간 어리석지 않습니까? –

+2

'0x0i' 및'0x0j' 란 무엇입니까? 그것도 컴파일해서는 안됩니다. –

+0

@JoachimPileborg 그들은 두 int입니다! 나는 내부 배열을 검색하기 위해 인덱스로 사용한다. – polslinux

답변

3

GCC : Imaginary numbers에서 C 언어 확장을 사용하면 모르는 사이에 문제가 발생한 것일 수 있습니다. 리터럴 0x0i0x0j은 허수 리터럴입니다. 변수에 다른 이름을 사용하면 컴파일 오류가 발생합니다.

숫자 표현과 실수 표현을 혼동하는 것처럼 보입니다.

plain_text[j] = i; 

을 : 당신의 프로그램에서 정수 리터럴 0x0a이는 대신 16 진수로 제시하려고 노력의 직접 변수 ij를 사용할 수 있다는 것을 의미 이진 표현 00001010.의 표현입니다
if(encBuffer[i] == i) 
3

많은 것들이 잘못이 있습니다

  • 당신은 AZ가 포함 된 블록에 패딩을 추가하고 에로 바이트. tar.gz와 같은 바이너리 파일에는 텍스트 파일과 달리 0 바이트가 포함될 가능성이 높습니다. fread의 반환 값 (< 16)을보고 읽기 오류가있는 경우 ferror를 검사하여 마지막 블록 (및 그 크기)을 읽었을 때를 식별해야합니다.
  • i와 j를 의미 할 때 0xi와 0xj를 사용하고 있습니다.
  • PKCS # 7의 경우 남은 데이터 바이트 인 i가 아닌 패딩 값 (16-i)으로 패딩 바이트 수를 써야합니다.
  • 암호 해독 중에는 어떤 블록에서든 어떻게 든 패딩을 검색하려고합니다. 이것이 왜 당신의 decryot 짧은 것입니다. 모든 암호 텍스트를 읽고 해독 한 다음 마지막 블록에서만 채우기를 제거해야합니다.

희망 하시겠습니까?