![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вызов процедур из модуля, 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),