![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XOR алгоритм
Denis_ © (2007-09-16 15:56:00)Несколько раз встречал здесь вопрос о таком методе шифрования, и стало интересно , как его реализовать.Как?
Anatoly Podgoretsky (2007-09-17 13:53:00) [41]> Denis_ (17.09.2007 13:43:42) [42]
Base64, Hex
Инс (2007-09-17 13:51:00) [42]0 xor x = x, проверяется же элементарно :) Да и табличку истинности знать надо бы.
Инс (2007-09-17 13:49:00) [43]
> C этого места поподробней бы...:)
Как опять???? Анатолий, повторим? Или может автор почитает обсуждение. :)
Denis_ (2007-09-17 13:43:00) [44]
> Уже привлек
Но не как модератора, ведь так?:)
> то надо преобразовать в одну из транспортных кодировок
C этого места поподробней бы...:)
А я подумал, что 0 xor x = 0. Поэтому он и "мешает". Это не так?
Anatoly Podgoretsky (2007-09-17 13:34:00) [45]
> Denis_ © (17.09.07 13:20) [38]
Символы #0 не мешают.
А если мешают, то должны мешать и некоторые другие непечатные символы.
По моему уже не раз сказали, не использовать результат шифрации в текстовых функциях и визуальных контролах. Если надо куда то передавать, за пределы строки, то надо преобразовать в одну из транспортных кодировок и это будет универсально для любого алгоритма шифрации.
Anatoly Podgoretsky (2007-09-17 13:24:00) [46]> Denis_ (17.09.2007 12:53:37) [37]
Уже привлек
Угрожаешь :-)
{RASkov} (2007-09-17 13:24:00) [47]> [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
Denis_ (2007-09-17 13:20:00) [48]Для того, чтобы в строке небыло символов #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;
Denis_ (2007-09-17 12:53:00) [49]
> {RASkov} © (16.09.07 18:35) [19]
Спасибо ещё раз.
Anatoly Podgoretsky, Инс - Спасибо за обсуждение.
Сергей М. С Вами я больше спорить не буду, а то это привлечёт внимание Анатолия не как участника обсуждения, а как модератора.
{RASkov} (2007-09-16 21:43:00) [50]> [35] Anatoly Podgoretsky © (16.09.07 21:39)
> А ты что надеешься увидеть и остальные непечатные символы, кроме #0
Вижу.... какими-то квадратиками, черточками - но вижу.)
А вот после #0 - всё, пусто... :)
> PChar дополнительно еще и испортит строки, и не только PChar.
?
Что-то не понял - кто кого испортит.... (
Anatoly Podgoretsky (2007-09-16 21:39:00) [51]> {RASkov} (16.09.2007 21:33:33) [33]
А ты что надеешься увидеть и остальные непечатные символы, кроме #0
PChar дополнительно еще и испортит строки, и не только PChar.
Инс (2007-09-16 21:38:00) [52]
> установка таких свойств как Text, Caption идет функциями
> API которые в свою очередь "понимают" только PChar
Да и оконная функция класса EDIT и прочих подобных тоже.
{RASkov} (2007-09-16 21:33:00) [53]> Код в [16] разумеется неверный, так как текстовый приемник,
> такой как TEdit не покажет правильно результат шифрования
Этот код как раз для этого и был написан...
Именно для показа чем грозит #0 в строке, так как для String это фиолетово, а PChar - чревато....
установка таких свойств как Text, Caption идет функциями API которые в свою очередь "понимают" только PChar
поэтому и происходит "обрезание"... в [19] есть поправочка на этот счет > Это автору вопроса.
Anatoly Podgoretsky (2007-09-16 21:01:00) [54]Нет не буду, зачем если ты потверждаешь мое утверждение, что в результате шифрования получается не строка, которую просто бессмысленно куда либо выводить без траспортной упаковки.
Инс (2007-09-16 20:57:00) [55]
> [30] Anatoly Podgoretsky © (16.09.07 20:22)
Я написал в [29] результатом чего он как правило является. Дело не именно в XOR разумеется, а в том, что иногда результат преобразования строки (путем шифрования, например), после которой она строкой перестает быть, нужно также представить в текстовом виде. А для этого очень хорошо подойдет преобразование в hex или base64. Именно это я и пытаюсь сказать, с этим спорить будете? Код в [16] разумеется неверный, так как текстовый приемник, такой как TEdit, не покажет правильно результат шифрования. Но если такая задача возникнет, то это можно сделать.
Anatoly Podgoretsky (2007-09-16 20:22:00) [56]> Инс (16.09.2007 19:36:29) [29]
Код который предлагают ввести не является результатом XOR, а некоторой транспортной упаковкой, часто по модулю 36, иногда и другие варианты.
Инс (2007-09-16 19:36:00) [57]
> Зачем смотреть, смотреть не надо, это не для человеческих
> глаз.
Иногда бывает что надо. В Shareware-программах, вам зачастую предлагают ввести в текстовое поле ключ, который как правило представляет собой результат шифрований, хэширования, или и того и другого одновременно. Вот для того, чтобы это было возможно, его часто преобразуют в Base64. За примером далеко ходить не надо - The Bat.
Инс (2007-09-16 19:32:00) [58]
> [27] Sha © (16.09.07 19:17)
Спасибо, я в курсе, просто мы тут под строкой понимаем не тип String, а некий буфер, содержащий только печатные символы.
Sha (2007-09-16 19:17:00) [59]> Инс © (16.09.07 18:56) [25]
> Я понимаю, что после XOR строки уже не будет
Ты имеешь полное право любой символ строки заменить на #0,
и строка при этом строкой останется.
Но такие строки имеют некоторые особенности. Например:
1.Ты должен учитывать что при преобразовании к PChar, этот замененный символ будет терминатором.
Т.е. данные не годятся для непосредственного отображения в контролах.
2.Для чтения данных с диска не стоит использовать ReadLn,
т.к. это будет уже не текстовый файл.
Anatoly Podgoretsky (2007-09-16 19:07:00) [60]> Инс (16.09.2007 18:56:25) [25]
Зачем смотреть, смотреть не надо, это не для человеческих глаз.