Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Требуется помощь programmera!


Автор: lesha 6.1.2004, 04:57
Попал в руки исходник программы но сам в ней не могу разобраться confused.gif . Есть exe-шник, рабочий, но с кодом у меня проблема.
Собственно сам код:

program key;

{$APPTYPE CONSOLE}

uses
Windows,
Classes,
SysUtils,
KbCrypt,
common,
base64;

const
SKeyFile = 'server.key';
var
S, PWD, KeyFile: string;
My: TCryptLib;
sKey: TKey;
F: TEXT;
Memory: TMemoryStream;
MK, AK, nDays, MaxComps: DWORD;
begin
KeyFile := 'key.txt';
MaxComps := StrToIntDef(ParamStr(1), 1);
nDays := StrToIntDef(ParamStr(2), 365);
Assign(F, KeyFile);
Reset(F);
Readln(F, S);
if S = '' then Exit;
Writeln('Using file with key: '+KeyFile);
My := TCryptLib.Create(nil);
My.Password := #0#23#128#0#98#108#63#125#201#135#1#72;
My.Compression := LZ;
AK := 61235349;
MK := 325634;
My.AddKey := AK;
My.MultKey := MK;

Hex2Str(S);
sKey := Str2Key(S);
Write( ' Password:' );
Readln(PWD);
if PWD = '' then Exit;
if PWD <> (' '+DateToStr(Date)+'.' ) then
raise Exception.Create('Bad password.' );
Writeln(' Info: ' );
S := sKey.key;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
Writeln(S);
S := sKey.uid;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
Writeln(S);
S := sKey.info;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
Writeln(Replace(S, ']', ']'#13#10' ' );
S := sKey.date;
Writeln(S);
Writeln(' ' );
Writeln(' MaxComps: ', MaxComps);
Writeln('Expiration Date: ' , DateToStr(Now+nDays) );
Writeln('_____________________________________________________' );
Write('Generate key file? : ' );
Readln(PWD);
if not SameText(PWD, 'Y' ) then
begin
Writeln('Canceled.' );
Exit;
end;

Memory := TMemoryStream.Create();
try
WriteCert(Memory, sKey, MaxComps, Now-1, Now+nDays);
My.EncryptMemory(Memory);
Memory.Position := 0;
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps));
Base64Encode_stream(Memory);
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps)+'.base64' );
FreeAndNil(Memory);
finally
Memory.Free;
end;
System.Writeln('OK.' );
end.

Кто разобрался, расскажите. Очень надо butbut.gif

Автор: Fedor 6.1.2004, 05:34
А что именно тебе нужно узнать? А то какой-то безпредметный разговор получится...

Автор: <Spawn> 6.1.2004, 06:48
Код
program key;

//Консольное приложение
{$APPTYPE CONSOLE}

//подключаем модули
uses
Windows,
Classes,
SysUtils,
KbCrypt,
common,
base64;

//Объявляем константы
const
SKeyFile = 'server.key';

//Объявляем переменные
var
S, PWD, KeyFile: string;
My: TCryptLib;
sKey: TKey;
F: TEXT;
Memory: TMemoryStream;
MK, AK, nDays, MaxComps: DWORD;
begin
KeyFile := 'key.txt';
//Пытаемся получить значение первого аргумента командной строки. В случае неудачи MaxComps присвоить значение "1"
MaxComps := StrToIntDef(ParamStr(1), 1);
//То же самое с nDays
nDays := StrToIntDef(ParamStr(2), 365);
//Связать файловую переменную F с файлом на диске
Assign(F, KeyFile);
//Открыть файл
Reset(F);
//Пытаемся порчесть строку
Readln(F, S);
//Если ни чего не прочли то выйти из программы
if S = '' then Exit;
//Вывод в консоль значения KeyFile
Writeln('Using file with key: '+KeyFile);
//Создаем экземпляр класса TCrypLib
My := TCryptLib.Create(nil);
// Заполнение нужных свойств класса
My.Password := #0#23#128#0#98#108#63#125#201#135#1#72;
My.Compression := LZ;
AK := 61235349;
MK := 325634;
My.AddKey := AK;
My.MultKey := MK;

//Видимо какие то самодельные функции
Hex2Str(S);
sKey := Str2Key(S);
//Выводим в консоль 'Password:'
Write( ' Password:' );
//Читаем ввод пользователя
Readln(PWD);
//Если пользователь ни чего не ввел, то выходим из программы
if PWD = '' then Exit;
//Если пользователь ввел значение не равное текущей дате на компе(весьма странно как то)
if PWD <> (' '+DateToStr(Date)+'.' ) then
//то сгенерировать исключение, после которого дальнейшее выполнение кода будет прекращено
raise Exception.Create('Bad password.' );
//Выводим в консоль 'Info:'
Writeln(' Info: ' );
//Расшифровываем key
S := sKey.key;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
//И выводим его в консль
Writeln(S);
//то же самое с uid
S := sKey.uid;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
Writeln(S);
//... и с info
S := sKey.info;
S := My.DecryptStr(Str2Hex(S));
CharToOem(Pointer(S), Pointer(S));
Writeln(Replace(S, ']', ']'#13#10' ' );
//... и с date
S := sKey.date;
Writeln(S);
//зафлуживаем консоль разной инфои
Writeln(' ' );
Writeln(' MaxComps: ', MaxComps);
Writeln('Expiration Date: ' , DateToStr(Now+nDays) );
Writeln('_____________________________________________________' );
Write('Generate key file? : ' );
//Если пользователь хочет создать новый файл, то..
Readln(PWD);
if not SameText(PWD, 'Y' ) then
begin
Writeln('Canceled.' );
Exit;
end;

// ... создаем его
Memory := TMemoryStream.Create();
try
WriteCert(Memory, sKey, MaxComps, Now-1, Now+nDays);
My.EncryptMemory(Memory);
Memory.Position := 0;
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps));
Base64Encode_stream(Memory);
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps)+'.base64' );
//Освобождаем память, занимаемую экземпляром класса TMemoryStream
FreeAndNil(Memory);
finally
//Как ни странно, но это еще одна попытка освободить память этого класса)) Ни чего страшного кончено, так как Memory уже будет равна nil
Memory.Free;
end;
System.Writeln('OK.' );
end.


Вроде разъяснил smile.gif

Автор: lesha 7.1.2004, 17:32
<Spawn>

Очень хорошо, что помог разобраться. Чему очень благодарен.
Вопрос в догонку именно по этой части
//Если пользователь хочет создать новый файл, то..
Readln(PWD);
if not SameText(PWD, 'Y' ) then
begin
Writeln('Canceled.' );
Exit;
end;

// ... создаем его
Memory := TMemoryStream.Create();
try
WriteCert(Memory, sKey, MaxComps, Now-1, Now+nDays);
My.EncryptMemory(Memory);
Memory.Position := 0;
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps));
Base64Encode_stream(Memory);
Memory.SaveToFile(SKeyFile+'.'+IntToStr(MaxComps)+'.base64' );

В следующих строчках:

Readln(PWD);
if not SameText(PWD, 'Y' ) then //если я ввожу другие значения то выход.
begin
Writeln('Canceled.' );
Exit;
end;

Видел такое, что в поле пароля вводили кучу всего и генерировался файл совсем другой. Если к примеру я при вводе пароля ставлю Y то получаю два файла
server.key.1
server.key.1.base64

а видел такое:
сгенерировались файлы
server.key.30
server.key.30.base64

Если это возможно то как?

Автор: lesha 7.1.2004, 17:32
Morpheus
Прочитай выше, что меня интересует, а то времени в обрез.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)