Рассмотрим подробнее содержимое файла.
В содержимом файла отчетливо прослеживаются последовательности значения байт, начиная с «00» (на картинке отмечены красной рамкой). При этом, некоторые значения байтов выбиваются из данной последовательности. Можно сделать предположение, что выделенные байты в исходном файле были равны значению «00». Согласно правилу шифрования с использованием операции «побитового исключающего ИЛИ» («⊕»):
K ⊕ 0 = K .
Следовательно, можно сделать вывод, что в качестве ключа использовался последовательный циклический счетчик байтов от «00» до «FF» включительно. Или другими словами, ключом шифрования каждого байта является его номер по модулю 256.
Для проверки данного предположения необходимо написать программу, осуществляющую расшифрование файла. Процедура расшифрования файла симметричная к процедуре шифрования, то есть:
T ⊕ K = C
C ⊕ K = T
или T ⊕ K ⊕ K = T , где
Т – исходное значение байта,
K – ключ шифрования,
C – зашифрованное значение байта.
Пример такой программы на языке C++ представлен на листинге.
Листинг. Программа расшифрования файла
int main()
{
// файл на чтение
FILE* fin = fopen("pic_v1.bmp", "rb");
// файл на запись результата
FILE* fout = fopen("pic_v1_dec.bmp", "wb");
// счетчик байтов - ключ
unsigned char key = 0;
unsigned char buf;
// чтение первого байта в буфер BUF из файла FIN
fread(&buf, 1, 1, fin);
// цикл, пока не конец файла FIN
while (!feof(fin))
{
// выполнение операции XOR между считанным байтом BUF
// и ключом-счетчиком KEY
buf = buf ^ key;
// запись результата в файл FOUT
fwrite(&buf, 1, 1, fout);
// увеличение значения ключа-счетчика
key++;
// чтение следующего байта из файла FIN
fread(&buf, 1, 1, fin);
} // while
// Закрытие файлов
fclose(fout);
fclose(fin);
return 0;
}
В результате выполнения программы получается новый файл “pic_v1_dec.bmp”, который открывается в редакторе изображений.
Рисунок 2 – Расшифрованный BMP-файл
Предположение на счет алгоритма генерации ключа шифрования оказалось верным.