Форум: "Прочее";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2012.02.26;
Скачать: [xml.tar.bz2];




Вниз

Помогите переписать функцию с ASM на Pascal или C 


DVM ©   (2011-11-08 16:28) [0]

Функция, я так понимаю, представляет собой базовый шаг кодирования ГОСТ 28147-89 или какую то вариацию на эту тему. Автор функции, вроде бы, местный форумчанин Alexander Panfilov (palva?). В принципе я бы мог конечно реализовать алгоритм шифрования по ГОСТ с нуля самостоятельно, но, дело в том, что функция вот в таком виде уже используется клиентом сервера (который мне недоступен), а сервер требуется перевести на 64 бит. И я не уверен, что эта функция точно соответствует алгоритму ГОСТ. Т.е нужена точная копия именно этой функции на Pascal-е или C.
В ASM я не особенно силен, потому прошу помощи у знатоков.


type
 TGOSTBlock = array[0..1] of LongWord;
 TGOSTKey = array[0..7] of LongWord;
 TGOSTSubstitutionTable = array[0..3, 0..255] of Byte;

var
 GOSTKey: TGOSTKey = {$INCLUDE key.inc }
 GOSTTable: TGOSTSubstitutionTable = {$INCLUDE table.inc }

procedure GOST_EncryptBlock(var GBlock: TGOSTBlock); assembler;
var
 blk: Pointer;
 i: LongInt;

label
 L, L1, L2;

asm
 push ebx
 push esi
 push edi

 mov  ebx, GBlock
 mov  blk, ebx
 mov  eax, [ebx]
 mov  edx, [ebx+4]

 mov  i, 3
L:
 mov  ecx, 8
 lea  esi, GOSTKey

L1:
 mov  edi, eax
 add  eax, [esi]
 lea  ebx, GOSTTable
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 rol  eax, 3
 xor  eax, edx
 mov  edx, edi
 add  esi, 4
loop L1

 sub  i, 1              
 jnz  L                

 mov  ecx, 8
 lea  esi, GOSTKey
 add  esi, 28

L2:
 mov  edi, eax
 add  eax, [esi]
 lea  ebx, GOSTTable
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 ror  eax, 8
 add  ebx, 256
 xlat
 rol  eax, 3
 xor  eax, edx
 mov  edx, edi
 sub  esi, 4

loop L2

 mov  ebx, blk
 mov  [ebx], edx
 mov  [ebx+4], eax

 pop  edi
 pop  esi
 pop  ebx
end;



Rouse_ ©   (2011-11-08 16:41) [1]

инклуды выложи



DVM ©   (2011-11-08 16:48) [2]


> инклуды выложи

Оригинальные не могу, это ж ключ и таблица замен все таки, ну вот измененные, например. Разницы большой нет.


key.inc:
(
$7C595131,$2E917262,$4B9764E9,$D7D6915B,
$C3CDF2EF,$171F9611,$47392FC0,$902449C1
);

table.inc:
(
( 236, 226, 232, 228, 230, 239, 235, 225,
 234, 233, 227, 238, 229, 224, 236, 231,
 189, 178, 184, 180, 182, 191, 187, 177,
 186, 185, 179, 190, 181, 176, 188, 183,
  77,  66,  72,  68,  70,  79,  75,  65,
  74,  73,  67,  78,  69,  64,  76,  71,
 205, 194, 200, 196, 198, 207, 203, 193,
 202, 201, 195, 206, 197, 192, 204, 199,
 109,  98, 104, 100, 102, 111, 107,  97,
 106, 105,  99, 110, 101,  96, 108, 103,
 221, 210, 216, 212, 214, 223, 219, 209,
 218, 217, 211, 222, 213, 208, 220, 215,
 253, 242, 248, 244, 246, 255, 251, 241,
 250, 249, 243, 254, 245, 240, 252, 247,
 173, 162, 168, 164, 166, 175, 171, 161,
 170, 169, 163, 174, 165, 160, 172, 167,
  45,  34,  40,  36,  38,  47,  43,  33,
  42,  41,  35,  46,  37,  32,  44,  39,
  61,  50,  56,  52,  54,  63,  59,  49,
  58,  57,  51,  62,  53,  48,  60,  55,
 141, 130, 136, 132, 134, 143, 139, 129,
 138, 137, 131, 142, 133, 128, 140, 135,
  29,  18,  24,  20,  22,  31,  27,  17,
  26,  25,  19,  30,  21,  16,  28,  23,
  13,   2,   8,   4,   6,  15,  11,   1,
  10,   9,   3,  14,   5,   0,  12,   7,
 125, 114, 120, 116, 118, 127, 123, 113,
 122, 121, 115, 126, 117, 112, 124, 119,
  93,  82,  88,  84,  86,  95,  91,  81,
  90,  89,  83,  94,  85,  80,  92,  87,
 157, 146, 152, 148, 150, 159, 155, 145,
 154, 153, 147, 158, 149, 144, 156, 151),
(  44,  33,  42,  47,  41,  34,  38,  40,
  32,  45,  35,  36,  46,  39,  37,  43,
 204, 193, 202, 207, 201, 194, 198, 200,
 192, 205, 195, 196, 206, 199, 197, 203,
  76,  65,  74,  79,  73,  66,  70,  72,
  64,  77,  67,  68,  78,  71,  69,  75,
  28,  17,  26,  31,  25,  18,  22,  24,
  16,  29,  19,  20,  30,  23,  21,  27,
 124, 113, 122, 127, 121, 114, 118, 120,
 112, 125, 115, 116, 126, 119, 117, 123,
 172, 161, 170, 175, 169, 162, 166, 168,
 160, 173, 163, 164, 174, 167, 165, 171,
 188, 177, 186, 191, 185, 178, 182, 184,
 176, 189, 179, 180, 190, 183, 181, 187,
 108,  97, 106, 111, 105,  98, 102, 104,
  96, 109,  99, 100, 110, 103, 101, 107,
 140, 129, 138, 143, 137, 130, 134, 136,
 128, 141, 131, 132, 142, 135, 133, 139,
  92,  81,  90,  95,  89,  82,  86,  88,
  80,  93,  83,  84,  94,  87,  85,  91,
  60,  49,  58,  63,  57,  50,  54,  56,
  48,  61,  51,  52,  62,  55,  53,  59,
 252, 241, 250, 255, 249, 242, 246, 248,
 240, 253, 243, 244, 254, 247, 245, 251,
 220, 209, 218, 223, 217, 210, 214, 216,
 208, 221, 211, 212, 222, 215, 213, 219,
  12,   1,  10,  15,   9,   2,   6,   8,
   0,  13,   3,   4,  14,   7,   5,  11,
 236, 225, 234, 239, 233, 226, 230, 232,
 224, 237, 227, 228, 238, 231, 229, 235,
 156, 145, 154, 159, 153, 146, 150, 152,
 144, 157, 147, 148, 158, 151, 149, 155),
( 166, 172, 167, 161, 165, 175, 173, 168,
 164, 170, 169, 174, 160, 163, 171, 162,
   6,  12,   7,   1,   5,  15,  13,   8,
   4,  10,   9,  14,   0,   3,  11,   2,
 150, 156, 151, 145, 149, 159, 157, 152,
 148, 154, 153, 158, 144, 147, 155, 146,
 230, 236, 231, 225, 229, 239, 237, 232,
 228, 234, 233, 238, 224, 227, 235, 226,
 102, 108, 103,  97, 101, 111, 109, 104,
 100, 106, 105, 110,  96,  99, 107,  98,
  54,  60,  55,  49,  53,  63,  61,  56,
  52,  58,  57,  62,  48,  51,  59,  50,
 246, 252, 247, 241, 245, 255, 253, 248,
 244, 250, 249, 254, 240, 243, 251, 242,
  86,  92,  87,  81,  85,  95,  93,  88,
  84,  90,  89,  94,  80,  83,  91,  82,
  22,  28,  23,  17,  21,  31,  29,  24,
  20,  26,  25,  30,  16,  19,  27,  18,
 214, 220, 215, 209, 213, 223, 221, 216,
 212, 218, 217, 222, 208, 211, 219, 210,
 198, 204, 199, 193, 197, 207, 205, 200,
 196, 202, 201, 206, 192, 195, 203, 194,
 118, 124, 119, 113, 117, 127, 125, 120,
 116, 122, 121, 126, 112, 115, 123, 114,
 182, 188, 183, 177, 181, 191, 189, 184,
 180, 186, 185, 190, 176, 179, 187, 178,
  70,  76,  71,  65,  69,  79,  77,  72,
  68,  74,  73,  78,  64,  67,  75,  66,
  38,  44,  39,  33,  37,  47,  45,  40,
  36,  42,  41,  46,  32,  35,  43,  34,
 134, 140, 135, 129, 133, 143, 141, 136,
 132, 138, 137, 142, 128, 131, 139, 130),
(  31,  17,  24,  30,  22,  27,  19,  20,
  25,  23,  18,  29,  28,  16,  21,  26,
 255, 241, 248, 254, 246, 251, 243, 244,
 249, 247, 242, 253, 252, 240, 245, 250,
 223, 209, 216, 222, 214, 219, 211, 212,
 217, 215, 210, 221, 220, 208, 213, 218,
  15,   1,   8,  14,   6,  11,   3,   4,
   9,   7,   2,  13,  12,   0,   5,  10,
  95,  81,  88,  94,  86,  91,  83,  84,
  89,  87,  82,  93,  92,  80,  85,  90,
 127, 113, 120, 126, 118, 123, 115, 116,
 121, 119, 114, 125, 124, 112, 117, 122,
 175, 161, 168, 174, 166, 171, 163, 164,
 169, 167, 162, 173, 172, 160, 165, 170,
  79,  65,  72,  78,  70,  75,  67,  68,
  73,  71,  66,  77,  76,  64,  69,  74,
 159, 145, 152, 158, 150, 155, 147, 148,
 153, 151, 146, 157, 156, 144, 149, 154,
  47,  33,  40,  46,  38,  43,  35,  36,
  41,  39,  34,  45,  44,  32,  37,  42,
  63,  49,  56,  62,  54,  59,  51,  52,
  57,  55,  50,  61,  60,  48,  53,  58,
 239, 225, 232, 238, 230, 235, 227, 228,
 233, 231, 226, 237, 236, 224, 229, 234,
 111,  97, 104, 110, 102, 107,  99, 100,
 105, 103,  98, 109, 108,  96, 101, 106,
 191, 177, 184, 190, 182, 187, 179, 180,
 185, 183, 178, 189, 188, 176, 181, 186,
 143, 129, 136, 142, 134, 139, 131, 132,
 137, 135, 130, 141, 140, 128, 133, 138,
 207, 193, 200, 206, 198, 203, 195, 196,
 201, 199, 194, 205, 204, 192, 197, 202)
);



CRLF   (2011-11-08 17:05) [3]

procedure GOST_EncryptBlock(var GBlock: TGOSTBlock);
var
 i, J: LongInt;
 eax, edx, edi: Cardinal;
 eaxbyte: array [0..3] of Byte absolute eax;
 esi: PCardinal;

begin
 eax := GBlock[0];
 edx := GBlock[1];

 for I := 0 to 3 do
   for J := 0 to 7 do begin
     esi := @GostKey[J];
     edi := eax;
     eax := eax + esi^;
     eaxbyte[0] := GostTable[0][eaxbyte[0]];
     eaxbyte[1] := GostTable[0][eaxbyte[1]];
     eaxbyte[2] := GostTable[0][eaxbyte[2]];
     eaxbyte[3] := GostTable[0][eaxbyte[3]];
     eax := (eax shr 3) or ((eax and 7) shl 29); //не уверен, надо в дебагере смотреть
     eax := eax xor edx;
     edx := edi;
   end;

 for J := 7 downto 0 do begin
   esi := @GostKey[J];
   edi := eax;
   eax := eax + esi^;
   eaxbyte[0] := GostTable[0][eaxbyte[0]];
   eaxbyte[1] := GostTable[0][eaxbyte[1]];
   eaxbyte[2] := GostTable[0][eaxbyte[2]];
   eaxbyte[3] := GostTable[0][eaxbyte[3]];
   eax := (eax shr 3) or ((eax and 7) shl 29); //не уверен, надо в дебагере смотреть
   eax := eax xor edx;
   edx := edi;
 end;

 GBlock[0] := edx;
 GBlock[1] := eax;
end;



CRLF   (2011-11-08 17:07) [4]

Не eaxbyte[0] := GostTable[0][eaxbyte[0]];
    eaxbyte[1] := GostTable[0][eaxbyte[1]];
    eaxbyte[2] := GostTable[0][eaxbyte[2]];
    eaxbyte[3] := GostTable[0][eaxbyte[3]];

а

eaxbyte[0] := GostTable[0][eaxbyte[0]];
    eaxbyte[1] := GostTable[1][eaxbyte[1]];
    eaxbyte[2] := GostTable[2][eaxbyte[2]];
    eaxbyte[3] := GostTable[3][eaxbyte[3]];



DVM ©   (2011-11-08 17:16) [5]


> CRLF   (08.11.11 17:07) [4]

Не проходит тесты твой вариант. Смотрю пока дальше.



CRLF   (2011-11-08 17:18) [6]

в исходном коде значение eax трижды циклически сдвигалось вправо на 8 бит, а затем ещё на 3 бита. вполне возможно, что в откомментированных строчках я в арифметике запутался.



DVM ©   (2011-11-08 17:23) [7]


> CRLF   (08.11.11 17:18) [6]

Спасибо, если дело действительно в этом я исправлю.



Rouse_ ©   (2011-11-08 17:47) [8]

procedure GOST_EncryptBlockA(var GBlock: TGOSTBlock);
var
 I, A, Block1, Block2, Tmp: Cardinal;
begin
 Block1 := GBlock[0];
 Block2 := GBlock[1];
 for I := 0 to 2 do
 begin
   for A := 0 to 7 do
   begin
     Tmp := Block1;
     Inc(Block1, GOSTKey[A]);
     Block1 := (Block1 and $FFFFFF00) + GOSTTable[0, Block1 and $FF];
     Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
     Block1 := (Block1 and $FFFFFF00) + GOSTTable[1, Block1 and $FF];
     Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
     Block1 := (Block1 and $FFFFFF00) + GOSTTable[2, Block1 and $FF];
     Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
     Block1 := (Block1 and $FFFFFF00) + GOSTTable[3, Block1 and $FF];
     Block1 := (Block1 shl 3) + ((Block1 and $E0000000) shr 29);
     Block1 := Block1 xor Block2;
     Block2 := Tmp;
   end;
 end;
 for A := 0 to 7 do
 begin
   Tmp := Block1;
   Inc(Block1, GOSTKey[7 - A]);
   Block1 := (Block1 and $FFFFFF00) + GOSTTable[0, Block1 and $FF];
   Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
   Block1 := (Block1 and $FFFFFF00) + GOSTTable[1, Block1 and $FF];
   Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
   Block1 := (Block1 and $FFFFFF00) + GOSTTable[2, Block1 and $FF];
   Block1 := ((Block1 and $FFFFFF00) shr 8) + ((Block1 and $FF) shl 24);
   Block1 := (Block1 and $FFFFFF00) + GOSTTable[3, Block1 and $FF];
   Block1 := (Block1 shl 3) + ((Block1 and $E0000000) shr 29);
   Block1 := Block1 xor Block2;
   Block2 := Tmp;
 end;
 GBlock[0] := Block2;
 GBlock[1] := Block1;
end;



Rouse_ ©   (2011-11-08 17:49) [9]


> CRLF   (08.11.11 17:05) [3]

Хексрейс? :) Я ручками упражнялся :)



CRLF   (2011-11-08 18:09) [10]


> Хексрейс?
Пппереведи... 8-]



CRLF   (2011-11-08 18:12) [11]


> for I := 0 to 2 do
to 3, не?



Rouse_ ©   (2011-11-08 18:16) [12]


> CRLF   (08.11.11 18:09) [10]
>
>
> > Хексрейс?
> Пппереведи... 8-]

IDA PRO + HexRais  он примерно такой-же код генерит :)


> > for I := 0 to 2 do
> to 3, не?

нет конечно:
 mov  i, 3
..
 sub  i, 1              
 jnz  L      

три прохода



DVM ©   (2011-11-08 21:22) [13]


> Rouse_ ©   (08.11.11 17:47) [8]

Большое спасибо. Функция прошла тесты.



Rouse_ ©   (2011-11-08 21:26) [14]


> DVM ©   (08.11.11 21:22) [13]
>
>
> > Rouse_ ©   (08.11.11 17:47) [8]
>
> Большое спасибо. Функция прошла тесты.

Дык с чего-бы ей не пройти - один в один с оригинала слизано :)
зы: незчт...



DVM ©   (2011-11-08 21:36) [15]


> Rouse_ ©   (08.11.11 18:16) [12]

Hex-Rays реально позволяет восстановить более-менее читабельный C код ?

Давно собираюсь заняться изучением Asm да все времени нет. Вроде бы все отдельных строках понятно, в целом же смысл как то ускользает, за исключением простейших случаев.



Rouse_ ©   (2011-11-08 21:42) [16]


> DVM ©   (08.11.11 21:36) [15]
>
>
> > Rouse_ ©   (08.11.11 18:16) [12]
>
> Hex-Rays реально позволяет восстановить более-менее читабельный
> C код ?

Ну более менее что-то показывает, допиливать до читабельного кода всеравно нужно, плюс до кучи иногда такое выдает что проще самому реализовать. Я обычно юзаю только для статического анализа сложных функций если сходу в алгоритм вникнуть не получается.
Он дорогой кстати, как и IDA...



Rouse_ ©   (2011-11-08 21:45) [17]

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



KSergey ©   (2011-11-09 10:08) [18]

А это все точно переедет на 64x учитывая, что там размеры интов другие? или это другой уже вопрос?



DVM ©   (2011-11-09 10:13) [19]


> KSergey ©   (09.11.11 10:08) [18]


> что там размеры интов другие?

Переедет. Там только размеры указателей другие, остальное все практически то же. Размер Cardinal не поменялся.
http://docwiki.embarcadero.com/RADStudio/en/Converting_32-bit_Delphi_Applications_to_64-bit_Windows



KSergey ©   (2011-11-09 10:23) [20]

> DVM ©   (09.11.11 10:13) [19]
> Переедет. Там только размеры указателей другие

Да, я уже читал про дельфи и С++.
Если честно, я не очень этого всего понимаю.
Помню, когда-то здесь была фраза от ЮЗ: "Если когда-нибудь размер integer будет отличаться от размера указателя - это будет революция в микропроцессорах и это уже будут не микропроцессоры по архитектуре". (Надеюсь, я не переврал в основных деталях).

Я понимаю, что тут отчасти вопрос интерпретации что есть integer, в частности везде зачем-то ввели NativeInt и т.п. питы, привязанные к платформе, но я реально не понимаю зачем и почему.
Во всех канонических книжках писалось, что int - платформо-зависимый тип. И так было, в частности, при переезде с 16 на 32.

А вот при переезде на 64 - вдруг почему-то на это резко забили. Мне вот, признаться, не очень понятно как теперь указатели запихивать в Data поля всяких TObject. Или там резко поменяли на NativeInt тип?



KSergey ©   (2011-11-09 10:25) [21]

> Мне вот, признаться, не очень понятно как теперь указатели
> запихивать в Data поля всяких TObject. Или там резко поменяли
> на NativeInt тип?

Ну это частная задача, вопрос, понятно, в том, что мне не понятно почему такое вдруг произошло. Я явно что-то упустил.



Kerk ©   (2011-11-09 10:27) [22]

Причину зачем придумали NativeInt я тоже не понимаю. Выглядит как адовый костыль для чего-то.



Rouse_ ©   (2011-11-09 10:28) [23]


> А вот при переезде на 64 - вдруг почему-то на это резко
> забили

А в этом вся "гениальность" разрабов от кадэры, лучше б они забили на то что Char двумя байтами стал и ввели-бы UnicodeString а string оставили старым, чем то, как сейчас... Все похоже на то, что их не вовремя "накрывает" и опять-же не вовремя "отпускает" :)



DVM ©   (2011-11-09 10:31) [24]


> KSergey ©   (09.11.11 10:23) [20]


> Во всех канонических книжках писалось, что int - платформо-
> зависимый тип. И так было, в частности, при переезде с 16
> на 32.

Он и сейчас платформо-зависимый. Но на платформе x86-64 он 32 бит.



DVM ©   (2011-11-09 10:34) [25]

Вот еще раз приведу ссылку на гунсмокера, может кто-то еще не читал, он там хорошо расписал.
http://www.gunsmoker.ru/2010/11/64-windows.html

Про 64-битные модели данных параграф.



KSergey ©   (2011-11-09 11:09) [26]

> Rouse_ ©   (09.11.11 10:28) [23]
> А в этом вся "гениальность" разрабов от кадэры,

Да если бы. Я б не визжал.
В сях (других повсем изготовителей компиляторов, не эмбар-как-его) - та же хрень.




Форум: "Прочее";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2012.02.26;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.81 MB
Время: 0.023 c
3-1272008503      Kobylyansky           2010-04-23 11:41  2012.02.26  
Firebird+многопоточность


2-1321736746      bunguev               2011-11-20 01:05  2012.02.26  
Вкладки в делфи(


15-1320758892     DVM                   2011-11-08 16:28  2012.02.26  
Помогите переписать функцию с ASM на Pascal или C


15-1320945919     РРРС                  2011-11-10 21:25  2012.02.26  
Точки фриланса


2-1321131467      Laguna                2011-11-13 00:57  2012.02.26  
Изменить курсор вне модальной формы