Конференция "Основная" » Как передать данные в процедуру ? [D7, WinXP]
 
  • San1712 (06.06.08 20:01) [0]
    Здраствуйте
    Есть процедура с параметрами 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;
    _________________________________________________
    Как передать данные в процедуру с такими  параметрами ?
  • palva © (06.06.08 21:42) [1]
    Смотря какие данные. Можно передать массив байт или других целых, массив символов, элемент такого массива, символ строки, например s[1], может быть еще что-то. Вообще можно передать многое что, компилятор пропустит. Но не всегда это будет иметь смысл и может в иных случаях выйти боком для программы.
  • Loginov Dmitry © (06.06.08 22:26) [2]
    Очень странно (даже подозрительно) скрывать реальный тип поддерживаемых данных (PDWord) в функции EncryptECB и не передавать в нее размеры массивов в байтах.
  • Юрий Зотов © (06.06.08 23:52) [3]
    Похоже, автор очень беспокоился, что исходник процедуры каким-то образом попадет в EXE.
  • Игорь Шевченко © (07.06.08 00:27) [4]

    > Как передать данные в процедуру с такими  параметрами ?


    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 байт
  • palva © (07.06.08 00:30) [5]
    Это зашифрование блока данных по AES. Длина входного и выходного блока всегда 16 байт. Использованный метод передачи параметров удобен тем, что не требуется заботиться о правильном типе при обращении к функции. То есть при шифровании большого байтового массива параметр может последовательно принимать значение a[0], a[16], a[32] и т. д. Конечно, это эквивалентно использованию Pointer, но немного проще, поскольку при обращении к функции не надо все время писать @.
  • Германн © (07.06.08 00:41) [6]

    > Юрий Зотов ©   (06.06.08 23:52) [3]
    >
    >

    Похоже. И похоже на "исходники" оставляемые "временными программистами" той конторе, которая их "временно наняла".
    Вроде как исходник и есть, а вроде как его и нет!
  • Игорь Шевченко © (07.06.08 00:44) [7]
    Германн ©   (07.06.08 00:41) [6]


    > И похоже на "исходники" оставляемые "временными программистами"
    > той конторе, которая их "временно наняла".
    > Вроде как исходник и есть, а вроде как его и нет!


    Ты неправ. Многие исходники криптоалгоритмов имеют такой вид - ну не беда это их ни разу.
  • Германн © (07.06.08 00:54) [8]

    > Игорь Шевченко ©   (07.06.08 00:44) [7]

    Может быть и так. Я с исходниками криптоалгоритмов, как правило, не знаком.
    Кроме тех, которые реализованы Turbo Power.
  • Германн © (07.06.08 01:15) [9]

    > Игорь Шевченко ©   (07.06.08 00:44) [7]

    И всё-таки не верю!
  • Умищъ © (07.06.08 18:01) [10]
    А я верю! Аминь.
 
Конференция "Основная" » Как передать данные в процедуру ? [D7, WinXP]
Есть новые Нет новых   [134491   +8][b:0][p:0]