Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.02.2013, 17:02
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию Помогите с шифрованием

В нэте нашел две функции на вид отличные,но как оказалось это не совсем так
Код:
const
  StartKey = 359;//ключи на шифры
  MultKey = 61522;
  AddKey = 11785;
function TForm1.Encrypt(const InString: string; StartKey, MultKey,
  AddKey: Integer): string;
var
  I: Byte;     //Функция шифрования
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[i]) xor (StartKey shr 8));
    StartKey := (Byte(Result[i]) + StartKey) * MultKey + AddKey;
  end;
end;
function TForm1.Decrypt(const InString: string; StartKey, MultKey,
  AddKey: Integer): string;
var
  I: Byte;   //функция дешифрирования
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[i]) xor (StartKey shr 8));
    StartKey := (Byte(InString[i]) + StartKey) * MultKey + AddKey;
  end;
end;
При дешифрировании происходят ошибки,как правило кусок который как будто бы не дешифрировался или снос на новую строку лишний вылазиет. Возможно пользуюсь как то криво
Код:
procedure TForm1.Button5Click(Sender: TObject);
var
  i:integer; //Шифруем
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
  Memo1.Lines[i]:=Encrypt(Memo1.Lines[i], StartKey, MultKey, AddKey);
end;
end;
Ответить с цитированием
  #2  
Старый 16.02.2013, 21:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Попытка построчной шифровки не есть хорошо, возможно надо так:
Код:
procedure TForm1.Button5Click(Sender: TObject);
begin
  Memo1.Text:= Encrypt(Memo1.Text, StartKey, MultKey, AddKey);
end;
Естественно, расшифровывать тоже таким макаром.
Ответить с цитированием
  #3  
Старый 16.02.2013, 22:32
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Теоретически в результате шифровки может получиться ноль. А ноль в середине строки - это возможные баги. В делфе строки гибридные - с одной стороны, в начале строки стоит ее длина, с другой - она должна кончаться нулем. Так что во избежание возможных багов лучше шифрованное не интерпретировать как строку.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 16.02.2013, 22:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ещё в прошлом веке столкнулся с chr(#0) (обрезало текст, ведь это знак окончания строки), решалось так:
Код:
const zn1 = #60; { < }  zn2 = #62; { > }

 function EnCrypt(ds: string): string;
  var k,l,m: string; i,b,g: integer; t: char;
   function Lvs(ds: byte): string;
   begin
    case ds of Byte(zn1): Result:= zn1+zn2;Byte(zn2): Result:= zn2+zn1;
         0: if Random(2)=0 then Result:= zn1+zn1 else Result:= zn2+zn2;
           else Result:= Chr(ds);end;
   end;
  begin
   if length(ds)=0 then Exit; Randomize; k:=''; m:=''; b:=1;
   for i:=1 to RandomRange(5,16) do k:= k+Chr(RandomRange(1,256));
   for i:=1 to Length(ds) do  begin g:= Byte(ds[i])xor Byte(k[b]);
   l:=Lvs(g);t:=k[b];if i<=Length(k)then m:=m+t+l else m:=m+l;Inc(b);
   if b>Length(k) then b:= 1; end; l:= Chr(Length(k))+m;
   for  i:=1 to Length(l) do begin b:= Byte(l[i]) xor i;k:= Lvs(b);
   Result:= Result+k; end;
  end;

 function DeCrypt(ds: string): string;
  var k,c,l,n: string; i,b,m: integer; d: boolean;
   function Svl(ds: string; ts: integer): char;
   var t: byte;
   begin
    t:=Byte(ds[1]);
    if ds=zn1+zn2 then t:=Byte(zn1);if ds=zn2+zn1 then t:=Byte(zn2);
    if(ds=zn1+zn1) or (ds=zn2+zn2) then t:= 0;Result:=Chr(Byte(t xor ts));
   end;
  begin
   if length(ds)=0 then Exit; b:=1; i:=1; n:='';
   while i<=Length(ds) do begin c:= ds[i];
   if (ds[i]=zn1)or(ds[i]=zn2)then begin c:=ds[i]+ds[i+1]; Inc(i); end;
   Inc(i); n:= n+Svl(c,b); Inc(b); end; c:=''; k:=''; b:=1; i:=1; d:=false;
   m:=Byte(n[1]); Delete(n,1,1);
   while i<=Length(n)do begin if b<=m*2 then begin if d then begin l:=n[i];
   if (n[i]=zn1) or (n[i]=zn2) then begin l:= n[i]+n[i+1]; Inc(i); end;
   c:=c+l; Inc(b);d:=false; end else begin k:=k+n[i]; d:=true; Inc(b); end;
   end else begin l:= n[i]; if (n[i]=zn1) or (n[i]=zn2) then begin
   l:= n[i]+n[i+1]; Inc(i); end;  c:=c+l; end; Inc(i); end;
   if length(c)=0 then Exit;i:=1;b:=1; while i<=Length(c)do begin l:=c[i];
   if (c[i]=zn1) or (c[i]=zn2) then begin l:=c[i]+c[i+1]; Inc(i); end;
   Inc(i);Result:=Result+Svl(l,Byte(k[b]));Inc(b);if b>Length(k)then b:=1;
   end;
  end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
JunkieBeat (17.02.2013)
  #5  
Старый 16.02.2013, 22:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Мда... Больше похоже на java-код, пропущенный через очень мощный обфускатор, со специально построенной таблицей номеров строк, сдекомпилированный через JD... Нельзя так код писать.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 16.02.2013 в 22:54.
Ответить с цитированием
  #6  
Старый 16.02.2013, 23:01
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Bargest
Мда... Нельзя так код писать.
1999 год... С тех пор работает без переделок.
Ответить с цитированием
  #7  
Старый 17.02.2013, 10:27
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Код:
procedure TForm1.Button5Click(Sender: TObject);
begin
  Memo1.Text:= Encrypt(Memo1.Text, StartKey, MultKey, AddKey);
end;
Такая штука не катит вообще большая часть текста уходит в некуда)
а насчет твоего кода 99г то у меня выдает ошибку "[Error] Unit1.pas(68): Undeclared identifier: 'RandomRange'" мб он уже как то по другому пишется,или бблка нужна какая,я нуб просто))
Ответить с цитированием
  #8  
Старый 17.02.2013, 10:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от JunkieBeat
...у меня выдает ошибку "[Error] Unit1.pas(68): Undeclared identifier: 'RandomRange'" мб он уже как то по другому пишется,или бблка нужна какая,я нуб просто))
Нужно модуль Math в uses дописать.
Ответить с цитированием
  #9  
Старый 17.02.2013, 12:38
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Спасибо большое работает,но вот добавляет лишние символы в конец как это убрать? потому что мне надо шифровать файлы и сохранять их,потом уже открывать и дешифровать.
и еще
Код:
const zn1 = #60; { < }  zn2 = #62; { > }
это я так понял ключи,тут можно поставить любое значение да?
Ответить с цитированием
  #10  
Старый 17.02.2013, 12:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от JunkieBeat
...работает,но вот добавляет лишние символы в конец как это убрать?
Прилагаю примерчик использования - у меня работает как часы, без замечаний очень долгое время.
Цитата:
...и еще
Код:
const zn1 = #60; { < }  zn2 = #62; { > }
это я так понял ключи,тут можно поставить любое значение да?
Это не ключи, а указатели (маркеры) на #0, в юните XorCrypt.pas всё подробно об этом написано. Надеюсь, поможет.
Вложения
Тип файла: zip XORcrypt.zip (4.1 Кбайт, 6 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
JunkieBeat (17.02.2013)
  #11  
Старый 17.02.2013, 13:13
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Все Alegun спасибо огромное,выручил)Насчет того что добавляет левые символы,это уже я протупил с вызовом функции))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter