]>ExCriptoAulas4.mws

TEORIA DOS NÚMEROS E CRIPTOGRAFIA - 2003/04

...DES...

restart:

...Chaves intermédias...

#
# Key schedule bit selections...
#
PC1:=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4]:
PC2:=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,39,32]:
printf("PC1 tem %A bits e PC2 tem %A bits...",nops(PC1),nops(PC2));
rd:=rand(0..1): # funcao que fornece bit (0 ou 1) aleatorio...
#
# Escolha de uma chave aleatoria...
# (falta acertar digitos de controle de erro...)
#
K:=[seq(rd(),i=1..64)]; 
v:=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]: #v[1],v[2],v[9],v[16];
C:=[]:
for i from 1 to 28 do 
C:=[op(C),K[PC1[i]]]:
od:
Dd:=[]:
for i from 1 to 28 do 
Dd:=[op(Dd),K[PC1[28+i]]]:
od:
C,Dd;[op(C),op(Dd)];
for i from 1 to 16 do
 Cc:=[]: Ddd:=[]:
  for j from 1 to 28 do
   Cc:=[op(Cc),C[j+v[i]-1 mod 28+1]]:
   Ddd:=[op(Ddd),Dd[j+v[i]-1 mod 28+1]]:
  od: 
 C:=Cc: Dd:=Ddd:
 Ko[i]:=[op(C),op(Dd)]; Ki[i]:=[]:
  for j from 1 to 48 do
   Ki[i]:=[op(Ki[i]),Ko[i][PC2[j]]]: 
  od:
od:
#for i to 16 do print(Ki[i]): od:

...A permutação inicial e a sua inversa...


 
IP:=[58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7];
E:=[32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1]:
P:=[16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25]:
nops(IP);
with(group):
IPcy:=convert(IP,'disjcyc'):
IPinv:=invperm(IPcy):IPinv:=convert(IPinv,'permlist',64);

...As caixas S...

Sbox[1]:=array(0..3,0..15,[
 [14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7],
 [ 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8],
 [ 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0],
 [15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13]]):
Sbox[2]:=array(0..3,0..15,[
 [15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10],
 [ 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5],
 [ 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15],
 [13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9]]):
Sbox[3]:=array(0..3,0..15,[
 [10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8],
 [13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1],
 [13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7],
 [ 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12]]):
Sbox[4]:=array(0..3,0..15,[
 [ 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15],
 [13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9],
 [10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4],
 [ 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14]]):
Sbox[5]:=array(0..3,0..15,[
 [ 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9],
 [14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6],
 [ 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14],
 [11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3]]):
Sbox[6]:=array(0..3,0..15,[
 [12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11],
 [10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8],
 [ 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6],
 [ 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13]]):
Sbox[7]:=array(0..3,0..15,[
 [ 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1],
 [13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12,2, 15, 8, 6],
 [ 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2],
 [ 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12]]):
Sbox[8]:=array(0..3,0..15,[
 [13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7],
 [ 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2],
 [ 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8],
 [ 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11]]):
X:=[seq(rd(),i=1..48)];
S:= proc(V48)
local j,k,V,x,y,L,lg;
L:=[]:
 for j from 0 to 7 do printf("%A: ",j);
  V:=V48[6*j+1..6*j+6]: printf("%A -> ",V);
   x:=2*V[1]+V[6]: 
   y:=8*V[2]+4*V[3]+2*V[4]+V[5]: printf("Sbox[%A](%A,%A)=",j,x,y);
  V:=convert(Sbox[j+1][x,y],binary): printf("%A --> ",V);
  V:=convert(convert(V,string),bytes): lg:=nops(V):
  V:=zip((a,b)->a-b,V,[seq(48,i=1..lg)]); printf("%A\n",V);
   if lg<4 then
    for k from 1 to 4-lg do
     V:=[0,op(V)]:
    od:
   fi:
  L:=[op(L),op(V)]:
 od: 
return(L) 
end proc:
Y:=S(X);nops(Y);
f:=proc(X,Y)
end proc:

...As 16 etapas...

#
# Mensagem...
#
M:=[seq(rd(),i=1..64)]; # uma escolha aleatoria...
L:=[]: R:=[]:
for i to 32 do
 L:=[op(L),M[IP[i]]]: R:=[op(R),M[IP[i+32]]]:
od: 
L;R;
for i to 1 do  #### INCOMPLETO...
 A:=L: B:=R: L:=B: 
 R:=[]: T:=[]:
  for j to 48 do 
   T:=[op(T),B[E[j]]]:
  od:
 T1:=[]:
  for j to 48 do
   T1:=[op(T1),T[j]+Ki[i][j] mod 2]:
  od:
# for j to 32 do
#  R:=[op(R),A[j]*f[j]]:
# od:
od: