ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #5001  
Старый 23.11.2009, 01:13
Аватар для Sokolik
Sokolik
Banned
Регистрация: 05.03.2009
Сообщений: 71
Провел на форуме:
1130493

Репутация: 2
Отправить сообщение для Sokolik с помощью ICQ
По умолчанию

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 текст хранился в шифрованном, а не в открытом виде? Метод шифрования можно самый простой. Желательно показать примерчик. Заранее спасибо всем кто ответит.
 
Ответить с цитированием

  #5002  
Старый 23.11.2009, 01:49
Аватар для StealthMaster
StealthMaster
Познающий
Регистрация: 03.12.2008
Сообщений: 56
Провел на форуме:
140714

Репутация: 29
Отправить сообщение для StealthMaster с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #5003  
Старый 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-й).
 
Ответить с цитированием

  #5004  
Старый 23.11.2009, 03:26
Аватар для Sokolik
Sokolik
Banned
Регистрация: 05.03.2009
Сообщений: 71
Провел на форуме:
1130493

Репутация: 2
Отправить сообщение для Sokolik с помощью ICQ
По умолчанию

StealthMaster, спасибо! Пойду проверять как работает.
 
Ответить с цитированием

  #5005  
Старый 23.11.2009, 10:40
Аватар для Пуховой
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

Использую Delphi 7 & Indy 10.5.7 (rev. 3880+)

Письма в TIdMessage отдаются в unicode.

Вопрос - как конвертировать в ansi формат тело письма?
 
Ответить с цитированием

  #5006  
Старый 23.11.2009, 18:41
Аватар для KaZ@NoVa
KaZ@NoVa
Постоянный
Регистрация: 05.07.2008
Сообщений: 555
Провел на форуме:
3134311

Репутация: 1467


Отправить сообщение для KaZ@NoVa с помощью ICQ Отправить сообщение для KaZ@NoVa с помощью AIM Отправить сообщение для KaZ@NoVa с помощью Yahoo
По умолчанию

Цитата:
Сообщение от Пуховой  
Использую Delphi 7 & Indy 10.5.7 (rev. 3880+)

Письма в TIdMessage отдаются в unicode.

Вопрос - как конвертировать в ansi формат тело письма?
Стандартная кодировка анси то же самое что первые 127 символов юникода.
 
Ответить с цитированием

  #5007  
Старый 23.11.2009, 19:19
Аватар для Пуховой
Пуховой
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме:
1702086

Репутация: 89
По умолчанию

Проблема решена переходом на Delphi 2010.
 
Ответить с цитированием

  #5008  
Старый 24.11.2009, 04:21
Аватар для mobilka
mobilka
Познающий
Регистрация: 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
 
Ответить с цитированием

  #5009  
Старый 24.11.2009, 05:02
Аватар для МongBa†
МongBa†
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме:
255342

Репутация: 28
Отправить сообщение для МongBa† с помощью ICQ
По умолчанию

mobilka
заменить весь текст в мемо Memo1.Text:=s;
либо добавить строку Memo1.Lines.Add(s);
 
Ответить с цитированием

  #5010  
Старый 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.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Wi-Fi, BT] Задай вопрос - получи ответ! Alexsize Беспроводные технологии/WPAN/WLAN 2564 06.04.2026 23:31
[ *NIX ] Задай вопрос - получи ответ. Xszz *nix 1547 15.06.2010 15:41
[jQuery] - Задай вопрос, получи ответ Isis PHP, PERL, MySQL, JavaScript 62 25.12.2009 03:25
ЕсТь ВоПрос Guma Чаты 4 26.10.2005 21:48



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ