|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Помогите с шифрованием
В нэте нашел две функции на вид отличные,но как оказалось это не совсем так
Код:
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
|
||||
|
||||
Попытка построчной шифровки не есть хорошо, возможно надо так:
Код:
procedure TForm1.Button5Click(Sender: TObject); begin Memo1.Text:= Encrypt(Memo1.Text, StartKey, MultKey, AddKey); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Теоретически в результате шифровки может получиться ноль. А ноль в середине строки - это возможные баги. В делфе строки гибридные - с одной стороны, в начале строки стоит ее длина, с другой - она должна кончаться нулем. Так что во избежание возможных багов лучше шифрованное не интерпретировать как строку.
jmp $ ; Happy End! The Cake Is A Lie. |
#4
|
||||
|
||||
Ещё в прошлом веке столкнулся с 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
|
||||
|
||||
Мда... Больше похоже на java-код, пропущенный через очень мощный обфускатор, со специально построенной таблицей номеров строк, сдекомпилированный через JD... Нельзя так код писать.
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 16.02.2013 в 22:54. |
#6
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
||||
|
||||
Цитата:
а насчет твоего кода 99г то у меня выдает ошибку "[Error] Unit1.pas(68): Undeclared identifier: 'RandomRange'" мб он уже как то по другому пишется,или бблка нужна какая,я нуб просто)) |
#8
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
||||
|
||||
Спасибо большое работает,но вот добавляет лишние символы в конец как это убрать? потому что мне надо шифровать файлы и сохранять их,потом уже открывать и дешифровать.
и еще Код:
const zn1 = #60; { < } zn2 = #62; { > } |
#10
|
||||
|
||||
Цитата:
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
JunkieBeat (17.02.2013)
|
#11
|
||||
|
||||
Все Alegun спасибо огромное,выручил)Насчет того что добавляет левые символы,это уже я протупил с вызовом функции))
|