📄 gost.pas
字号:
unit Gost;
{(C) Coban (alex@ritlabs.com)}
{$DEFINE USE_ASM} //Remove this line to use pascal instead of assembler
interface
uses
CryptoUtils;
type
TArr8LW = array[0..7] of LongWord;
PGostCtx = ^TGostCtx;
TGostCtx = record
sum: TArr8LW;
hash: TArr8LW;
len: TArr8LW;
partial: array[0..31] of Byte;
partial_bytes: LongWord;
end;
procedure GostInit(var ctx: TGostCtx);
procedure GostUpdate(var ctx: TGostCtx; const buf: Pointer; len: LongWord);
function GostFinal(var ctx: TGostCtx): String;
implementation
const
gost_sbox_1: array[0..255] of LongWord = (
$72000, $75000, $74800, $71000, $76800,
$74000, $70000, $77000, $73000, $75800,
$70800, $76000, $73800, $77800, $72800,
$71800, $5A000, $5D000, $5C800, $59000,
$5E800, $5C000, $58000, $5F000, $5B000,
$5D800, $58800, $5E000, $5B800, $5F800,
$5A800, $59800, $22000, $25000, $24800,
$21000, $26800, $24000, $20000, $27000,
$23000, $25800, $20800, $26000, $23800,
$27800, $22800, $21800, $62000, $65000,
$64800, $61000, $66800, $64000, $60000,
$67000, $63000, $65800, $60800, $66000,
$63800, $67800, $62800, $61800, $32000,
$35000, $34800, $31000, $36800, $34000,
$30000, $37000, $33000, $35800, $30800,
$36000, $33800, $37800, $32800, $31800,
$6A000, $6D000, $6C800, $69000, $6E800,
$6C000, $68000, $6F000, $6B000, $6D800,
$68800, $6E000, $6B800, $6F800, $6A800,
$69800, $7A000, $7D000, $7C800, $79000,
$7E800, $7C000, $78000, $7F000, $7B000,
$7D800, $78800, $7E000, $7B800, $7F800,
$7A800, $79800, $52000, $55000, $54800,
$51000, $56800, $54000, $50000, $57000,
$53000, $55800, $50800, $56000, $53800,
$57800, $52800, $51800, $12000, $15000,
$14800, $11000, $16800, $14000, $10000,
$17000, $13000, $15800, $10800, $16000,
$13800, $17800, $12800, $11800, $1A000,
$1D000, $1C800, $19000, $1E800, $1C000,
$18000, $1F000, $1B000, $1D800, $18800,
$1E000, $1B800, $1F800, $1A800, $19800,
$42000, $45000, $44800, $41000, $46800,
$44000, $40000, $47000, $43000, $45800,
$40800, $46000, $43800, $47800, $42800,
$41800, $0A000, $0D000, $0C800, $09000,
$0E800, $0C000, $08000, $0F000, $0B000,
$0D800, $08800, $0E000, $0B800, $0F800,
$0A800, $09800, $02000, $05000, $04800,
$01000, $06800, $04000, $00000, $07000,
$03000, $05800, $00800, $06000, $03800,
$07800, $02800, $01800, $3A000, $3D000,
$3C800, $39000, $3E800, $3C000, $38000,
$3F000, $3B000, $3D800, $38800, $3E000,
$3B800, $3F800, $3A800, $39800, $2A000,
$2D000, $2C800, $29000, $2E800, $2C000,
$28000, $2F000, $2B000, $2D800, $28800,
$2E000, $2B800, $2F800, $2A800, $29800,
$4A000, $4D000, $4C800, $49000, $4E800,
$4C000, $48000, $4F000, $4B000, $4D800,
$48800, $4E000, $4B800, $4F800, $4A800,
$49800);
gost_sbox_2: array[0..255] of LongWord = (
$3A80000, $3C00000, $3880000, $3E80000, $3D00000,
$3980000, $3A00000, $3900000, $3F00000, $3F80000,
$3E00000, $3B80000, $3B00000, $3800000, $3C80000,
$3D80000, $6A80000, $6C00000, $6880000, $6E80000,
$6D00000, $6980000, $6A00000, $6900000, $6F00000,
$6F80000, $6E00000, $6B80000, $6B00000, $6800000,
$6C80000, $6D80000, $5280000, $5400000, $5080000,
$5680000, $5500000, $5180000, $5200000, $5100000,
$5700000, $5780000, $5600000, $5380000, $5300000,
$5000000, $5480000, $5580000, $0A80000, $0C00000,
$0880000, $0E80000, $0D00000, $0980000, $0A00000,
$0900000, $0F00000, $0F80000, $0E00000, $0B80000,
$0B00000, $0800000, $0C80000, $0D80000, $0280000,
$0400000, $0080000, $0680000, $0500000, $0180000,
$0200000, $0100000, $0700000, $0780000, $0600000,
$0380000, $0300000, $0000000, $0480000, $0580000,
$4280000, $4400000, $4080000, $4680000, $4500000,
$4180000, $4200000, $4100000, $4700000, $4780000,
$4600000, $4380000, $4300000, $4000000, $4480000,
$4580000, $4A80000, $4C00000, $4880000, $4E80000,
$4D00000, $4980000, $4A00000, $4900000, $4F00000,
$4F80000, $4E00000, $4B80000, $4B00000, $4800000,
$4C80000, $4D80000, $7A80000, $7C00000, $7880000,
$7E80000, $7D00000, $7980000, $7A00000, $7900000,
$7F00000, $7F80000, $7E00000, $7B80000, $7B00000,
$7800000, $7C80000, $7D80000, $7280000, $7400000,
$7080000, $7680000, $7500000, $7180000, $7200000,
$7100000, $7700000, $7780000, $7600000, $7380000,
$7300000, $7000000, $7480000, $7580000, $2280000,
$2400000, $2080000, $2680000, $2500000, $2180000,
$2200000, $2100000, $2700000, $2780000, $2600000,
$2380000, $2300000, $2000000, $2480000, $2580000,
$3280000, $3400000, $3080000, $3680000, $3500000,
$3180000, $3200000, $3100000, $3700000, $3780000,
$3600000, $3380000, $3300000, $3000000, $3480000,
$3580000, $6280000, $6400000, $6080000, $6680000,
$6500000, $6180000, $6200000, $6100000, $6700000,
$6780000, $6600000, $6380000, $6300000, $6000000,
$6480000, $6580000, $5A80000, $5C00000, $5880000,
$5E80000, $5D00000, $5980000, $5A00000, $5900000,
$5F00000, $5F80000, $5E00000, $5B80000, $5B00000,
$5800000, $5C80000, $5D80000, $1280000, $1400000,
$1080000, $1680000, $1500000, $1180000, $1200000,
$1100000, $1700000, $1780000, $1600000, $1380000,
$1300000, $1000000, $1480000, $1580000, $2A80000,
$2C00000, $2880000, $2E80000, $2D00000, $2980000,
$2A00000, $2900000, $2F00000, $2F80000, $2E00000,
$2B80000, $2B00000, $2800000, $2C80000, $2D80000,
$1A80000, $1C00000, $1880000, $1E80000, $1D00000,
$1980000, $1A00000, $1900000, $1F00000, $1F80000,
$1E00000, $1B80000, $1B00000, $1800000, $1C80000,
$1D80000);
gost_sbox_3: array[0..255] of LongWord = (
$30000002, $60000002, $38000002, $08000002, $28000002,
$78000002, $68000002, $40000002, $20000002, $50000002,
$48000002, $70000002, $00000002, $18000002, $58000002,
$10000002, $B0000005, $E0000005, $B8000005, $88000005,
$A8000005, $F8000005, $E8000005, $C0000005, $A0000005,
$D0000005, $C8000005, $F0000005, $80000005, $98000005,
$D8000005, $90000005, $30000005, $60000005, $38000005,
$08000005, $28000005, $78000005, $68000005, $40000005,
$20000005, $50000005, $48000005, $70000005, $00000005,
$18000005, $58000005, $10000005, $30000000, $60000000,
$38000000, $08000000, $28000000, $78000000, $68000000,
$40000000, $20000000, $50000000, $48000000, $70000000,
$00000000, $18000000, $58000000, $10000000, $B0000003,
$E0000003, $B8000003, $88000003, $A8000003, $F8000003,
$E8000003, $C0000003, $A0000003, $D0000003, $C8000003,
$F0000003, $80000003, $98000003, $D8000003, $90000003,
$30000001, $60000001, $38000001, $08000001, $28000001,
$78000001, $68000001, $40000001, $20000001, $50000001,
$48000001, $70000001, $00000001, $18000001, $58000001,
$10000001, $B0000000, $E0000000, $B8000000, $88000000,
$A8000000, $F8000000, $E8000000, $C0000000, $A0000000,
$D0000000, $C8000000, $F0000000, $80000000, $98000000,
$D8000000, $90000000, $B0000006, $E0000006, $B8000006,
$88000006, $A8000006, $F8000006, $E8000006, $C0000006,
$A0000006, $D0000006, $C8000006, $F0000006, $80000006,
$98000006, $D8000006, $90000006, $B0000001, $E0000001,
$B8000001, $88000001, $A8000001, $F8000001, $E8000001,
$C0000001, $A0000001, $D0000001, $C8000001, $F0000001,
$80000001, $98000001, $D8000001, $90000001, $30000003,
$60000003, $38000003, $08000003, $28000003, $78000003,
$68000003, $40000003, $20000003, $50000003, $48000003,
$70000003, $00000003, $18000003, $58000003, $10000003,
$30000004, $60000004, $38000004, $08000004, $28000004,
$78000004, $68000004, $40000004, $20000004, $50000004,
$48000004, $70000004, $00000004, $18000004, $58000004,
$10000004, $B0000002, $E0000002, $B8000002, $88000002,
$A8000002, $F8000002, $E8000002, $C0000002, $A0000002,
$D0000002, $C8000002, $F0000002, $80000002, $98000002,
$D8000002, $90000002, $B0000004, $E0000004, $B8000004,
$88000004, $A8000004, $F8000004, $E8000004, $C0000004,
$A0000004, $D0000004, $C8000004, $F0000004, $80000004,
$98000004, $D8000004, $90000004, $30000006, $60000006,
$38000006, $08000006, $28000006, $78000006, $68000006,
$40000006, $20000006, $50000006, $48000006, $70000006,
$00000006, $18000006, $58000006, $10000006, $B0000007,
$E0000007, $B8000007, $88000007, $A8000007, $F8000007,
$E8000007, $C0000007, $A0000007, $D0000007, $C8000007,
$F0000007, $80000007, $98000007, $D8000007, $90000007,
$30000007, $60000007, $38000007, $08000007, $28000007,
$78000007, $68000007, $40000007, $20000007, $50000007,
$48000007, $70000007, $00000007, $18000007, $58000007,
$10000007
);
gost_sbox_4: array[0..255] of LongWord = (
$0E8, $0D8, $0A0, $088, $098,
$0F8, $0A8, $0C8, $080, $0D0,
$0F0, $0B8, $0B0, $0C0, $090,
$0E0, $7E8, $7D8, $7A0, $788,
$798, $7F8, $7A8, $7C8, $780,
$7D0, $7F0, $7B8, $7B0, $7C0,
$790, $7E0, $6E8, $6D8, $6A0,
$688, $698, $6F8, $6A8, $6C8,
$680, $6D0, $6F0, $6B8, $6B0,
$6C0, $690, $6E0, $068, $058,
$020, $008, $018, $078, $028,
$048, $000, $050, $070, $038,
$030, $040, $010, $060, $2E8,
$2D8, $2A0, $288, $298, $2F8,
$2A8, $2C8, $280, $2D0, $2F0,
$2B8, $2B0, $2C0, $290, $2E0,
$3E8, $3D8, $3A0, $388, $398,
$3F8, $3A8, $3C8, $380, $3D0,
$3F0, $3B8, $3B0, $3C0, $390,
$3E0, $568, $558, $520, $508,
$518, $578, $528, $548, $500,
$550, $570, $538, $530, $540,
$510, $560, $268, $258, $220,
$208, $218, $278, $228, $248,
$200, $250, $270, $238, $230,
$240, $210, $260, $4E8, $4D8,
$4A0, $488, $498, $4F8, $4A8,
$4C8, $480, $4D0, $4F0, $4B8,
$4B0, $4C0, $490, $4E0, $168,
$158, $120, $108, $118, $178,
$128, $148, $100, $150, $170,
$138, $130, $140, $110, $160,
$1E8, $1D8, $1A0, $188, $198,
$1F8, $1A8, $1C8, $180, $1D0,
$1F0, $1B8, $1B0, $1C0, $190,
$1E0, $768, $758, $720, $708,
$718, $778, $728, $748, $700,
$750, $770, $738, $730, $740,
$710, $760, $368, $358, $320,
$308, $318, $378, $328, $348,
$300, $350, $370, $338, $330,
$340, $310, $360, $5E8, $5D8,
$5A0, $588, $598, $5F8, $5A8,
$5C8, $580, $5D0, $5F0, $5B8,
$5B0, $5C0, $590, $5E0, $468,
$458, $420, $408, $418, $478,
$428, $448, $400, $450, $470,
$438, $430, $440, $410, $460,
$668, $658, $620, $608, $618,
$678, $628, $648, $600, $650,
$670, $638, $630, $640, $610,
$660);
{$IFDEF USE_ASM}
procedure GOST_ENCRYPT_ROUND(var l, r: LongWord; k1, k2: LongWord); assembler;
asm
push ebx
push edx
add ecx,dword ptr[edx]
mov edx,dword ptr[eax]
xor ebx,ebx
mov bl,cl
xor edx, dword ptr [gost_sbox_1 + ebx * 4]
mov bl,ch
xor edx, dword ptr [gost_sbox_2 + ebx * 4]
shr ecx,16
mov bl,cl
xor edx, dword ptr [gost_sbox_3 + ebx * 4]
mov bl,ch
xor edx, dword ptr [gost_sbox_4 + ebx * 4]
mov dword ptr[eax],edx
pop edx
mov ebx,dword ptr[edx]
mov eax,dword ptr[eax]
add eax,k2
xor ch,ch
mov cl,al
xor ebx,dword ptr [gost_sbox_1 + ecx * 4]
mov cl,ah
xor ebx,dword ptr [gost_sbox_2 + ecx * 4]
shr eax,16
mov cl,al
xor ebx,dword ptr [gost_sbox_3 + ecx * 4]
mov cl,ah
xor ebx,dword ptr [gost_sbox_4 + ecx * 4]
mov dword ptr[edx],ebx
pop ebx
end;
{$ELSE}
procedure GOST_ENCRYPT_ROUND(var l, r: LongWord; k1, k2: LongWord);
var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -