Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вызов процедур из модуля, delphi [D7, XP]


Student00 ©   (2007-11-23 16:26:00) 

Ребята, помогите пожалуйста. Срочно нужна ваша помощь!!!

Есть модуль:

unit ucrypt;

interface
type
 TEAKey = array[0..3] of cardinal;

//Use 64-bit aligned data size (8,16...) or else some data will be left unencrypted!
procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);

implementation
type
 TEAData = array[0..1] of cardinal;
 PTEAKey = ^TEAKey;
 PTEAData = ^TEAData;

procedure TEA_Cipher(v: PTEAData; var w: PTEAData; k: PTEAKey);
var
 y, z, sum, delta, n: Cardinal;
begin
 y := (v)[0];
 z := (v)[1];
 sum := 0;
 delta := $9E3779B9;
 n := 32;

 while (n > 0) do
 begin
   inc(y, (z shl 4 xor z shr 5) + z xor sum + (k)[sum and 3]);
   inc(sum, delta);
   inc(z, (y shl 4 xor y shr 5) + y xor sum + (k)[sum shr 11 and 3]);
   dec(n);
 end;

 (w)[0] := y;
 (w)[1] := z;
end;

procedure TEA_DeCipher(v: PTEAData; var w: PTEAData; k: PTEAKey);
var
 y, z, sum, delta, n: Cardinal;
begin

 y := v[0];
 z := v[1];
 sum := $0C6EF3720;
 delta := $9E3779B9;
 n := 32;

 while (n > 0) do
 begin
   dec(z, (y shl 4 xor y shr 5) + y xor sum + k[sum shr 11 and 3]);
   dec(sum, delta);
   dec(y, (z shl 4 xor z shr 5) + z xor sum + k[sum and 3]);
   dec(n);
 end;

 w[0] := y;
 w[1] := z;

end;

procedure TEA_EnDec(encode: boolean; Input, Output: pointer; size: integer; key:
 TEAKey);
var
 DataIn, DataOut: TEAData;
 DOut: PTEAData;
 i, sz: integer;
begin
 DOut := @DataOut;
 sz := (size shr 3) shl 3;
 i := 0;
 repeat
   DataIn[0] := Cardinal((pointer(Cardinal(Input) + Cardinal(i)))^);
   DataIn[1] := Cardinal((pointer(Cardinal(Input) + Cardinal(i + 4)))^);
   if encode then
     TEA_Cipher(@DataIn, DOut, @key)
   else
     TEA_DECipher(@DataIn, DOut, @key);
   Cardinal(pointer(Cardinal(Output) + Cardinal(i))^) := DataOut[0];
   Cardinal(pointer(Cardinal(Output) + Cardinal(i + 4))^) := DataOut[1];
   inc(i, 8);
 until i >= sz;

end;

procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
begin
 TEA_EnDec(true, Input, Output, size, key);
end;

procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);
begin
 TEA_EnDec(false, Input, Output, size, key);
end;

end.


Подключаю его в приложение посредством uses ... ucrypt;

Теперь возникла необходимость вызвать процедуры.
Алгоритм:
1)Вводим текст в
Edit1.Text

2)Кликаем по:
procedure TForm1.Button1Click(Sender: TObject);
begin
???
end;


Должна выполниться процедура из модуля:
procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);

3) Результат выводим в
Edit2.Text

Была предпринята попытка сделать следующие:
procedure TForm1.Button1Click(Sender: TObject);
begin
TEA_Encode(pchar(edit1.Text), pchar(edit2.Text), inttostr(edit1.SelLength), TEAKey(0));
end;


На что программа ругается:

[Error] okno.pas(31): Incompatible types: 'Integer' and 'String'
[Error] okno.pas(31): Invalid typecast
[Fatal Error] ES.dpr(6): Could not compile used unit 'okno.pas'


???


Dennis I. Komarov   (2007-11-27 13:03:00) [1]

> [10] Student00 ©   (27.11.07 12:55)

Вы бы с еорией немного подружились. А то сдать (чего там) без всякого представления о криптографии да еще на скомунизденном коде о котором вы не имеете ни малейшего представления, впрочем как и о иачальных знаниях языка на котором написан этот код - ИМХО не реально, ну на крайняк "удвл." поставить если пожалеет.


DiamondShark   (2007-11-27 12:59:00) [2]

Осень. Мётлы поднялись в цене.


Student00   (2007-11-27 12:55:00) [3]

А как же первы две процедуры? Разве не они выполняют шифровку/дешиифровку?


> sz := (size shr 3) shl 3;
> забавный способ очистки младших битов


Тоесть очистка младших битов?
А для чего она нужна?
))


Slym   (2007-11-27 06:33:00) [4]

Student00 ©   (26.11.07 20:04) [7]
sz := (size shr 3) shl 3;

забавный способ очистки младших битов
и вообще код в топку...
unit ucrypt;

interface
type
TEAKey = array[0..3] of cardinal;

//Use 64-bit aligned data size (8,16...) or else some data will be left unencrypted!
procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);

implementation
type
TEAData = array[0..1] of cardinal;
PTEAKey = ^TEAKey;
PTEAData = ^TEAData;

procedure TEA_Cipher(v,w: PTEAData; k: PTEAKey);
var
y, z, sum, delta, n: Cardinal;
begin
y := (v)[0];
z := (v)[1];
sum := 0;
delta := $9E3779B9;
n := 32;

repeat
  inc(y, (z shl 4 xor z shr 5) + z xor sum + (k)[sum and 3]);
  inc(sum, delta);
  inc(z, (y shl 4 xor y shr 5) + y xor sum + (k)[sum shr 11 and 3]);
  dec(n);
until n=0;

w[0] := y;
w[1] := z;
end;

procedure TEA_DeCipher(v,w: PTEAData; k: PTEAKey);
var
y, z, sum, delta, n: Cardinal;
begin

y := v[0];
z := v[1];
sum := $0C6EF3720;
delta := $9E3779B9;
n := 32;

repeat
  dec(z, (y shl 4 xor y shr 5) + y xor sum + k[sum shr 11 and 3]);
  dec(sum, delta);
  dec(y, (z shl 4 xor z shr 5) + z xor sum + k[sum and 3]);
  dec(n);
until n=0;

w[0] := y;
w[1] := z;
end;

procedure TEA_EnDec(encode:boolean;Input,Output: PTEAData; size:integer; const key:TEAKey);
var sz: integer;
begin
sz:=size div sizeof(TEAData);
repeat
  if encode then
    TEA_Cipher(Input, Output, @key)
  else
    TEA_DECipher(Input, Output, @key);
  inc(Input);
  inc(Output);
  dec(sz);
until sz=0;
end;

procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
begin
TEA_EnDec(true, Input, Output, size, key);
end;

procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);
begin
TEA_EnDec(false, Input, Output, size, key);
end;

end.


Slym   (2007-11-27 05:57:00) [5]

Student00 ©   (26.11.07 20:04) [7]
Мол чего она делает? Для чего это нужно, для чего то?

Не поверишь! Шифрует/дешифрует...
Это блочный алгоритм - размер блока 64бит
А эта процедура шифрует/дешифрует блоки произвольнойдлинны, разрезая входной блок на блоки по 64бита


Student00   (2007-11-26 20:04:00) [6]

Сегодня показывал этот кода препод привязался к процедуре:
procedure TEA_EnDec(encode: boolean; Input, Output: pointer; size: integer; key:
 TEAKey);
var
 DataIn, DataOut: TEAData;
 DOut: PTEAData;
 i, sz: integer;
begin
 DOut := @DataOut;
 sz := (size shr 3) shl 3;
 i := 0;
 repeat
   DataIn[0] := Cardinal((pointer(Cardinal(Input) + Cardinal(i)))^);
   DataIn[1] := Cardinal((pointer(Cardinal(Input) + Cardinal(i + 4)))^);
   if encode then
     TEA_Cipher(@DataIn, DOut, @key)
   else
     TEA_DECipher(@DataIn, DOut, @key);
   Cardinal(pointer(Cardinal(Output) + Cardinal(i))^) := DataOut[0];
   Cardinal(pointer(Cardinal(Output) + Cardinal(i + 4))^) := DataOut[1];
   inc(i, 8);
 until i >= sz;
end;


Мол чего она делает? Для чего это нужно, для чего то?

Помогите пожалуйста разобраться?


clickmaker   (2007-11-23 17:07:00) [7]

а в последний параметр надо массив передать, а не 0


Dennis I. Komarov   (2007-11-23 17:03:00) [8]

> [3] Student00 ©   (23.11.07 16:52)

согласно объявлению
procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);


Reindeer Moss Eater   (2007-11-23 17:00:00) [9]

функция ждет integer, а ты передаешь ей строку.
а как правильно надо ?


Student00   (2007-11-23 16:52:00) [10]

А как правильно подскажите плз!


Reindeer Moss Eater   (2007-11-23 16:30:00) [11]

Плюс вот эта дурь

TEAKey(0));


Reindeer Moss Eater   (2007-11-23 16:28:00) [12]

size: integer

intto str(edit1.SelLength),


Наверх

Титульная страница Поиск, карта сайта Написать письмо