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