GOST 28147-89 is a standard symmetric encryption based on a Feistel network.



The 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 (8x16 matrix of 4-bit values), and returns encrypted block.


Task

Implement the main step of this encryption algorithm.




 
const Таблица_замен = [
	[ 4, 10,  9,  2, 13,  8,  0, 14,  6, 11,  1, 12,  7, 15,  5,  3],
	[14, 11,  4, 12,  6, 13, 15, 10,  2,  3,  8,  1,  0,  7,  5,  9],
	[ 5,  8,  1, 13, 10,  3,  4,  2, 14, 15, 12,  7,  6,  0,  9, 11],
	[ 7, 13, 10,  1,  0,  8,  9, 15, 14,  4,  6, 12, 11,  2,  5,  3],
	[ 6, 12,  7,  1,  5, 15, 13,  8,  4, 10,  9, 14,  0,  3, 11,  2],
	[ 4, 11, 10,  0,  7,  2,  1, 13,  3,  6,  8,  5,  9, 12, 15, 14],
	[13, 11,  4,  1,  3, 15,  5,  9,  0, 10, 14,  7,  6,  8,  2, 12],
	[ 1, 15, 13,  0,  5,  7, 10,  4,  9,  2,  3, 14,  6, 11,  8, 12]
];
 
const Основной_шаг = (блок_текста, элемент_ключа, ТЗ) => {
	const
		N = блок_текста.slice(0),
		S = N[0] + элемент_ключа & 0xFFFFFFFF;
	let нов_S = 0;
	for (let сч = 0; сч < 4; сч++) {
		const яч = (S >>> (сч << 3)) & 0xFF;
		нов_S +=
			ТЗ[сч * 2][яч & 0x0F]
			+ (ТЗ[сч * 2 + 1][яч >>> 4] << 4)
			<< (сч << 3);
	}
	нов_S =
		(нов_S << 11)
		+ (нов_S >>> 21)
		& 0xFFFFFFFF
		^ N[1];
	N[1] = N[0]; N[0] = нов_S;
	return N;
};
 