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: |
> |