c aes256 заполнение стандартным pkcs#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);
}

расшифровывать:

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, программа дешифрования останавливается на половине размера файла!
Например, возьмем архив tar.gz, размер которого составляет 28272 байта (prova - исходный файл, out - зашифрованный файл, а origdec - расшифрованный файл):

28272   prova
28272   out
12147   origdec

Я использую libgcrypt на GNU / Linux!

2 ответа

Проблема, вероятно, в том, что вы без вашего ведома используете расширение языка Си в GCC: Мнимые числа. Литералы 0x0i а также 0x0j являются литералами мнимых чисел. Если вы используете любое другое имя для своей переменной, вы получите ошибки компиляции.

Кажется, вы ошибаетесь в представлении чисел и их представлении. В вашей программе целочисленный литерал 0x0a является представлением двоичного представления 00001010. Это означает, что вы можете использовать переменные i а также j напрямую, вместо того, чтобы пытаться представить их в виде шестнадцатеричных чисел:

plain_text[j] = i;

а также

if(encBuffer[i] == i)

Есть много вещей не так:

  • Вы добавляете заполнение к любому блоку, который содержит нулевой байт. Двоичный файл, такой как ваш tar.gz, вероятно, будет содержать много нулевых байтов в отличие от вашего текстового файла. Вам нужно определить, когда вы прочитали последний блок (и его размер), посмотрев возвращаемое значение fread (оно будет < 16) и проверив ferror в случае ошибки чтения.
  • Вы используете 0xi и 0xj, когда имеете в виду только i и j.
  • Для PKCS#7 вам нужно записать количество байтов заполнения в качестве значения заполнения (16-i), а не i, которое является оставшимися байтами данных.
  • При расшифровке вы пытаетесь как-то обнаружить заполнение в любом блоке. Вот почему ваш decryot короткий. Вам необходимо прочитать и расшифровать весь зашифрованный текст, а затем удалить отступы только из последнего блока.

Надеюсь, это поможет!

Другие вопросы по тегам