Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
end


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;

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]

Уже привлек
Угрожаешь :-)


 
Anatoly Podgoretsky ©   (2007-09-17 13:34) [41]


> Denis_ ©   (17.09.07 13:20) [38]

Символы #0 не мешают.
А если мешают, то должны мешать и некоторые другие непечатные символы.
По моему уже не раз сказали, не использовать результат шифрации в текстовых функциях и визуальных контролах. Если надо куда то передавать, за пределы строки, то надо преобразовать в одну из транспортных кодировок и это будет универсально для любого алгоритма шифрации.


 
Denis_ ©   (2007-09-17 13:43) [42]


> Уже привлек

Но не как модератора, ведь так?:)

> то надо преобразовать в одну из транспортных кодировок

C этого места поподробней бы...:)

А я подумал, что 0 xor x = 0. Поэтому он и "мешает". Это не так?


 
Инс ©   (2007-09-17 13:49) [43]


> C этого места поподробней бы...:)

Как опять???? Анатолий, повторим? Или может автор почитает обсуждение. :)


 
Инс ©   (2007-09-17 13:51) [44]

0 xor x = x, проверяется же элементарно :) Да и табличку истинности знать надо бы.


 
Anatoly Podgoretsky ©   (2007-09-17 13:53) [45]

> Denis_  (17.09.2007 13:43:42)  [42]

Base64, Hex


 
Denis_ ©   (2007-09-17 13:55) [46]


> в одну из транспортных кодировок

Да, я не знаю, что это такое. Так вы и не говорили про них.Просто упоминали.0 xor x = x,честно, не проверял. Думал, что равно "0".


 
Denis_ ©   (2007-09-17 13:56) [47]


> Base64, Hex

А как их использовать?


 
{RASkov} ©   (2007-09-17 13:57) [48]

> [47] Denis_ ©   (17.09.07 13:56)

См [39]


 
{RASkov} ©   (2007-09-17 13:58) [49]

Там не Base64, но Hex.


 
Denis_ ©   (2007-09-17 13:58) [50]

Попытался написать
var
   b : Base64;
   h : Hex;
:(
Как они используются?


 
Anatoly Podgoretsky ©   (2007-09-17 13:59) [51]

> Denis_  (17.09.2007 13:55:46)  [46]

http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.html&file_id=app-bits


 
Anatoly Podgoretsky ©   (2007-09-17 13:59) [52]

> Denis_  (17.09.2007 13:56:47)  [47]

Смотри IntToHex


 
Инс ©   (2007-09-17 13:59) [53]

BinToHex, хотя бы


 
Denis_ ©   (2007-09-17 14:00) [54]


> {RASkov} ©   (17.09.07 13:57) [48]

Но  там же результат тоже стринг!


 
Denis_ ©   (2007-09-17 14:01) [55]


> Anatoly Podgoretsky ©   (17.09.07 13:59) [51]


> Инс ©   (17.09.07 13:59) [53]
> BinToHex, хотя бы

Спасибо за это!


 
Denis_ ©   (2007-09-17 14:02) [56]

Особенно за http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.html&file_id=app-bits
Спасибо!


 
Anatoly Podgoretsky ©   (2007-09-17 14:03) [57]

> Инс  (17.09.2007 13:59:53)  [53]

Можно, для понимания посмотреть обе.


 
Инс ©   (2007-09-17 14:03) [58]


> Denis_ ©   (17.09.07 14:02) [56]

Такие вещи знать нужно, без этого ты не программист...


 
Инс ©   (2007-09-17 14:06) [59]


> Anatoly Podgoretsky ©   (17.09.07 14:03) [57]

:))) Вспомнилось...

<mad_enot> народ посоветуйте антивирус хороший
<PinDOS> каспер
<Jekel> nod32
<Distortion_Finger{Bumer}> аваст
<mad_enot> эээ
<mad_enot> так всётаки?
<Distortion_Finger{Bumer}> аваст
<Jekel> nod32
<PinDOS> каспер


 
Denis_ ©   (2007-09-17 14:08) [60]


> Можно, для понимания посмотреть обе.

Буду разбираться с информацией по Вашей ссылке.


 
{RASkov} ©   (2007-09-17 14:11) [61]

> [54] Denis_ ©   (17.09.07 14:00)
> Но  там же результат тоже стринг!

Но там нет "проблем" с #0 :)


 
Anatoly Podgoretsky ©   (2007-09-17 14:18) [62]

> {RASkov}  (17.09.2007 14:11:01)  [61]

Ну достаточно про #0 это же не единственная проблема. Смотреть глубже, системно.


 
Denis_ ©   (2007-09-17 14:45) [63]

вот тут обсуждение в асе.Как сказал Инс, может кому интересно будет.
Denis (04:21 PM) :
а что такое base64?(чувствуя себя полным идиотом)
Ins (04:21 PM) :
а погуглить?;)
Denis (04:21 PM) :
да, точно.
Denis (04:24 PM) :
то есть Base64 - тоже строка? Как представление числа в 64-ричной системе?
Ins (04:25 PM) :
не совсем. Это определенный алгоритм кодирования (не путать с шифрованием) двоичного буфера, с целью чтобы в результате получились только печатные символы, которые можно вывести в любой текстовый приемник (Edit, Memo)
Denis (04:26 PM) :
на выходе получим строку?
Ins (04:26 PM) :
ну да
Denis (04:27 PM) :
т.е. если засунуть туда к примеру #13, то получим какой-либо печатный символ?
Ins (04:27 PM) :
да, даже два, а точнее полтора:)
Denis (04:28 PM) :
Это ещё как? Результат меньше чем первоначальное выражение, да?
Ins (04:29 PM) :
наоборот, больше. Еще точнее в 1.33333 раза.
Ins (04:29 PM) :
смотри
Ins (04:29 PM) :
в символе - 8 бит
Denis (04:29 PM) :
ага.
Ins (04:30 PM) :
Base64 берет только 6 бит и переводит их в соотв. своей таблице символ. А остальные два бита переносятся на следующий символ шифртекста. В следующей итерации будет взято 2 бита первого символа и 4 бита второго. и т.д.
Denis (04:31 PM) :
и всё это толко дя того, чтобы выводить в мемо/едит/...?
Ins (04:31 PM) :
получается более компактная строка, но алгоритм сложнее
Ins (04:31 PM) :
ну да
Ins (04:31 PM) :
я писал в обсуждении [29] кажется, где это применяется
Denis (04:33 PM) :
ясно.А как реализовать? с помощью IntToHex и  BinToHex?
Ins (04:33 PM) :
с помощью них - никак. Зато можно ручками :) А можно поискать готовую реализацию
Denis (04:34 PM) :
Ну, я просто подумал, что вы там на форуме меня наталкивали на это.
Ins (04:34 PM) :
Это функции для перевода в HEX
Denis (04:35 PM) :
Это до меня дошло.
Ins (04:35 PM) :
так в чем проблема то?
Denis (04:35 PM) :
Я вот не знаю, как биты получать.
Ins (04:35 PM) :
Воооот, Анатолий ссылочку дал
Denis (04:36 PM) :
ну я так просмотрел по быстрому. ничего не читая. Сохранил на комп. Буду разбираться.Там есть про биты?
Ins (04:38 PM) :
есть. Можно наше обсуждение скопировать в форум, многим полезно будет.


 
{RASkov} ©   (2007-09-17 14:49) [64]

> Там есть про биты?

:)))
Там вся статья про них...:)


 
Denis_ ©   (2007-09-18 13:14) [65]


> {RASkov} ©   (17.09.07 14:49) [64]
> > Там есть про биты?
>
> :)))
> Там вся статья про них...:)

Начал читать. Анатолию ещё раз спааибо.


 
Denis_ ©   (2007-09-18 19:28) [66]


> Начал читать

И сразу появились вопросы:((( Например, как получить значение бита по номеру?
В разделе "Получение позиции бита или его значения" непонятно как-то написано, нечего конкретного. 1 shl N даёт 2^N , а что дальше делать?
Хочу сделать перевод в Base64 так
1) получить все биты  ,записать их в строку "11000010010001....."
2) из этой строки брать по 6 бит и ставить им в соответствие какой-либо печатный символ
3)вывести эту строку.

если есть замечания, прошу!


 
Zeqfreed ©   (2007-09-18 19:54) [67]

> Denis_ ©   (18.09.07 19:28) [66]

> 1) получить все биты  ,записать их в строку "11000010010001.
> ...."

Лучше так не делать, а делать сразу по-человечески. Для затравки дам такой код:

function getBits(n : Byte) : String;
begin
       Result := "";

       repeat
               if (n and $80 = $80) then              
                       Result := Result + "1"
               else
                       Result := Result + "0";

               n := n shl 1;
       until (n = 0);

       while (length(Result) < 8) do
               Result := Result + "0";
end;


В строчке if (n and $80 = $80) then мы проверяем, установлен ли старший бит.
В строчке n := n shl 1; сдвигаем все биты на позицию влево. Старший бит пропадает, а шестой становится на его место. Так можно получить значения всех битов по очереди.


 
Denis_ ©   (2007-09-18 20:12) [68]


> Zeqfreed ©   (18.09.07 19:54) [67]

Спасибо!
Я уж почти разобрался. А ещё : как лучше подставлять символы под 6 бит?
например
000001 соответствует "A" и т.п.?
И вообще, как сделать [66] по человечески?:).(т.е. как ещё улучшить мой алгоритм?)


 
Anatoly Podgoretsky ©   (2007-09-18 20:14) [69]

> Zeqfreed  (18.09.2007 19:54:07)  [67]

N and 1 or $30


 
Denis_ ©   (2007-09-18 20:17) [70]


> N and 1 or $30

А это что сделает? Анатолий, я просто не понял в Ваше й статье момент один
Получение позиции бита или его значения
1 shl N

В данном примере единица сдвигается влево на нужное количество разрядов, и в результате получаем двоичное значение, равное 2^N, где в установлен один единственный бит, соответствующий разряду числа. Этот прием может использоваться с переменной для расчета позиции во время выполнения или во время компиляции, во втором случае код генерироваться не будет, а компилятор просто рассчитает значение и подставит его в программу, не генерируя дополнительного кода. Это удобно для указания номера бита, не представляя его в виде десятичной или шестнадцатеричной константы. Но чаще бывает удобнее использовать именованные константы, поскольку они более информативны, примеры этого будут приведены в конце статьи.

как получить значение не написано...:) А я так надеялся на это:). Разьясните,а?


 
Denis_ ©   (2007-09-18 20:25) [71]


> Zeqfreed ©   (18.09.07 19:54) [67]

Кстати , что-то подобное Вашему коду я и имел в виду под
> 1) получить все биты  ,записать их в строку "11000010010001.
> ...."

:)))


 
Anatoly Podgoretsky ©   (2007-09-18 20:30) [72]

> Denis_  (18.09.2007 20:17:10)  [70]

Вместо кучи команд по преобразованию бита - одна единственная. Результат записывать в Result


 
Zeqfreed ©   (2007-09-18 20:31) [73]

> : как лучше подставлять символы под 6 бит?

Лучше обратиться к RFC (http://tools.ietf.org/html/rfc3548#section-3) и воспользоваться готовыми таблицами.

Алгоритм улучшить (по скоростным и морально-этическим соображениям) можно отказавшись от использования строковых буферов для обработки потока информации.


 
Anatoly Podgoretsky ©   (2007-09-18 20:33) [74]

> Denis_  (18.09.2007 20:17:10)  [70]

Как же не написано, для установки в позицию бита 2 (счет с нуля) делаем 1 shl 2
Результат проверь на бумажке, тогда будет понятно как это работает. Но вроде бы это в статье графически проилюстрировано, но лучше самому убедиться, просто полезнее прочувствовать это когда выполняешь на бумажке, тогда это останется в голове навечно.


 
Zeqfreed ©   (2007-09-18 20:36) [75]

> Anatoly Podgoretsky ©   (18.09.07 20:14) [69]

Если задача получить строковое представление данных, то это, несомненно, самый оптимальный вариант :)


 
Zeqfreed ©   (2007-09-18 20:38) [76]

> Denis_ ©   (18.09.07 20:25) [71]

Мой код демонстрирует лишь сам принцип. Как уже поправил Анатолий, есть более оптимальный вариант. А для Base64-кодирования получать строку из всех битов нет необходимости.


 
Anatoly Podgoretsky ©   (2007-09-18 20:42) [77]

> Zeqfreed  (18.09.2007 20:31:13)  [73]

Для получения Base64 лучше воспользоваться готовыми функциями из ICS или INDY


 
Anatoly Podgoretsky ©   (2007-09-18 20:44) [78]

> Zeqfreed  (18.09.2007 20:38:16)  [76]

Я показал не только более оптимальный вариант, такой цели особо не было, а использование логических операторов AND и OR - результатом будет или $30 или $31 - коды символов "0" и "1"


 
Zeqfreed ©   (2007-09-18 20:56) [79]

> Anatoly Podgoretsky ©   (18.09.07 20:44) [78]

Ну я-то понимаю что будет результатом, спасибо :)


 
Denis_ ©   (2007-09-21 17:54) [80]

Я сделал это!!! правда позавчера ещё, но учёба, учёба...Вот зашифровал свои данные. Если кто расшифрует, звоните, или в аську стучите.
mzaJtCiX21OQx0a6mXSIpIeR1YmBuj4E20JDF+KX1XaEn2i33XC8xAgDJesJiiCD2W7k1CKKmAIkgiN-rzejrDJLmCtT-i0D2e7DW8oIYUpEh4MAYPxToTN+rzXWbe60ZvU0li2QLGqA7mWGo+p6q1FLrz-4oTBXszyjrz0D2l4BFi386DFGtCt9qVp3tHB9rzy

всё в одну строку.Без пробелов.Все буквы - латинские. :D

Cпасибо Anatoly Podgoretsky, Инс, Zeqfreed, {RASkov}. Очень помогли.


 
Сергей М. ©   (2007-09-21 22:24) [81]


> Если кто расшифрует, звоните, или в аську стучите.


Ты просто не представляешь,  какую луну ты ты открыл и сколько поздравлений с восхищениями по поводу этого гениалього открытия ты получишь в ближайшее время.

Я даже боюсь предположить, что вся Вселенная ломанулась расшифровывать твой велосипед и звонить тебе, не говоря уже о стучать на тебя твоей "асе")


 
palva ©   (2007-09-21 22:37) [82]

> Если кто расшифрует, звоните, или в аську стучите.
Неужели с расшифровкой вам тоже надо помогать?


 
Германн ©   (2007-09-22 00:32) [83]


> Я сделал это!!!

Где-то у меня в свалке валяется pas-модуль, написанный ещё лет 20 назад. Предназначался для шифровки любого текстового документа так, что бы никто его не понял, но и никто бы не заподозрил, что это шифровка :-)
P.S. Написан был не мной.


 
Anatoly Podgoretsky ©   (2007-09-22 11:58) [84]

> Германн  (22.09.2007 00:32:23)  [83]

Наверно про стеганографию говоришь?
Если да, то это не шифровка.


 
Denis_ ©   (2007-09-22 13:56) [85]


> Где-то у меня в свалке валяется pas-модуль, написанный ещё
> лет 20 назад

Я ещё тогда не родился даже.



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.023 c
2-1189868932
Tonich
2007-09-15 19:08
2007.10.14
Сервис


6-1161083178
ycuk
2006-10-17 15:06
2007.10.14
POST HTTP/1.1 302 Found


15-1190042067
Pdkle
2007-09-17 19:14
2007.10.14
Объясните, пожалуйста, устное решение задачи №2


15-1189995840
Slider007
2007-09-17 06:24
2007.10.14
С днем рождения ! 17 сентября 2007 понедельник


15-1190004777
naumovmag
2007-09-17 08:52
2007.10.14
Работа с COM портами