|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Igor Dolgov 2:5020/2013.20 19 Nov 2001 00:16:13 To : Aleksey V. Vaneev Subject : Шифрование ГОСТ28147-89 Оно ли это? -------------------------------------------------------------------------------- Суб Hоя 03 2001 10:30, Aleksey V. Vaneev отписал к Valeriy Kozhevnikov следyющее: VK>> Кто-нибудь реализовывал сабж, а то своя голова уже не варит... AV> Вроде, оно: Вот решил проверить и что-то не пойму. Зашифровал файл 32К состоящий из пробелов и получил постоянно повторяющиеся комбинации из 8 байт. Разве ГОСТ должен себя вести подобным образом? К тому же, насколько мне известно реализация сабжевого алгоритма довольно сложна, а здесь мы видим какое-то примитивное шифрование по непонятной таблице из 1024 байт, которая создается из другой таблицы без участия ключа. Вообщем сложилось у меня впечатление, что это какая-то лажа, не имеющая к ГОСТу никакого отношения. Если я не прав, пожалуйста поправте. Может у кого есть нормальная реализация ГОСТа, на Си, Паскале или Ассемблере, буду весьма признателен. Очень нужно. Hу или УРЛ, на худой конец. Или подробное описание самого алгоритма. Жду Вашей помощи. 2(Ко)Модератор: Прошу прощение за избыточное цитирование. Боюсь что оригинал программы многие у себя не сохранили. AV> === gost.pas === AV> type AV> TKey = array [0..7] of LongInt; AV> const AV> CurrentKey: TKey = ($11111111, $22222222, $33333333, AV> $44444444, AV> $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF); AV> var AV> RTable: array [0..15, 0..7] of Byte; AV> Pod: array [0..1023] of Byte; AV> function lshr (v, i: LongInt): LongInt; assembler; AV> asm AV> db $66 AV> mov ax, word ptr [v] AV> db $66 AV> mov cx, word ptr [i] AV> db $66 AV> shr ax, cl AV> db $66 AV> mov dx, ax AV> db $66 AV> shr dx, 16 AV> end; AV> function lshl (v, i: LongInt): LongInt; assembler; AV> asm AV> db $66 AV> mov ax, word ptr [v] AV> db $66 AV> mov cx, word ptr [i] AV> db $66 AV> shl ax, cl AV> db $66 AV> mov dx, ax AV> db $66 AV> shr dx, 16 AV> end; AV> procedure elemgost (var aa, bb: LongInt; key: LongInt); AV> var AV> r: LongInt; AV> r1: Byte; AV> r2: Byte; AV> r3: Byte; AV> r4: Byte; AV> z: LongInt; AV> begin AV> r := aa + key; AV> r1 := Pod [r and $ff]; AV> r2 := Pod [256 + lshr (r, 8) and $ff]; AV> r3 := Pod [512 + lshr (r, 16) and $ff]; AV> r4 := Pod [768 + lshr (r, 24)]; AV> z := LongInt (r1) + lshl (r2, 8) + AV> lshl (r3, 16) + lshl (r4, 24); AV> bb := bb xor (lshl (z, 11) or lshr (z, 21)); AV> z := aa; AV> aa := bb; AV> bb := z; AV> end; AV> procedure decrypt (var s1, s2: LongInt; var Key: TKey); AV> var AV> i, j: LongInt; AV> begin AV> for i := 0 to 7 do AV> elemgost (s1, s2, Key [i]); AV> for j := 1 to 3 do AV> for i := 0 to 7 do AV> elemgost (s1, s2, Key [7 - i]); AV> j := s2; AV> s2 := s1; AV> s1 := j; AV> end; AV> procedure encrypt (var s1, s2: LongInt; var Key: TKey); AV> var AV> i, j: LongInt; AV> begin AV> for j := 1 to 3 do AV> for i := 0 to 7 do AV> elemgost (s1, s2, Key [i]); AV> for i := 0 to 7 do AV> elemgost (s1, s2, Key [7 - i]); AV> j := s2; AV> s2 := s1; AV> s1 := j; AV> end; AV> procedure preparePod; AV> var AV> o, z, k, i, j: Integer; AV> begin AV> o := 0; AV> z := 0; AV> while (z < 8) do AV> begin AV> for j := 0 to 15 do AV> for i := 0 to 15 do AV> begin AV> Pod [o] := (RTable [j, AV> z + 0] shl 4) or AV> RTable [i, z + AV> 1]; AV> inc (o); AV> end; AV> inc (z, 2); AV> end; AV> end; AV> procedure writeNumber (v: LongInt); AV> const AV> Numbers: array [0..15] of Char = '0123456789abcdef'; AV> var AV> i: Integer; AV> begin AV> for i := 0 to 7 do AV> begin AV> Write (Numbers [(v shr 28) and 15]); AV> v := v shl 4; AV> end; AV> end; AV> var AV> f: Text; AV> i, j: Integer; AV> s1, s2: LongInt; AV> begin AV> Assign (f, 'gost15.tbl'); AV> Reset (f); AV> for j := 0 to 7 do AV> for i := 0 to 15 do AV> Read (f, RTable [i, j]); AV> preparePod; AV> s1 := $55555555; AV> s2 := $AAAAAAAA; AV> encrypt (s1, s2, CurrentKey); AV> writeNumber (s1); AV> Write (' '); AV> writeNumber (s2); AV> WriteLn; AV> decrypt (s1, s2, CurrentKey); AV> writeNumber (s1); AV> Write (' '); AV> writeNumber (s2); AV> WriteLn; AV> Close (f); AV> end. AV> === gost15.tbl === AV> $c $9 $f $e $8 $1 $3 $a $2 $7 $4 $d $6 $0 $b $5 AV> $4 $2 $f $5 $9 $1 $0 $8 $e $3 $b $c $d $7 $a $6 AV> $e $9 $b $2 $5 $f $7 $1 $0 $d $c $6 $a $4 $3 $8 AV> $d $8 $e $c $7 $3 $9 $a $1 $5 $2 $4 $6 $f $0 $b AV> $8 $f $6 $b $1 $9 $c $5 $d $3 $7 $a $0 $e $2 $4 AV> $3 $e $5 $9 $6 $8 $0 $d $a $b $7 $c $2 $1 $f $4 AV> $c $6 $5 $2 $b $0 $9 $d $3 $e $7 $a $f $4 $1 $8 AV> $9 $b $c $0 $3 $6 $7 $5 $4 $8 $e $f $1 $a $2 $d AV> ================== Удачи тебе, Aleksey. --- * Origin: Каждой тваре по NetWare. (2:5020/2013.20) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/44453bf843e4.html, оценка из 5, голосов 10
|