![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать данные в процедуру ? [D7, WinXP]
San1712 © (2008-06-06 20:01:00)Здраствуйте
Есть процедура с параметрами InData и OutData
___________________________________________________
procedure TDCP_rijndael.EncryptECB(const InData; var OutData);
var
r: longword;
tempb: array[0..MAXBC-1,0..3] of byte;
a: array[0..MAXBC,0..3] of byte;
begin
if not fInitialized then
raise EDCP_blockcipher.Create('Cipher not initialized');
PDword(@a[0,0])^:= PDword(@InData)^;
PDword(@a[1,0])^:= PDword(dword(@InData)+4)^;
PDword(@a[2,0])^:= PDword(dword(@InData)+8)^;
PDword(@a[3,0])^:= PDword(dword(@InData)+12)^;
for r:= 0 to (numrounds-2) do
begin
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[r,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[r,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[r,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[r,3];
PDWord(@a[0])^:= PDWord(@T1[tempb[0,0]])^ xor
PDWord(@T2[tempb[1,1]])^ xor
PDWord(@T3[tempb[2,2]])^ xor
PDWord(@T4[tempb[3,3]])^;
PDWord(@a[1])^:= PDWord(@T1[tempb[1,0]])^ xor
PDWord(@T2[tempb[2,1]])^ xor
PDWord(@T3[tempb[3,2]])^ xor
PDWord(@T4[tempb[0,3]])^;
PDWord(@a[2])^:= PDWord(@T1[tempb[2,0]])^ xor
PDWord(@T2[tempb[3,1]])^ xor
PDWord(@T3[tempb[0,2]])^ xor
PDWord(@T4[tempb[1,3]])^;
PDWord(@a[3])^:= PDWord(@T1[tempb[3,0]])^ xor
PDWord(@T2[tempb[0,1]])^ xor
PDWord(@T3[tempb[1,2]])^ xor
PDWord(@T4[tempb[2,3]])^;
end;
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[numrounds-1,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[numrounds-1,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[numrounds-1,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[numrounds-1,3];
a[0,0]:= T1[tempb[0,0],1];
a[0,1]:= T1[tempb[1,1],1];
a[0,2]:= T1[tempb[2,2],1];
a[0,3]:= T1[tempb[3,3],1];
a[1,0]:= T1[tempb[1,0],1];
a[1,1]:= T1[tempb[2,1],1];
a[1,2]:= T1[tempb[3,2],1];
a[1,3]:= T1[tempb[0,3],1];
a[2,0]:= T1[tempb[2,0],1];
a[2,1]:= T1[tempb[3,1],1];
a[2,2]:= T1[tempb[0,2],1];
a[2,3]:= T1[tempb[1,3],1];
a[3,0]:= T1[tempb[3,0],1];
a[3,1]:= T1[tempb[0,1],1];
a[3,2]:= T1[tempb[1,2],1];
a[3,3]:= T1[tempb[2,3],1];
PDWord(@a[0])^:= PDWord(@a[0])^ xor rk[numrounds,0];
PDWord(@a[1])^:= PDWord(@a[1])^ xor rk[numrounds,1];
PDWord(@a[2])^:= PDWord(@a[2])^ xor rk[numrounds,2];
PDWord(@a[3])^:= PDWord(@a[3])^ xor rk[numrounds,3];
PDword(@OutData)^:= PDword(@a[0,0])^;
PDword(dword(@OutData)+4)^:= PDword(@a[1,0])^;
PDword(dword(@OutData)+8)^:= PDword(@a[2,0])^;
PDword(dword(@OutData)+12)^:= PDword(@a[3,0])^;
end;
_________________________________________________
Как передать данные в процедуру с такими параметрами ?
Умищъ (2008-06-07 18:01:00) [1]А я верю! Аминь.
Германн (2008-06-07 01:15:00) [2]
> Игорь Шевченко © (07.06.08 00:44) [7]
И всё-таки не верю!
Германн (2008-06-07 00:54:00) [3]
> Игорь Шевченко © (07.06.08 00:44) [7]
Может быть и так. Я с исходниками криптоалгоритмов, как правило, не знаком.
Кроме тех, которые реализованы Turbo Power.
Игорь Шевченко (2008-06-07 00:44:00) [4]Германн © (07.06.08 00:41) [6]
> И похоже на "исходники" оставляемые "временными программистами"
> той конторе, которая их "временно наняла".
> Вроде как исходник и есть, а вроде как его и нет!
Ты неправ. Многие исходники криптоалгоритмов имеют такой вид - ну не беда это их ни разу.
Германн (2008-06-07 00:41:00) [5]
> Юрий Зотов © (06.06.08 23:52) [3]
>
>
Похоже. И похоже на "исходники" оставляемые "временными программистами" той конторе, которая их "временно наняла".
Вроде как исходник и есть, а вроде как его и нет!
palva (2008-06-07 00:30:00) [6]Это зашифрование блока данных по AES. Длина входного и выходного блока всегда 16 байт. Использованный метод передачи параметров удобен тем, что не требуется заботиться о правильном типе при обращении к функции. То есть при шифровании большого байтового массива параметр может последовательно принимать значение a[0], a[16], a[32] и т. д. Конечно, это эквивалентно использованию Pointer, но немного проще, поскольку при обращении к функции не надо все время писать @.
Игорь Шевченко (2008-06-07 00:27:00) [7]
> Как передать данные в процедуру с такими параметрами ?
var
InData: array[0..3] of Integer;
OutData: array[0..3] of Integer;
...
TDCP_rijndael.EncryptECB(InData, OutData);
...
или
var
InData: array[0..15] of Char;
OutData: array[0..15] of Char;
...
TDCP_rijndael.EncryptECB(InData, OutData);
...
в общем, как хочешь, только читает процедура 16 байт и пишет 16 байт
Юрий Зотов (2008-06-06 23:52:00) [8]Похоже, автор очень беспокоился, что исходник процедуры каким-то образом попадет в EXE.
Loginov Dmitry (2008-06-06 22:26:00) [9]Очень странно (даже подозрительно) скрывать реальный тип поддерживаемых данных (PDWord) в функции EncryptECB и не передавать в нее размеры массивов в байтах.
palva (2008-06-06 21:42:00) [10]Смотря какие данные. Можно передать массив байт или других целых, массив символов, элемент такого массива, символ строки, например s[1], может быть еще что-то. Вообще можно передать многое что, компилятор пропустит. Но не всегда это будет иметь смысл и может в иных случаях выйти боком для программы.