Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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]
> А в этом вся "гениальность" разрабов от кадэры,

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



Страницы: 1 вся ветка

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

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1320006602
Юрий
2011-10-30 23:30
2012.02.26
С днем рождения ! 31 октября 2011 понедельник


15-1320770585
TUser
2011-11-08 19:43
2012.02.26
Скорость обучения перлу


6-1251214387
alik
2009-08-25 19:33
2012.02.26
Подвисание при вызове TcpClient1.Receiveln()


15-1320848351
xss22
2011-11-09 18:19
2012.02.26
Удаление элемента со сдвигом из массива array of record


2-1321098441
a101081
2011-11-12 15:47
2012.02.26
StrToFloat()





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский