/********************************************************* * Crittosistema di Cesare * Languasco & Zaccagnini, Introduzione alla Crittografia, Hoepli. * Capitolo 5.3 pag. 91-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.") } {CESARECIFRA(messaggio, chiave="", codifica="") = local(l,l1,i,j,k,C,M); l=length(chiave); if (l > 1, error("La chiave del metodo di Cesare e' formata da UNA SOLA lettera")); l1=length(messaggio); 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, C= da_lettera_a_numero(Strchr(M[j])) + da_lettera_a_numero(chiave); if (C % 30 == 0, C = 30, C = C % 30); codifica=concat(codifica,alfabeto[C]); ); print("Il messaggio codificato e`:"); print(codifica); return(codifica); } {CESAREDECIFRA(codifica, chiave="", messaggio="") = local(l,l1,i,j,k,M,w,C); l=length(chiave); if (l > 1, error("La chiave del metodo di Cesare e' formata da UNA SOLA lettera")); l1=length(codifica); C=Vecsmall(codifica); for(j=1,l1, M=da_lettera_a_numero(Strchr(C[j])) - da_lettera_a_numero(chiave); if (M % 30 == 0, M = 30, M = M % 30); messaggio=concat(messaggio,alfabeto[M]) ); print("Il messaggio decodificato e`:"); print(messaggio); return(messaggio); }