Текущий архив: 2007.10.14;
Скачать: CL | DM;
Вниз
XOR алгоритм Найти похожие ветки
← →
Denis_ © (2007-09-16 15:56) [0]Несколько раз встречал здесь вопрос о таком методе шифрования, и стало интересно , как его реализовать.Как?
← →
{RASkov} © (2007-09-16 16:10) [1]A = A xor B
B - ключ.
:) - примитив.
← →
{RASkov} © (2007-09-16 16:11) [2]расшифровка так же
т.е.:
Шифруем А ключем B
begin
A:=127;
B:=14;
A:=A xor B;
ShowMessage(IntToStr(A));
end;
Расшифровываем зашифрованную А
begin
A:=A xor B;
ShowMessage(IntToStr(A));
end;
← →
Denis_ © (2007-09-16 17:04) [3]{RASkov} © (16.09.07 16:10) [1]
Спасибо!
А чтобы зашифровать текст, надо так делать?function XOR_Algoritm(s : String;b : Integer):String;
var
i,a : Integer;
begin
Result:="";
for i:=1 to length(s) do
Result:=Result+Chr(Ord(s[i]) xor b);
end;
Или нет?Я проверил, это работает, но вдруг есть моменты, при которых это работать не будет?
← →
OSokin © (2007-09-16 17:08) [4]Так, но лучше бы сделать не по числу, а по строке:
function XOR_Algoritm(s : String;b : String):String;
var
i,a : Integer;
begin
Result:="";
for i:=1 to length(s) do
Result:=Result+Chr(Ord(s[i]) xor Ord(b[i mod Length(b) + 1]));
end;
← →
Сергей М. © (2007-09-16 17:08) [5]
> Denis_ © (16.09.07 17:04) [3]
> при которых это работать не будет
Что такое "работать не будет" ?
← →
Denis_ © (2007-09-16 17:12) [6]
> Что такое "работать не будет" ?
"работать не будет" - это когда ф-ция выдаёт ошибку, либо строка потом не расшифровывается, либо ещё что-нибудь.
> OSokin © (16.09.07 17:08) [4]
Спасибо!
← →
Сергей М. © (2007-09-16 17:25) [7]
> Denis_ © (16.09.07 17:12) [6]
Вот по каждому из этих "либо" и задавай отдельный вопрос.
← →
Denis_ © (2007-09-16 17:30) [8]
> Вот по каждому из этих "либо" и задавай отдельный вопрос.
Я просто спросил, не может ли быть какой-нибудь фигни пр использовании того кода, который я написал.Давайте закроем тему про "либо".
------------------------------------
Появился ещё вопросик :
Что за шифрование, когда используется число, которое раскладывается на 2 простых множителя, и для расшифровки информации нужны эти множители?
← →
Сергей М. © (2007-09-16 17:34) [9]
> Я просто спросил, не может ли быть какой-нибудь фигни пр
> использовании того кода, который я написал
Эта фигня обязательно найдется
← →
Сергей М. © (2007-09-16 17:36) [10]Бо ты манипулируешь массивом символов как массивом байт.
При этом "фигня" тебе обеспечена)
← →
Denis_ © (2007-09-16 17:43) [11]Извините, Сергей, я не пойму чего-то. Конференция "Начинающим", а не "Мастерам". Я автор вопроса, и имею права задать вопрос, по которому есть сомнения. Если Вы не можете сказать ничего конкретного по сути вороста, то, пожалуйста, не надо писать неинформативных постов. Я говорю это, так как из трёх ваших постов нельзя выцедить ни байта полезной информации(Кроме [10]).Извините, если обидел.
← →
Инс © (2007-09-16 18:00) [12]
> Что за шифрование, когда используется число, которое раскладывается
> на 2 простых множителя, и для расшифровки информации нужны
> эти множители?
Это алгоритм RSA, почитай это:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1271
← →
Сергей М. © (2007-09-16 18:13) [13]
> по которому есть сомнения
Какие конкретно ?
Использование твентинейджерского термина "Какая-нибудь фигня" не оправдывает даже начинающего.
← →
Denis_ © (2007-09-16 18:23) [14]Инс, спасибо!
А Вам, Сергей не мешало бы подумать над [11].То, что Вы старше и опытнее, не даёт Вам права пудрить мне мозги.
← →
app © (2007-09-16 18:30) [15]> Denis_ (16.09.2007 18:23:14) [14]
А вы подеритесь
← →
{RASkov} © (2007-09-16 18:30) [16]> [3] Denis_ © (16.09.07 17:04)
> но вдруг есть моменты, при которых это работать не будет?
Есть такие, например когда ключ совпадает с кодом символа,
но это не проблема и работать при этом будет, только нужно это учитывать в некоторых случаях...
Вот глянь я тебе для примера накидал, нагляднее лучше поймешь, что я хотел сказать.object Form1: TForm1
Left = 192
Top = 114
Width = 428
Height = 131
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 236
Top = 8
Width = 6
Height = 13
Caption = "в"
end
object Edit1: TEdit
Left = 176
Top = 4
Width = 53
Height = 21
TabOrder = 0
Text = "226"
OnChange = Edit1Change
end
object Edit2: TEdit
Left = 4
Top = 32
Width = 121
Height = 21
TabOrder = 1
Text = "слово"
end
object Edit3: TEdit
Left = 144
Top = 32
Width = 121
Height = 21
TabOrder = 2
Text = "Edit3"
end
object Button2: TButton
Left = 236
Top = 64
Width = 85
Height = 25
Caption = "Расшифровать"
TabOrder = 3
OnClick = Button2Click
end
object Button1: TButton
Left = 92
Top = 64
Width = 89
Height = 25
Caption = "Зашифровать"
TabOrder = 4
OnClick = Button1Click
end
object Edit4: TEdit
Left = 284
Top = 32
Width = 125
Height = 21
TabOrder = 5
Text = "Edit4"
end
endunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
Button1: TButton;
Edit4: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
//Оставил для простоты примера.
function XOR_Algoritm(s : String;b : Integer):String;
var
i : Integer;
begin
Result:="";
for i:=1 to length(s) do
Result:=Result+Chr(Ord(s[i]) xor b);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text:=XOR_Algoritm(Edit2.Text, StrToIntDef(Edit1.Text, 0));
Edit4.Text:="";
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit4.Text:=XOR_Algoritm(Edit3.Text, StrToIntDef(Edit1.Text, 0));
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
Label1.Caption:=CHR(StrToInt(Edit1.Text));
except
Label1.Caption:="Error";
end;
end;
end.
Хотя возможно в статье по ссылке из [12] это сказано...
← →
Инс © (2007-09-16 18:33) [17]
> Хотя возможно в статье по ссылке из [12] это сказано...
В статье из [12] про алгоритм XOR не сказано ничего :) Бо как самостоятельный этот алгоритм практической пользы не имеет, разве что как часть какого-либо другого.
← →
Сергей М. © (2007-09-16 18:33) [18]
> Denis_
"Фигня", "Пудрить мозги" ..
Ты только сленгом владеешь ?)
Хорошо, легче ли тебе станет, если я скажу, что строка, зашифрованная по твоему алгоритму, перестает быть ожидаемой тобой строкой, ибо в ней после твоего шифрования потенциально присутствуют символ-терминатор ?
← →
{RASkov} © (2007-09-16 18:35) [19]Т.е. модуль pas замени на этот:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
Button1: TButton;
Edit4: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
function XOR_Algoritm(s : String;b : Integer):String;
var
i : Integer;
begin
Result:="";
for i:=1 to length(s) do
Result:=Result+Chr(Ord(s[i]) xor b);
end;
var S: String;
procedure TForm1.Button1Click(Sender: TObject);
begin
S:=XOR_Algoritm(Edit2.Text, StrToIntDef(Edit1.Text, 0));
Edit3.Text:=S;
Edit4.Text:="";
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit4.Text:=XOR_Algoritm(Edit3.Text, StrToIntDef(Edit1.Text, 0));
Caption:=XOR_Algoritm(S, StrToIntDef(Edit1.Text, 0));
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
Label1.Caption:=CHR(StrToInt(Edit1.Text));
except
Label1.Caption:="Error";
end;
end;
end.
Изменения выделены жирным....
так более понятнее будет, что же имелось ввиду про работу/неработу этого алгоритма.
← →
Anatoly Podgoretsky © (2007-09-16 18:40) [20]Почему тут вывод в строковые органы, после шифрации результат не является строкой.
← →
Инс © (2007-09-16 18:44) [21]
> [20] Anatoly Podgoretsky © (16.09.07 18:40)
Сейчас снова скажу про Hex или Base64 :) Ладно, баян, не скажу...
← →
Anatoly Podgoretsky © (2007-09-16 18:47) [22]> Инс (16.09.2007 18:44:21) [21]
Лучше говорить про голову, которая здесь не применялась.
← →
Инс © (2007-09-16 18:51) [23]
> [22] Anatoly Podgoretsky © (16.09.07 18:47)
Ну давайте поговорим :)
← →
Anatoly Podgoretsky © (2007-09-16 18:52) [24]> Инс (16.09.2007 18:51:23) [23]
Нет смысла, достаточно простого понимания, что такое строка, не путать с типом string и как работает XOR
← →
Инс © (2007-09-16 18:56) [25]
> [24] Anatoly Podgoretsky © (16.09.07 18:52)
Я понимаю, что после XOR строки уже не будет, но полученные двоичные данные можно перевести в строку, чтобы посмотреть, что же у нас в результате шифрования получилось.
← →
Anatoly Podgoretsky © (2007-09-16 19:07) [26]> Инс (16.09.2007 18:56:25) [25]
Зачем смотреть, смотреть не надо, это не для человеческих глаз.
← →
Sha © (2007-09-16 19:17) [27]> Инс © (16.09.07 18:56) [25]
> Я понимаю, что после XOR строки уже не будет
Ты имеешь полное право любой символ строки заменить на #0,
и строка при этом строкой останется.
Но такие строки имеют некоторые особенности. Например:
1.Ты должен учитывать что при преобразовании к PChar, этот замененный символ будет терминатором.
Т.е. данные не годятся для непосредственного отображения в контролах.
2.Для чтения данных с диска не стоит использовать ReadLn,
т.к. это будет уже не текстовый файл.
← →
Инс © (2007-09-16 19:32) [28]
> [27] Sha © (16.09.07 19:17)
Спасибо, я в курсе, просто мы тут под строкой понимаем не тип String, а некий буфер, содержащий только печатные символы.
← →
Инс © (2007-09-16 19:36) [29]
> Зачем смотреть, смотреть не надо, это не для человеческих
> глаз.
Иногда бывает что надо. В Shareware-программах, вам зачастую предлагают ввести в текстовое поле ключ, который как правило представляет собой результат шифрований, хэширования, или и того и другого одновременно. Вот для того, чтобы это было возможно, его часто преобразуют в Base64. За примером далеко ходить не надо - The Bat.
← →
Anatoly Podgoretsky © (2007-09-16 20:22) [30]> Инс (16.09.2007 19:36:29) [29]
Код который предлагают ввести не является результатом XOR, а некоторой транспортной упаковкой, часто по модулю 36, иногда и другие варианты.
← →
Инс © (2007-09-16 20:57) [31]
> [30] Anatoly Podgoretsky © (16.09.07 20:22)
Я написал в [29] результатом чего он как правило является. Дело не именно в XOR разумеется, а в том, что иногда результат преобразования строки (путем шифрования, например), после которой она строкой перестает быть, нужно также представить в текстовом виде. А для этого очень хорошо подойдет преобразование в hex или base64. Именно это я и пытаюсь сказать, с этим спорить будете? Код в [16] разумеется неверный, так как текстовый приемник, такой как TEdit, не покажет правильно результат шифрования. Но если такая задача возникнет, то это можно сделать.
← →
Anatoly Podgoretsky © (2007-09-16 21:01) [32]Нет не буду, зачем если ты потверждаешь мое утверждение, что в результате шифрования получается не строка, которую просто бессмысленно куда либо выводить без траспортной упаковки.
← →
{RASkov} © (2007-09-16 21:33) [33]> Код в [16] разумеется неверный, так как текстовый приемник,
> такой как TEdit не покажет правильно результат шифрования
Этот код как раз для этого и был написан...
Именно для показа чем грозит #0 в строке, так как для String это фиолетово, а PChar - чревато....
установка таких свойств как Text, Caption идет функциями API которые в свою очередь "понимают" только PChar
поэтому и происходит "обрезание"... в [19] есть поправочка на этот счет > Это автору вопроса.
← →
Инс © (2007-09-16 21:38) [34]
> установка таких свойств как Text, Caption идет функциями
> API которые в свою очередь "понимают" только PChar
Да и оконная функция класса EDIT и прочих подобных тоже.
← →
Anatoly Podgoretsky © (2007-09-16 21:39) [35]> {RASkov} (16.09.2007 21:33:33) [33]
А ты что надеешься увидеть и остальные непечатные символы, кроме #0
PChar дополнительно еще и испортит строки, и не только PChar.
← →
{RASkov} © (2007-09-16 21:43) [36]> [35] Anatoly Podgoretsky © (16.09.07 21:39)
> А ты что надеешься увидеть и остальные непечатные символы, кроме #0
Вижу.... какими-то квадратиками, черточками - но вижу.)
А вот после #0 - всё, пусто... :)
> PChar дополнительно еще и испортит строки, и не только PChar.
?
Что-то не понял - кто кого испортит.... (
← →
Denis_ © (2007-09-17 12:53) [37]
> {RASkov} © (16.09.07 18:35) [19]
Спасибо ещё раз.
Anatoly Podgoretsky, Инс - Спасибо за обсуждение.
Сергей М. С Вами я больше спорить не буду, а то это привлечёт внимание Анатолия не как участника обсуждения, а как модератора.
← →
Denis_ © (2007-09-17 13:20) [38]Для того, чтобы в строке небыло символов #0 сделал так
function XOR_Algoritm(s,Key : String) : String;
var
i : Integer;
c : Char;
begin
Result:="";
for i:=1 to Length(s) do
begin
c:=Chr(Ord(s[i]) xor ord(Key[i mod Length(Key)+1]));
if c <> #0 then
Result:=Result+c
else
Result:=Result+s[i];
end;
end;
← →
{RASkov} © (2007-09-17 13:24) [39]> [38] Denis_ © (17.09.07 13:20)
function XorString(const Key, Src: ShortString): ShortString;
var
I: Integer;
begin
Result := Src;
if Length(Key) > 0 then
for I := 1 to Length(Src) do
Result[I] := Chr(Byte(Key[1 + ((I - 1) mod Length(Key))]) xor Ord(Src[I]));
end;
function XorEncode(const Key, Source: string): string;
var
I: Integer;
C: Byte;
begin
Result := "";
for I := 1 to Length(Source) do begin
if Length(Key) > 0 then
C := Byte(Key[1 + ((I - 1) mod Length(Key))]) xor Byte(Source[I])
else
C := Byte(Source[I]);
Result := Result + AnsiLowerCase(IntToHex(C, 2));
end;
end;
function XorDecode(const Key, Source: string): string;
var
I: Integer;
C: Char;
begin
Result := "";
for I := 0 to Length(Source) div 2 - 1 do begin
C := Chr(StrToIntDef("$" + Copy(Source, (I * 2) + 1, 2), Ord(" ")));
if Length(Key) > 0 then
C := Chr(Byte(Key[1 + (I mod Length(Key))]) xor Byte(C));
Result := Result + C;
end;
end;
© RxStrUtils.pas
← →
Anatoly Podgoretsky © (2007-09-17 13:24) [40]> Denis_ (17.09.2007 12:53:37) [37]
Уже привлек
Угрожаешь :-)
Страницы: 1 2 3 вся ветка
Текущий архив: 2007.10.14;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.041 c