暗号化:
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);
}
復号化:
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);
}
pkcs#7 標準から取り外し可能なパディングを追加しようとしていますが、問題があります。
txt ファイルを扱う場合、プログラムは完全に動作しますが、 tar.gz または pdf ファイルを復号化しようとすると、復号化プログラムはファイル サイズの半分で停止します。
たとえば、サイズが 28272 バイトの tar.gz アーカイブを見てみましょう (prova は元のファイル、out は暗号化されたファイル、origdec は復号化されたファイルです)。
28272 prova
28272 out
12147 origdec
gnu/linux で libgcrypt を使用しています。