How to resolve the algorithm Main step of GOST 28147-89 step by step in the REXX programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Main step of GOST 28147-89 step by step in the REXX programming language

Table of Contents

Problem Statement

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

The structure of the algorithm consists of three levels:

Implement the main step of this encryption algorithm.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Main step of GOST 28147-89 step by step in the REXX programming language

Source code in the rexx programming language

/*REXX program implements  main step   GOST 28147-89   based on a Feistel network.      */
numeric digits 12                          /*  ┌── a list of 4─bit S─box values used by */
                                           /*  ↓ the Central Bank of Russian Federation.*/
                @.0  =     4  10   9   2  13   8   0  14   6  11   1  12   7  15   5   3
                @.1  =    14  11   4  12   6  13  15  10   2   3   8   1   0   7   5   9
                @.2  =     5   8   1  13  10   3   4   2  14  15  12   7   6   0   9  11
                @.3  =     7  13  10   1   0   8   9  15  14   4   6  12  11   2   5   3
                @.4  =     6  12   7   1   5  15  13   8   4  10   9  14   0   3  11   2
                @.5  =     4  11  10   0   7   2   1  13   3   6   8   5   9  12  15  14
                @.6  =    13  11   4   1   3  15   5   9   0  10  14   7   6   8   2  12
                @.7  =     1  15  13   0   5   7  10   4   9   2   3  14   6  11   8  12
                                           /* [↓]  build the sub-keys array from above. */
         do r=0  for 8;     do c=0  for 16;        !.r.c=word(@.r, c + 1);     end;    end
z=0
#1=x2d( 43b0421 );     #2=x2d( 4320430 );                         k=#1 + x2d( 0e2c104f9 )
                            do  while  k > x2d( 7ffFFffF );       k=k - 2**32;     end
                            do  while  k < x2d( 80000000 );       k=k + 2**32;     end

  do j=0  for 4;   jj=j + j;        jjp=jj + 1   /*calculate the array'a  "subscripts". */
  $=x2d( right( d2x( k % 2 ** (j * 8) ),  2) )
              cm=$ // 16;       cd=$ % 16        /*perform modulus and integer division.*/
  z=z + (!.jj.cm  +  16 * !.jjp.cd)  *  2**(j*8)
  end   /*i*/                                    /* [↑]  encryption algorithm for S-box.*/
                                                 /* [↓]  encryption algorithm round.    */
k = c2d( bitxor( bitor( d2c(z * 2**11,  4),    d2c(z % 2**21,  4) ),     d2c(#2, 4) ) )
say  center(d2x(k)     ' '    d2x(#1), 79)       /*stick a fork in it,  we're all done. */


  

You may also check:How to resolve the algorithm Factors of an integer step by step in the Smalltalk programming language
You may also check:How to resolve the algorithm Dynamic variable names step by step in the ProDOS programming language
You may also check:How to resolve the algorithm Pythagorean quadruples step by step in the C++ programming language
You may also check:How to resolve the algorithm Read a file line by line step by step in the Groovy programming language
You may also check:How to resolve the algorithm Inheritance/Single step by step in the Swift programming language