В нашей
рассылке вы узнаете о новых статьях, программах, и темах на форуме. Рассылка
выходит один раз в неделю, каждый четверг.
Подписаться на рассылку можно в этой форме:
Последний выпуск
Добро пожаловать на
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
...
Объявление на пляже:
- Граждане
отдыхающие! Просьба не заплывать за буйки! Наши спасатели дальше плавать
не умеют.
***
Муж вбегает в отделение
милиции и умоляет просит:
- Разыщите мою жену! Она исчезла! Вот
фотография.
- Кто-то посмотрел на фотографию и недоумевающе
стросил:
- А зачем?
Если у вас есть
желание поделиться своим опытом с читателями, вы являетесь обладателем
ценных, интересных статей
или авторских программ, а
может
вы просто хотите высказать свое мнение или замечание о
рассылке, просто
напишите
мне
. Я постараюсь уделить внимание каждому. А "
Клуб программистов
" всегда рад
приветствовать в своих рядах новых пользователей.