|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Aleksey V. Vaneev 2:5003/15.1 03 Nov 2001 11:30:24 To : Valeriy Kozhevnikov Subject : Шифрование ГОСТ28147-89 --------------------------------------------------------------------------------
VK> Кто-нибудь реализовывал сабж, а то своя голова уже не варит...
Вроде, оно:
=== gost.pas ===
type
TKey = array [0..7] of LongInt;
const
CurrentKey: TKey = ($11111111, $22222222, $33333333, $44444444,
$FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF);
var
RTable: array [0..15, 0..7] of Byte;
Pod: array [0..1023] of Byte;
function lshr (v, i: LongInt): LongInt; assembler;
asm
db $66
mov ax, word ptr [v]
db $66
mov cx, word ptr [i]
db $66
shr ax, cl
db $66
mov dx, ax
db $66
shr dx, 16
end;
function lshl (v, i: LongInt): LongInt; assembler;
asm
db $66
mov ax, word ptr [v]
db $66
mov cx, word ptr [i]
db $66
shl ax, cl
db $66
mov dx, ax
db $66
shr dx, 16
end;
procedure elemgost (var aa, bb: LongInt; key: LongInt);
var
r: LongInt;
r1: Byte;
r2: Byte;
r3: Byte;
r4: Byte;
z: LongInt;
begin
r := aa + key;
r1 := Pod [r and $ff];
r2 := Pod [256 + lshr (r, 8) and $ff];
r3 := Pod [512 + lshr (r, 16) and $ff];
r4 := Pod [768 + lshr (r, 24)];
z := LongInt (r1) + lshl (r2, 8) +
lshl (r3, 16) + lshl (r4, 24);
bb := bb xor (lshl (z, 11) or lshr (z, 21));
z := aa;
aa := bb;
bb := z;
end;
procedure decrypt (var s1, s2: LongInt; var Key: TKey);
var
i, j: LongInt;
begin
for i := 0 to 7 do
elemgost (s1, s2, Key [i]);
for j := 1 to 3 do
for i := 0 to 7 do
elemgost (s1, s2, Key [7 - i]);
j := s2;
s2 := s1;
s1 := j;
end;
procedure encrypt (var s1, s2: LongInt; var Key: TKey);
var
i, j: LongInt;
begin
for j := 1 to 3 do
for i := 0 to 7 do
elemgost (s1, s2, Key [i]);
for i := 0 to 7 do
elemgost (s1, s2, Key [7 - i]);
j := s2;
s2 := s1;
s1 := j;
end;
procedure preparePod;
var
o, z, k, i, j: Integer;
begin
o := 0;
z := 0;
while (z < 8) do
begin
for j := 0 to 15 do
for i := 0 to 15 do
begin
Pod [o] := (RTable [j, z + 0]
shl 4) or
RTable [i, z + 1];
inc (o);
end;
inc (z, 2);
end;
end;
procedure writeNumber (v: LongInt);
const
Numbers: array [0..15] of Char = '0123456789abcdef';
var
i: Integer;
begin
for i := 0 to 7 do
begin
Write (Numbers [(v shr 28) and 15]);
v := v shl 4;
end;
end;
var
f: Text;
i, j: Integer;
s1, s2: LongInt;
begin
Assign (f, 'gost15.tbl');
Reset (f);
for j := 0 to 7 do
for i := 0 to 15 do
Read (f, RTable [i, j]);
preparePod;
s1 := $55555555;
s2 := $AAAAAAAA;
encrypt (s1, s2, CurrentKey);
writeNumber (s1);
Write (' ');
writeNumber (s2);
WriteLn;
decrypt (s1, s2, CurrentKey);
writeNumber (s1);
Write (' ');
writeNumber (s2);
WriteLn;
Close (f);
end.
================
=== gost15.tbl ===
$c $9 $f $e $8 $1 $3 $a $2 $7 $4 $d $6 $0 $b $5
$4 $2 $f $5 $9 $1 $0 $8 $e $3 $b $c $d $7 $a $6
$e $9 $b $2 $5 $f $7 $1 $0 $d $c $6 $a $4 $3 $8
$d $8 $e $c $7 $3 $9 $a $1 $5 $2 $4 $6 $f $0 $b
$8 $f $6 $b $1 $9 $c $5 $d $3 $7 $a $0 $e $2 $4
$3 $e $5 $9 $6 $8 $0 $d $a $b $7 $c $2 $1 $f $4
$c $6 $5 $2 $b $0 $9 $d $3 $e $7 $a $f $4 $1 $8
$9 $b $c $0 $3 $6 $7 $5 $4 $8 $e $f $1 $a $2 $d
==================
e-mail: picoder@sbis.komi.ru
--- GoldED+/W32 snapshot-2001.5.29
* Origin: We're all God's people (2:5003/15.1)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/27083be39d60.html, оценка из 5, голосов 10
|