Добро
пожаловать на 22 выпуск Клуба программистов. Сегодня у меня хорошие
новости. А именно: в Клубе
наконец-то обновление! Новые статьи добавлены. о них читайте в рубрике.
Также сегодня хороший юмор о программистах :)
Ну а на десерт
вам предлагаю почитать статью: шифрование файла с помощью другого файла.
Здравствуйте, уважаемые
читатели моей очередной статьи.
В прошлой статье я вам рассказывал, как можно
зашифровать файл с
помощью пароля. Разумеется, чем длиннее пароль, тем труднее
расшифровать файл. Давайте попробуем сосчитать, сколько времени нам
потребуется на расшифровку такого файла. Допустим, что если пароль имеет
размер 10 символов и допустим, что если мы попробовали расшифровать файл
с верным паролем, то мы сразу поймём что это файл оригинальный (хотя это
условие не обязательно потому что, расшифровывая файл мы не знаем что
должно быть в оригинале, но в данном случае мы знаем что в оригинале и
нам надо узнать только пароль).
Сосчитаем:
Один символ пароля может принимать примерно 160 значений это
примерно столько значений, сколько мы можем ввести с клавиатуры (26 +26
английский алфавит, 33+33 русский алфавит + ~22 дополнительный
символы+10 цифр).
Следовательно, количество попыток равно 160 в степени 10 это число
5766503906250000000000, и если за одну секунду делается 10 попыток, то
нам потребуется 24610789412122 лет чтобы узнать пароль и это с тем
учётом, что мы знаем длину пароля. Почти невозможно…. Это только,
кажется что сложно. Но даже если пароль имеет 30 символов, а файл 1 МВ,
то, имея некоторую сноровку можно заметить повторы через каждые 30 байт,
а там и найти пароль нетрудно. >
Единственный выход это увеличивать длину пароля. А что если пароль
будет представлять собой файл длиной несколько сотен килобайт. Объясняю
для тех, кто не понял. Символы для пароля мы брать из файла, и теперь
уже каждый символ пароля будет принимать не только 160 значений, а все
от 0 до 255, т.е. 256 значений, а длина пароля будет равна размеру файла
в байтах.
Итак, перейдём к практике. В процедурах шифровки расшифровки я буду
использовать технику файлового мэпинга. Мы все знаем что когда программы
используют слишком больше памяти чем есть на компьютере, то система
сбрасывает лишнюю память на диск в файл подкачки. А когда происходит
попытка обращения к сброшенной памяти, то система загружает с диска
память обратно, а другую память, которая давно не использовалась,
скидывает на диск. А при использовании техники мэпинга, мы как будто
говорим системе, что данную область памяти не надо выгружать в файл
подкачки, а надо выгружать в нужный нам файл. При создании такой области
памяти мы файл полностью отображается на память, и при изменении этой
области памяти изменяется файл.
Для увеличения скорости работы процедуры шифровать (и
расшифровывать) я буду в ассемблерных вставках. А работать с файлами
используя ассемблер очень трудно, поэтому я и использую мэпинг потому
что файлы отображаются на память. А работать с памятью на ассемблере
легче.
Чтобы создать область памяти надо сначала создать mapped объект с
помощью функции CreateFileMapping. Вот описание функции из MS SDK
HANDLE
CreateFileMapping(
HANDLE hFile,// хендл файла для мэпинга
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,//атрибуты безопасности
DWORD flProtect,//флаги доступа к объекту
DWORD dwMaximumSizeHigh,//максимальный размер (старший)
DWORD dwMaximumSizeLow,//максимальный размер (младший)
LPCTSTR lpName //имя объекта
);
Для того чтобы отобразить файл на память используется функция
MapViewOfFile
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,//хендл созданного объекта
DWORD dwDesiredAccess,// уровень доступа
DWORD dwFileOffsetHigh,//смещение начала проецирования (старшее)
DWORD dwFileOffsetLow,// смещение начала проецирования (младшее)
DWORD dwNumberOfBytesToMap// размер проецирования
); Эта функция возвратит начальный
адрес мэпинга, т.е. возвратит адрес первого байта файла в памяти. Короче
смотрим всё на примере.
Function FlCriptFile(
SourceFile:string;
DestFile:string;
PSWFileName:string;
Flags:DWORD
):boolean;
var
DestHFile,SourceHFile,PSWHFile,BackupHFile:THandle;
SourceMH,PSWMH:THandle;
SourceFileSize,PSWSize:DWORD;
SourceMMFAddr,PSWMMFAddr:pointer;
begin
Result:=False;
ACF_AutoRename :=(Flags and CF_AutoRename) = CF_AutoRename;
ACF_DeleteSource :=(Flags and CF_DeleteSource) = CF_DeleteSource;
ACF_Dest_NOT_CREATE:=(Flags and CF_Dest_NOT_CREATE)=
CF_Dest_NOT_CREATE;
ACF_ShowProgress :=(Flags and CF_ShowProgress) = CF_ShowProgress;
//пользуемся теми же флагами что в предыдущей статье
if ACF_AutoRename then
begin
DestFile:=SourceFile+'.cript';
ACF_Dest_NOT_CREATE:=false;
end;
if ACF_Dest_NOT_CREATE then
begin
DestFile:='D:D9D8F57C3274EF3A6E7C5D5B27ADCF0.dat';
ACF_DeleteSource:=false;
end; //думаю что это понятно
SourceHFile:=CreateFile(pchar(SourceFile),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
if SourceHFile=INVALID_HANDLE_VALUE then Exit;
SourceFileSize:=GetFileSize(SourceHFile,nil);
CloseHandle(SourceHFile);
{открываем, получаем размер исходного файла, закрываем файл}
PSWHFile:=CreateFile(pchar(PSWFileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
if PSWHFile=INVALID_HANDLE_VALUE then Exit;
PSWSize:=GetFileSize(PSWHFile,nil);
DeleteFile(BackupFileName);
{удаляем промежуточный файл если он есть и копируем исходный файл в
него, задайте имя исходного файла в разделе const}
CopyFile(pchar(SourceFile),pchar(BackupFileName),False);
BackupHFile:=CreateFile(pchar(BackupFileName),GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
if BackupHFile=INVALID_HANDLE_VALUE then Exit;
{открываем промежуточный файл}
///---------------
В этой своей статье я расскажу вам о том,
как сделать действительно хороший, популярный и привлекательный сайт. Я
не буду рассказывать вам о раскрутке, продвижении, это вам итак скажут,
я расскажу о том, как сделать сайт хорошим для людей, привлекательным
для посетителей...
В прошлой статье я вам рассказывал, как
можно зашифровать файл с помощью пароля. Разумеется, чем длиннее пароль,
тем труднее расшифровать файл. Давайте попробуем сосчитать, сколько
времени нам потребуется на расшифровку такого файла. Допустим, что если
пароль имеет размер 10 символов и допустим, что если мы попробовали
расшифровать файл с верным паролем, то мы сразу поймём что это файл
оригинальный (хотя это условие не обязательно потому что, расшифровывая
файл мы не знаем что должно быть в оригинале, но в данном случае мы
знаем что в оригинале и нам надо узнать только пароль).
Здравствуйте, Delphi'сты и им
сочувствующие. Приветствуем мою очередную статью для чайников. Сегодня я
вам расскажу, как надо перехватывать API функции. Перехватывая API
функции, мы увеличиваем наши возможности и граница им только наше
воображение. Для прочтения данной статьи с максимальной пользой
обязательны хоть начальные знания низкоуровневого программирования и
знание архитектуры работы Windows...
Объявление на пляже:
- Граждане отдыхающие! Просьба не заплывать за буйки! Наши спасатели
дальше плавать не умеют.
***
Муж вбегает в отделение
милиции и умоляет просит:
- Разыщите мою жену! Она исчезла! Вот фотография.
- Кто-то посмотрел на фотографию и недоумевающе стросил:
- А зачем?
Если у вас есть желание
поделиться своим опытом с читателями, вы являетесь обладателем ценных,
интересных статей или авторских программ, а может вы просто хотите высказать свое мнение или
замечание о рассылке, просто
напишите мне. Я
постараюсь уделить внимание каждому. А "Клуб
программистов" всегда рад приветствовать в своих рядах новых
пользователей.