Main step of GOST 28147-89: Difference between revisions

mNo edit summary
Line 601:
{{out}}
<pre>1F 88 CF 07 21 04 3B 04</pre>
 
=={{header|Phix}}==
{{trans|D}}
<lang Phix>constant cbrf = {
{ 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}}
 
function generate(integer k)
sequence res = repeat(0,256)
for i=1 to length(res) do
res[i] = or_bits(cbrf[k][floor((i-1)/16)+1]*16,cbrf[k-1][and_bits(i-1,#F)+1])
end for
return res
end function
 
constant k87 = generate(8),
k65 = generate(6),
k43 = generate(4),
k21 = generate(2)
 
function r32(atom a)
if a<0 then a+=#100000000 end if
return remainder(a,#100000000)
end function
 
function mainstep(sequence input, atom key)
atom s = r32(input[1]+key)
s = or_all({k87[and_bits(floor(s/#1000000),#FF)+1]*#1000000,
k65[and_bits(floor(s/#10000),#FF)+1]*#10000,
k43[and_bits(floor(s/#100),#FF)+1]*#100,
k21[and_bits(s,#FF)+1]})
s = r32(s*power(2,11))+floor(s/power(2,32-11))
s = xor_bits(s,input[2])
return {s,input[1]}
end function
printf(1,"%08x %08x\n",mainstep({#043B0421, #04320430}, #E2C104F9))</lang>
{{out}}
<pre>
07CF801F 043B0421
</pre>
 
=={{header|PicoLisp}}==
Line 666 ⟶ 713:
(bye)</lang>
 
=={{header|Python}}==
{{trans|C}}
7,820

edits