/********************************************************* * Crittosistema di Vigenere * Languasco & Zaccagnini, Introduzione alla Crittografia, Hoepli. * Capitolo 5.3 pag. 92 *********************************************************/ {alfabeto=["A","B","C","D","E","F","G","H","I","J","K", "L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",";",".","'"," "]; } {da_lettera_a_numero(lettera)=local(j); for(j=1,30, if(alfabeto[j]==lettera,return(j))); error("input non valido.") } {VIGENERECIFRA(messaggio, chiave="", codifica="") = local(l,l1,i,j,k,C,w,M); l=length(chiave); l1=length(messaggio); w=Vecsmall(chiave); M=Vecsmall(messaggio); /* Vecsmall trasforma una stringa in un vettore di numeri ASCII corrispondenti Per utilizzare il nostro alfabeto dovremo tradurre poi ogni componente di questo vettore di nuovo in una lettera singola (comando Strchr) e determinarne la posizione nel nostro alfabeto */ for(j=1,l1, if ((j % l) == 0, k=l, k= j % l); C= da_lettera_a_numero(Strchr(M[j])) + da_lettera_a_numero(Strchr(w[k])); if (C % 30 == 0, C = 30, C = C % 30); codifica=concat(codifica,alfabeto[C]); ); print("Il messaggio codificato e`:"); print(codifica); return(codifica); } {VIGENEREDECIFRA(codifica, chiave="", messaggio="") = local(l,l1,i,j,k,M,w,C); l=length(chiave); l1=length(codifica); w=Vecsmall(chiave); C=Vecsmall(codifica); for(j=1,l1, if ((j % l) == 0, k=l, k= j % l); M=da_lettera_a_numero(Strchr(C[j])) - da_lettera_a_numero(Strchr(w[k])); if (M % 30 == 0, M = 30, M = M % 30); messaggio=concat(messaggio,alfabeto[M]) ); print("Il messaggio decodificato e`:"); print(messaggio); return(messaggio); } /* ESEMPIO V? VIGENERECIFRA("QUESTO METODO CRITTOGRAFICO NON E' SICURO","FREQUENZA") Il messaggio codificato e`: WIJFKTNIFZCIBUHBEUZCLEVKW'PFBTAUJMZTOUZEF %2 = "WIJFKTNIFZCIBUHBEUZCLEVKW'PFBTAUJMZTOUZEF" ? VIGENEREDECIFRA("WIJFKTNIFZCIBUHBEUZCLEVKW'PFBTAUJMZTOUZEF","FREQUENZA")? Il messaggio decodificato e`: QUESTO METODO CRITTOGRAFICO NON E' SICURO %3 = "QUESTO METODO CRITTOGRAFICO NON E' SICURO" */