加密:
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!
答案 0 :(得分:3)
问题可能是,在您不知情的情况下,您在GCC中使用C语言的扩展:虚数。文字0x0i
和0x0j
是虚数字文字。如果对变量使用任何其他名称,则会出现编译错误。
似乎你错误地将数字的表示与它们的表示相混淆。在您的程序中,整数文字0x0a
是二进制表示00001010的表示。这意味着您可以直接使用变量i
和j
,而不是尝试将它们呈现为十六进制数:
plain_text[j] = i;
和
if(encBuffer[i] == i)
答案 1 :(得分:3)
有很多错误:
希望有所帮助!