/*
� This program is free software; you can redistribute it and/or modify
� it under the terms of the GNU General Public License as published by
� the Free Software Foundation; either version 2 of the License, or
� (at your option) any later version.
This program is distributed in the hope that it will be useful,
� but WITHOUT ANY WARRANTY; without even the implied warranty of
� MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. �See the
� GNU General Public License for more details.
� You should have received a copy of the GNU General Public License
� along with this program; if not, write to the Free Software
� Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA �02111-1307 �USA
*/
package org.andrearaso.redvernam;
import java.lang.String;
/* ----------------------------------------------------------------*/
/* VERNAM: l'algoritmo di cifratura a caratteri */
/* ----------------------------------------------------------------*/
/* Questa classe racchiude i metodi statici Encrypt e Decript. */
/* Come ? noto lalgoritmo funziona cos?:Convertito il testo in */
/* array di caratteri TestoCifrato[i]=TestoInChiaro[i]+Chiave[i] . */
/* Equivalentemente: TestoInChiaro[i]=TestoCifrato[i]-Chjave[i]. */
/* Per i che va dal primo all'ultimo carattere del testo. */
/* Esiste una variante dell'algoritmo i cui la chiave pu? essere */
/* pi? corta del testo e ripetuta per tutto il testo , ma per */
/* quanto pratico questo algoritmo e'insicuro se sottoposto */
/* all'analisi delle frequenze */
class Vernam
{
public Vernam () {} //Costruttore vuoto
/*FUNZIONE DI CIFRATURA*/
public static String encrypt (String chiaro, String chiave)
{//prende in input il testo in chiaro e la chiave e ritorna il testo cifrato
int i=0; // indice dei cicli
char aC[],bC[]; // aC: testo in chiaro in caratteri; bC: chiave in caratteri;
aC= chiaro.toCharArray(); // converto il testo in chiaro in input in array di char aC
bC= chiave.toCharArray(); // converto la chiave in input in array di char aC
int n=chiaro.length(); // trovo la lunghezza del testo in chiaro = n;
int m=chiave.length(); // trovo la lunghezza del testo cifrato = m;
int a[]=new int [n]; // a conterr? gli interi corrispondenti ai caratteri di aC (Caratteri in chiaro)
int b[]=new int [m]; // b conterr? gli interi corrispondenti ai caratteri di bC (Caratteri chiave)
int c[]=new int [n]; // c conterr? gli interi corrispondenti ai caratteri del testo cifrato
/* --------------------------------------- */
/* ALGORITMO DI CIFRATURA */
/* --------------------------------------- */
while (i<n) //PER TUTTA LA LUNGHEZZA DEL TESTO IN CHIARO:
{
a[i]= (int) aC[i];
/* converto l'i-esimo carattere del testo in chiaro in numero e lo metto in a[i]*/
b[i]= (int) bC[i];
/* converto l'i-esimo carattere della chiave in numero e lo metto in b[i]*/
c[i]=a[i]+b[i];
/* Sommo i caratteri precedentemente ottenuti e li metto in c[i]*/
i++;
}
i=0;
String cifrato=new String(""); // stringa che conterr? il testo cifrato
while (i<n) // Per tutta la lunghezza di c[n] (n = lunghezza testo in chiaro = lunghezza testo cifrato)
{
if(c[i]>=255) c[i]=255%c[i];
/* Se l'lelemento i-esimo ? > di 255 calcola il modulo cos? dar? semre un numero corisspondente a un carattere*/
cifrato=cifrato+(char)c[i];
/*Trasforma i'lintero c[i] in carattere e concatenalo nella stringa da ritornare */
i++;
}
return cifrato; //Ritorna il messaggio cifrato
}
/*FUNZIONE DI DECIFRATURA*/
public static String decrypt (String chiave, String cifrato)
{//prende in input la chiave e ritorna e il testo cifrato e ritorna il testo in chiaro
char bC[], cC[]; //cC:testo cifrato in carattri; bC:chiave in caratteri;
bC=chiave.toCharArray(); //Converto lla chiave in array di caratteri
cC=cifrato.toCharArray(); //Convero il testo cifrato in array di char
int m=cifrato.length(); //metto in m la lunghezza del testo cifrato
int b[]=new int[m]; //creo tre array di caratteri di lunghezza n: b[] per la chiave
int c[]=new int[m]; //c[] per il testo cifrato
int d[]=new int[m]; // d[] per il testo decifrato
int i=0; //indice dei cicli
/* --------------------------------------- */
/* ALGORITMO DI DECIFRATURA*/
/* --------------------------------------- */
while (i<m) //PER TUTTA LA LUNGHEZZA DEL TESTO CIFRATO
{
c[i]= (int) cC[i];
/*converto l'iesimo carattere cifrato in intero e lo metto in c[i]*/
b[i]= (int) bC[i];
/*converto l'i-esimo crarattere della chiave e lo metto in b[i]*/
d[i]=c[i]-b[i];
/*in d[i] metto la sottrazione dei due numeri appena ricavati (cifrato[i]-chiave[i])*/
i++;
}
String decifrato=new String(""); //stringa che conter? l'elemento decifrato
i=0;
while (i<m) // per la lunghezza del testo cifrato
{
if (d[i]<0) d[i]=d[i]+255;
/*Se l'i-esimo elemento della sottrazione ? negativo vi ? stato effettuato l'operazione di MOD in fase di cifratura, quindi aggiungi 255 */
decifrato=decifrato+(char)d[i]; //trasforma l'intero in un carattere e concatenalo nella stringa
i++;
}
return decifrato; //ritorna il messaggio decifrato
}
}
// Andrea Raso