Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 3
з курсу „ Захист інформації в комп’ютерних системах ”
Львів – 2005
Мета роботи: Створити програму, яка б загодовувала текст з файлу у BMP-файл без помітних змін у зображенні та потім при могла відновити закодований текст із BMP-файлу.
Виконання роботи:
У BMP-файлі із глибиною кольору 24 біт кожен піксель описується трьома байтами, що відповідають за червону, зелену та синю складові відповідно.
Для того щоб закодувати символи тексту у такий BMP-файл використовуються молодші біти кожного байту. Їх зміна дуже незначно впливає на зміну кольору – зміна молодшого біта в одному байті змінює відтінок відповідного кольору у пікселі всього на , що при перегляді помітити практично неможливо.
Для того, щоб при відтворенні тексту із BMP-файлу була відома довжина зашифрованого тексту, перед записом власне тексту у BMP-файл, я записую у BMP-файл двобайтове число у якому збережено довжину вхідного тексту у байтах.
Текст програми:
#include "stdafx.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
FILE * pic, * txt, * out;
void error();
void encrypt(char*,char*,char*); // text into bmp
void decrypt(char*,char*,char*); // text from bmp
int main(int argc, char* argv[])
{
char mode;
if (argc!=4) error();
mode=argv[1][0];
if ( mode=='e') encrypt(argv[1],argv[2],argv[3]);
else if ( mode=='d') decrypt(argv[1],argv[2],argv[3]);
else {
error(); return 1;
}
puts("\nDONE!");
fclose(pic);
fclose(out);
return 0;
}
void encrypt(char* a1,char* a2,char* a3) //into bmp
{
int i=0, count=0;
unsigned int ch, buf;
int text=open(a3,1,1);
unsigned int textlength=filelength(text); // calculate text file length
close(text);
if ( ((pic = fopen(a2,"rb")) != NULL) &&
((txt = fopen(a3,"rb")) != NULL) &&
((out = fopen("mix.bmp","wb")) != NULL) )
printf("Files've been successfully open!\n");
else {
printf("Files can't be open!\n");
exit(1);
};
printf(" mode: %s = ENCRYPTING;\n input image file: %s;\n",a1,a2);
printf(" input text file: %s;\n output (mixed) image file: mix.bmp.\n",a3);
for (i=0;i<55;i++) fputc(fgetc(pic), out); // ------------ copy BMP header ---
// ------------------------------------------- save text length to BMP file ---
for(i=0;i<=15;i++){ // text length is stored with 16 bits
fread(&buf,1,1,pic); // read byte from BMP
if ((textlength&(int)pow(2,i))==0) // if bit #i of current byte = 0
buf = buf & 0xFFFE; // set youngest bit of BMP byte to 0
else buf = buf | 0x0001; // else - to 1
fwrite(&buf,1,1,out); // write 'mixed' byte to BMP
}
while(!feof(txt)) { // -------------------------------- encode the text ---
ch = fgetc(txt); // read byte from text
for(i=0;i<=7;i++){ // cycle within text byte
fread(&buf,1,1,pic); // read byte from BMP
if ( (ch&(int)pow(2,i)) == 0 ) // if bit #i from text byte = 0
buf = buf & 0xFE; // set youngest bit of BMP byte to 0
else buf = buf | 0x01; // else - to 1
fwrite(&buf,1,1,out); // write 'mixed' byte to BMP
}
}
fread(&buf,1,1,pic); // ---------------------------------- copy the rest ---
while(!feof(pic))
{
fwrite(&buf,1,1,out);
fread(&buf,1,1,pic);
}
fclose(txt);
}
void decrypt(char* a1,char* a2,char* a3) //from bmp
{
int i=0, count=0;
unsigned int ch, buf, textlength, l=0;
if ( ((pic = fopen(a2,"rb")) != NULL) &&
((out = fopen(a3,"wb")) != NULL) )
printf("Files've been successfully open!\n");
else {
printf("Files can't be open!\n");
exit(1);
};
printf(" mode: %s = DECRYPTING;\n input (mixed) image file: %s;\n",a1,a2);
printf(" output text file: %s.\n",a3);
for (i=0;i<55;i++) fgetc(pic); // ------------------------ skip BMP header ---
textlength=0; // ---------------------------------------- get text length ---
for(i=0;i<=15;i++){ // text length is stored with 16 bits
fread(&buf,1,1,pic); // read byte from BMP
if ( buf & 0x0001 == 1 ) // if the youngest bit of BMP byte = 1
textlength = textlength | (int)pow(2,i); // put 1 into bit #i of text byte
}
for (l=0;l<textlength;l++) { // -------------- extract the text from BMP ---
ch = 0;
for(i=0;i<=7;i++){ // cycle within text byte
fread(&buf,1,1,pic); // read byte from BMP
if ( buf & 0x01 == 1 ) // if the youngest bit of BMP byte = 1
ch = ch | (int)pow(2,i); // put 1 into bit #i of text byte
else ch = ch & ~(int)pow(2,i); // else - put 0
}
fwrite(&ch,1,1,out); // write 'extracted' byte to text file
}
}
void error()
{
printf("Wrong parameters!\nSYNTAX: txt_into_bmp e|d <input file> <output file> \n");
getchar(); exit(1);
}
Висновок: виконуючи цю лабораторну роботу, я ознайомився із внутрішньою структурою растрових зображень формату BMP, вивчив та реалізував метод «невидимого зберігання» тексту у BMP-файлі.