Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

23.11.2009, 01:13
|
|
Banned
Регистрация: 05.03.2009
Сообщений: 71
Провел на форуме: 1130493
Репутация:
2
|
|
procedure TForm1.ReadParams;
Var IniFile: TIniFile;
begin
IniFile:=TIniFile.Create('abc.ini');
xppanel1.Caption:=IniFile.ReadString('FORM1','Pane l',xppanel1.Caption);
IniFile.Free;
end;
procedure TForm1.WriteParams;
Var IniFile: TIniFile;
begin
IniFile:=TIniFile.Create('abc.ini');
IniFile.WriteString('FORM1','Panel',xppanel1.Capti on);
IniFile.Free;
end;
Как сделать, чтобы в abc.ini текст хранился в шифрованном, а не в открытом виде? Метод шифрования можно самый простой. Желательно показать примерчик. Заранее спасибо всем кто ответит.
|
|
|

23.11.2009, 01:49
|
|
Познающий
Регистрация: 03.12.2008
Сообщений: 56
Провел на форуме: 140714
Репутация:
29
|
|
Сообщение от Sokolik
procedure TForm1.ReadParams;
Var IniFile: TIniFile;
begin
IniFile:=TIniFile.Create('abc.ini');
xppanel1.Caption:=IniFile.ReadString('FORM1','Pane l',xppanel1.Caption);
IniFile.Free;
end;
procedure TForm1.WriteParams;
Var IniFile: TIniFile;
begin
IniFile:=TIniFile.Create('abc.ini');
IniFile.WriteString('FORM1','Panel',xppanel1.Capti on);
IniFile.Free;
end;
Как сделать, чтобы в abc.ini текст хранился в шифрованном, а не в открытом виде? Метод шифрования можно самый простой. Желательно показать примерчик. Заранее спасибо всем кто ответит.
Вам изначально необходимо выбрать способ шифрования. В общем случае чтение и запись будут реализованы так:
Код:
procedure TForm1.WriteParams;
Var
IniFile: TIniFile;
OpenText, CloseText: string;
begin
... выполнение неободимых действий
// в OpenText хранится текст для записи
// Encrypt - функция шифрования, которой передаются следующие параметры: текст и ключ для шифрования
CloseText := EnCrypt(OpenText, Key);
IniFile:=TIniFile.Create('abc.ini');
IniFile.WriteString('Section','PName', CloseText);
IniFile.Free;
end;
procedure TForm1.ReadParams;
Var
IniFile: TIniFile;
OpenText, CloseText: string;
begin
// Decrypt - функция расшифрования, которой передаются следующие параметры: текст и ключ для шифрования
IniFile:=TIniFile.Create('abc.ini');
CloseText := IniFile.ReadString('Section','PName', '');
IniFile.Free;
OpenText := Decrypt(CloseText, key);
end;
Если нужен простейший пример шифрования, то вот класс описывающий шифрование Виженера:
Код:
unit VigenereCrypt;
interface
uses Classes;
type
TVigenereCrypt = class
Alphabet: string; // алфавит
Mask: TStrings; // маска шифрования
TabulaRecta: TStrings;
constructor Create;
procedure CreateMask;
procedure Encrypt;
procedure Decrypt;
end;
implementation
constructor TVigenereCrypt.Create;
var
i, j: byte;
tmp: string;
tmpint: byte;
begin
Alphabet := 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789$!.,?;*(){}+=:/[]@\^"';
// создадим строковые списки
InputText := TStringList.Create;
OutputText := TStringList.Create;
Mask := TStringList.Create;
TabulaRecta := TStringList.Create;
for i := 0 to 63 do
begin
tmp := Alphabet;
for j := 1 to 64 do
begin
tmpint := (j+i) mod 64;
if (tmpint = 0) then
tmp[j] := Alphabet[64]
else
tmp[j] := Alphabet[tmpint];
end;
TabulaRecta.Append(tmp);
end;
end;
procedure TVigenereCrypt.CreateMask;
var
// длина ключа и текущий индекс символа в ключе
KeyLength: integer;
index: integer;
// счетчики циклов
i, j: integer;
// временные переменные
tmp: string;
begin
KeyLength := Length(key);
index := 1;
for i := 0 to InputText.Count -1 do
begin
SetLength(tmp, length(InputText[i]));
for j := 1 to length(InputText[i]) do
begin
tmp[j] := key[index];
inc(index);
if (index = KeyLength +1) then
index := 1;
end;
Mask.Append(tmp);
end;
end;
procedure TVigenereCrypt.Encrypt;
var
i,j : integer;
tmp : string;
index, tmpint: integer;
begin
for i := 0 to InputText.Count - 1 do
begin
// установим длину временной строки
SetLength(tmp,Length(InputText[i]));
// посимвольно обрабатываем строку
for j := 1 to Length(InputText[i]) do
begin
tmpint := POS(InputText[i][j], Alphabet);
// если символ не из алфавита, то пропустим его
if (tmpint = 0) then
tmp[j] := InputText[i][j]
// иначе обрабатываем
else
begin
index := POS(Mask[i][j], Alphabet)-1;
tmp[j] := TabulaRecta[index][tmpint];
end; // else
end; // for j
// добавим строку к обработанному тексту
OutputText.Append(tmp);
end; // for i
end;
procedure TVigenereCrypt.Decrypt;
var
i,j : integer;
tmp : string;
index, tmpint: integer;
begin
for i := 0 to InputText.Count - 1 do
begin
// установим длину временной строки
SetLength(tmp,Length(InputText[i]));
// посимвольно обрабатываем строку
for j := 1 to Length(InputText[i]) do
begin
index := POS(Mask[i][j], Alphabet)-1;
// если символ не из алфавита, то пропустим его
if (POS(InputText[i][j], Alphabet) = 0)
then tmp[j] := InputText[i][j]
// иначе обрабатываем его
else
begin
tmpint := POS(InputText[i][j], TabulaRecta[index]);
tmp[j] := Alphabet[tmpint];
end; // else
end; // for j
// добавим строку к обработанному тексту
OutputText.Append(tmp);
end; // for i
end;
end.
При использовании процедуры Encrypt этого класса будут зашифрованы все строчные символы кирилицы, цифры и некоторые символы. Всегда можешь изменить алфавит и немного доработать класс.
Использовать тогда шифрование нужно так:
Код:
procedure TForm1.WriteParams;
Var
IniFile: TIniFile;
CloseText: string;
Crypt: TVigenereCrypt;
begin
Crypt:= TVigenereCrypt.Create;
Crypt.key := 'ялюблюантичат';
Crypt.InputText.Clear;
Crypt.InputText.Append(xppanel1.Caption);
Crypt.CreateMask;
Crypt.Encrypt;
CloseText := Crypt.OutputText[0];
IniFile:=TIniFile.Create('abc.ini');
IniFile.WriteString('FORM1','Panel', CloseText);
IniFile.Free;
end;
procedure TForm1.ReadParams;
Var
IniFile: TIniFile;
tmpstr: string;
Crypt: TVigenereCrypt;
begin
Crypt:= TVigenereCrypt.Create;
Crypt.key := 'ялюблюантичат';
IniFile:=TIniFile.Create('abc.ini');
tmpstr:= IniFile.ReadString('FORM1','Panel', 'lalala');
IniFile.Free;
Crept.InputText.clear;
Crypt.InputText.Append(tmpstr);
Crypt.CreateMask;
Crypt.Decrypt;
xppanel1.Caption:= Crypt.OutputText[0];
end;
P.S. все кроме класса писал прямо здесь, мог где то ошибиться.
Последний раз редактировалось StealthMaster; 23.11.2009 в 02:16..
|
|
|

23.11.2009, 02:20
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
KaZ@NoVa, спасибо вам!
Еще немного поковырялся с проблемой. Выяснилось, что до 30-ти потоков включительно, память программа не кушает (11-12 мб, 30 мин. тест). При запуске более 50-ти потоков - начинается веселье (80-100 мб на 8-10 мин. работы, до 500 мб на 30-й).
|
|
|

23.11.2009, 03:26
|
|
Banned
Регистрация: 05.03.2009
Сообщений: 71
Провел на форуме: 1130493
Репутация:
2
|
|
StealthMaster, спасибо! Пойду проверять как работает.
|
|
|

23.11.2009, 10:40
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
Использую Delphi 7 & Indy 10.5.7 (rev. 3880+)
Письма в TIdMessage отдаются в unicode.
Вопрос - как конвертировать в ansi формат тело письма?
|
|
|

23.11.2009, 18:41
|
|
Постоянный
Регистрация: 05.07.2008
Сообщений: 555
Провел на форуме: 3134311
Репутация:
1467
|
|
Сообщение от Пуховой
Использую Delphi 7 & Indy 10.5.7 (rev. 3880+)
Письма в TIdMessage отдаются в unicode.
Вопрос - как конвертировать в ansi формат тело письма?
Стандартная кодировка анси то же самое что первые 127 символов юникода.
|
|
|

23.11.2009, 19:19
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
Проблема решена переходом на Delphi 2010.
|
|
|

24.11.2009, 04:21
|
|
Познающий
Регистрация: 13.10.2009
Сообщений: 63
Провел на форуме: 373897
Репутация:
13
|
|
помогите вывести данные в memo
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s,temp: string;
begin
if pos('00',edit1.text) <> 0 then
for i:=1 to length(edit1.text) div 2 do temp:=temp+copy(edit1.text,i*4-3,2)
else temp:=edit1.text;
for i:=1 to length(temp) div 2 do s:=s+chr(hextoint(copy(temp,i*2-1,2)));
caption:=s;
end;
как видно сейчас выводятся в caption формы а надо в memo1
|
|
|

24.11.2009, 05:02
|
|
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме: 255342
Репутация:
28
|
|
mobilka
заменить весь текст в мемо Memo1.Text:=s;
либо добавить строку Memo1.Lines.Add(s);
|
|
|

24.11.2009, 12:04
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
Использую Delphi 2010 & Indy 10.5.7 (rev. 3880+)
При отправке POST запроса, он автоматически кодируется в unicode (TIdURI.ParamsEncode не предлагать). Соответственно, ansi - строки отправить не получается. Ищу универсальное решение, пока что сделал функцию:
Код:
function httppost (http : tidhttp; adr : string; post : tstringlist) : string;
function urlencode (str : ansistring) : ansistring;
function chartohex (ch : ansichar) : integer;
asm
and eax, 0FFh
mov ah, al
shr al, 4
and ah, 00fh
cmp al, 00ah
jl @@10
sub al, 00ah
add al, 041h
jmp @@20
@@10:
add al, 030h
@@20:
cmp ah, 00ah
jl @@30
sub ah, 00ah
add ah, 041h
jmp @@40
@@30:
add ah, 030h
@@40:
shl eax, 8
mov al, '%'
end;
var
i, len : integer;
ch : ansichar;
n : integer;
p : pansichar;
begin
Result := '';
len := length (str);
p := pansichar (@N);
for i := 1 to len do
begin
Ch := Str[i];
if ch in ['0'..'9', 'A'..'Z', 'a'..'z', '_', '='] then Result := Result + ch else
begin
if ch = ' ' then Result := Result + '+' else
begin
n := chartohex (ch);
Result := Result + p;
end;
end;
end;
end;
var
str : tstringstream;
i : integer;
m : ansistring;
isansi : boolean;
begin
isansi := false;
str := tstringstream.create('');
m := post.gettext;
for i := 1 to length (m) do if m[i] in ['а'..'я', 'А'..'Я', 'ё', 'Ё'] then isansi := true;
if isansi = true then
begin
http.httpoptions := [];
for i := 0 to post.count - 1 do post.strings[i] := urlencode (post.strings[i]);
try http.post (adr, post, str); except end;
http.httpoptions := [hoforceencodeparams];
end else
begin
try http.post (adr, post, str); except end;
end;
Result := str.datastring;
str.free;
end;
Но, как видите, громоздко и не эстетично. Напомню, речь о Delphi 2010, где string по-умолчанию - unicodestring.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|