Форум: "Прочее";
Текущий архив: 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