script magma à utiliser sur le site
magma sans garantie de ma part :lol3:
m := "1000010000111001";
X1 := StringToInteger(Substring(m,1,4),2);
X2 := StringToInteger(Substring(m,5,4),2);
X3 := StringToInteger(Substring(m,9,4),2);
X4 := StringToInteger(Substring(m,13,4),2);
K1 := StringToInteger("0110",2);
K2 := StringToInteger("0111",2);
K3 := StringToInteger("1010",2);
K4 := StringToInteger("0000",2);
K5 := StringToInteger("0001",2);
K6 := StringToInteger("0010",2);
add_4:=function(a,b);
return (a+b) mod 2^4;
end function;
mult_4:=function(a,b);
if a eq 0 then a:=2^4; end if;
if b eq 0 then b:=2^4; end if;
c:= (a*b) mod (2^4+1);
if c eq 0 then c:=2^4; end if;
return c;
end function;
BoolToInt:=function(b);
if b then return 1;
else return 0;
end if;
end function;
IntToBool:=function(a);
return a eq 1;
end function;
xor_4:=function(a,b);
return Seqint([ BoolToInt(IntToBool(Intseq(a+2^4,2)[i]) xor IntToBool(Intseq(b+2^4,2)[i])): i in [1..4]],2);
end function;
// multipliez X1 et la première sous-clef ;
Y1:=mult_4(X1,K1);
// additionnez X2 et la deuxième sous-clef ;
Y2:=add_4(X2,K2);
// additionnez X3 et la troisième sous-clef ;
Y3:=add_4(X3,K3);
// multipliez X4 et la quatrième sous-clef ;
Y4:=mult_4(X4,K4);
// combinez par OU exclusif les résultats des étapes (1) et (3) ;
Y5:=xor_4(Y1,Y3);
// combinez par OU exclusif les résultats des étapes (2) et (4) ;
Y6:=xor_4(Y2,Y4);
// multipliez le résultat de l'étape (5) avec la cinquième sous-clef ;
Y7:=mult_4(Y5,K5);
// additionnez les résultats des étapes (6) et (7) ;
Y8:=add_4(Y6,Y7);
// multipliez le résultat de l'étape (8) par la sixième sous-clef ;
Y9:=mult_4(Y8,K6);
// additionnez les résultats des étapes (7) et (9) ;
Y10:=add_4(Y7,Y9);
// combinez par OU exclusif les résultats des étapes (1) et (9) ;
Y11:=xor_4(Y1,Y9);
// combinez par OU exclusif les résultats des étapes (3) et (9) ;
Y12:=xor_4(Y3,Y9);
// combinez par OU exclusif les résultats des étapes (2) et (10) ;
Y13:=xor_4(Y2,Y10);
// combinez par OU exclusif les résultats des étapes (4) et (10).
Y14:=xor_4(Y4,Y10);
string_4:=function(a);
s:=IntegerToString(a,2);
return "0"^(4-#s) cat s;
end function;
//La sortie de la ronde est constituée des 4 sous-blocs produits par les étapes (11), (13), (12) et (14)
mm:=string_4(Y11) cat string_4(Y13) cat string_4(Y12) cat string_4(Y14);
mm;