GOST 28147-89 is a standard symmetric encryption based on a Feistel network. Structure of the algorithm consists of three levels:

- encryption modes – simple replacement, application range, imposing a range of feedback and authentication code generation;
- cycles – 32-З, 32-Р and 16-З, is a repetition of the main step;
*main step*, a function that takes a 64-bit block of text and one of the eight 32-bit encryption key elements, and uses the replacement table (8×16 matrix of 4-bit values), and returns encrypted block.

Implement the main step of this encryption algorithm.

UINT_64 TGost::SWAP32(UINT_32 N1, UINT_32 N2) { UINT_64 N; N = N1; N = (N<<32)|N2; return UINT_64(N); } UINT_32 TGost::ReplaceBlock(UINT_32 x) { register i; UINT_32 res = 0UL; for(i=7;i>=0;i--) { ui4_0 = x>>(i*4); ui4_0 = BS[ui4_0][i]; res = (res<<4)|ui4_0; } return res; } UINT_64 TGost::MainStep(UINT_64 N,UINT_32 X) { UINT_32 N1,N2,S=0UL; N1=UINT_32(N); N2=N>>32; S = N1 + X % 0x4000000000000; S = ReplaceBlock(S); S = (S<<11)|(S>>21); S ^= N2; N2 = N1; N1 = S; return SWAP32(N2,N1); }

Variable “BS” is the replacement table.

Content is available under GNU Free Documentation License 1.2.