edutecnica

Esercizio 4        

Scrivere un programma che implementi l'algoritmo di cifratura per trasposizione per codificare una stringa di caratteri.


La cifratura per trasposizione prevede l'utilizzo di vettori e tabelle.
Supponiamo di voler cifrare un testo in chiaro usando come parola chiave la parola "vince".
il testo sarà il seguente:
"la cavalleria deve attaccare sulla sinistra"

Si crea una tabella con un numero di colonne uguale al numero di caratteri della parola chiave e poi si posiziona sulla prima riga la parola chiave. i caratteri del messaggio vengono distribuiti sulle righe sottostanti, sotto ogni lettera della parola chiave.

v
i
n
c
e
 
 
 
 
 
l
a
c
a
v
a
l
l
e
r
i
a
d
e
v
e
a
t
t
a
c
c
a
r
e
s
u
l
l
a
s
i
n
i
s
t
r
a

Il messaggio cifrato viene generato prendendo le colonne della precedente tabella seguendo l'ordine alfabetico delle lettere della parola chiave, cioč, prima la 'c' poi la 'e', la 'i', la 'n' e la 'v', ottenendo:

c
e
i
n
v
aeetrli
vrvaeas
alaacuir
cldtalna
laiecsst

aeetrlivrvaeasalaacuircldtalnalaiecsst

Questa sarà la frase codificata dal programma.

class cifrario{
public static void main (String args []) {
int i,j;
char x;
String s = new String("la cavalleria deve attaccare sulla sinistra");
String ch = new String("vince");
int lg=ch.length();
char A[]=ch.toCharArray() ;
for(i=0;i < lg;i++) System.out.print(A[i]+" ");
System.out.println();
//creo la matrice di trasposizione
int r;
if(s.length()%lg==0)r=s.length()/lg;
else r=s.length()/lg+1;
System.out.println();
char B[][] = new char[r][lg];
s=s.replace(" ", "");//elimino gli spazi dalla stringa da criptare
x=0;
for(i=0;i < B.length;i++)
for(j=0;j < B[0].length;j++){
if(x < s.length()){
B[i][j]=s.charAt(x); x++; }else B[i][j]=' ';
}
//stampo la matrice di trasposizione
for(i=0;i < B.length;i++){
for(j=0;j < B[0].length;j++) System.out.print(B[i][j]+" " );
System.out.println();
}//fine for i

//ordino la chiave in modo alfabetico
for(i=0;i < lg-1;i++)
for(j=i;j < lg;j++) if(A[i] > A[j]){
x=A[i];A[i]=A[j];A[j]=x;
} //e la stampo
for(i=0;i < lg;i++) System.out.print(A[i]+" ");

//creo il vettore che contiene l'ordine di estrazione delle colonne
int T[] = new int[lg];
for(i=0;i < lg;i++) T[i]=ch.indexOf(A[i]);
System.out.println(); //e lo stampo per verificare l'esattezza
for(i=0;i < lg;i++)System.out.print(T[i]+" ");
System.out.println();
//concatenazione della stringa crittata
s="";//reimposto s a stringa nulla
for(j=0;j < lg;j++)
for(i=0;i < r;i++) if(B[i][T[j]]!=' ')
s+=B[i][T[j]];
//stampo la stringa crittata
System.out.print(s);
}//fine main
}// fine classe


Viene usato in questi caso il vettore aisiliario di char A[ ] e il vettore di interi int T[ ] per
contenere l'ordine di estrazione delle colonne.
Per compito lasciamo il problema dello sviluppo che esegua il processo opposto (basato sulla stessa chiave) cioč quello di decodifica.