Classe pour crypter et décrypter un string selon la méthode de César.
Les fonctions ne gèrent que les strings composés de lettres et d'espaces (pas de chiffres ni de caractères spéciaux).
Le principe de ce cryptage est simple :
Chaque lettre du mot à crypter est déplacée de n places suivant (n peut être négatif ou positif).
Par exemple, avec une clé de 3 (n = 3) :
je suis ici --> [9 5 18 20 8 18 8 3 8] --> [12 8 21 23 11 21 11 6 11] --> mh vxlv lfl
(La lettre a = 0 et z = 25).
Source / Exemple :
/*
* Cryptage de César
* [http://lwh.free.fr/pages/algo/crypto/cesar.htm]
*/
public class Cesar {
static char[] alphabet1 = {'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'};
public static String crypt(int n, String sIn) {
/*
* On convertit le string en un tableau de char
* On crée un tableau Out de même taille
* On prend chaque lettre du string
* On prend sa position actuelle dans l'alphabet
* On calcule sa nouvelle position en fonction de n
* On va chercher dans l'alphabet la lettre correspondant à la nouvelle position
* On assigne cette lettre dans le tableau de sortie au mm emplacement
* On transforme le tableau Out en un string
*/
char[] charSIn = sIn.toCharArray();
char[] charSOut = new char[charSIn.length];
int pos1, pos2;
for(int i = 0; i < charSIn.length; i++) {
pos1 = posChar(charSIn[i], alphabet1);
pos2 = newPos(pos1, n);
if(pos2 == -1) charSOut[i] = ' '; // si -1, c'est que ce n'est pas une lettre, on met un espace à la place
else charSOut[i] = alphabet1[pos2];
}
return new String(charSOut); // on fait un string avec le tableau de char
}
public static String decrypt(int n, String sIn) {
/*
* La marche a suivre est la meme que pour le crypt sauf qu'on prend un n' = -n;
*/
char[] charSIn = sIn.toCharArray();
char[] charSOut = new char[charSIn.length];
int pos1, pos2;
for(int i = 0; i < charSIn.length; i++) {
pos1 = posChar(charSIn[i], alphabet1);
pos2 = newPos(pos1, -n);
if(pos2 == -1) charSOut[i] = ' '; // si -1, c'est que ce n'est pas une lettre, on met un espace à la place
else charSOut[i] = alphabet1[pos2];
}
return new String(charSOut); // on fait un string avec le tableau de char
}
// Renvoie la position du caractere dans le tableau
// -1 si il n'est pas dans le tableau
private static int posChar(char c, char[] tab) {
for(int i = 0; i < tab.length; i++) {
if(tab[i] == c) return i;
} return -1;
}
// Donne la nouvelle position dans l'alphabet en fonction de n
private static int newPos(int pos,int n) {
int pos2 = pos;
if(pos <= -1) { // -1 signifie que le caractere n'a pas été trouvé dans l'alphabet (caractere spécial, chiffre, espace, etc.)
pos2 = -1;
} else {
int i = 0;
while(i < abs(n)) {
if(n < 0) {
if(pos2 - 1 == -1) pos2 = 25;
else pos2--;
} else {
if(pos2 + 1 >= 25) pos2 = 0;
else pos2++;
}
i++;
}
}
return pos2;
}
// Valeur absolue de a
public static int abs(int a) {
if(a >= 0) return a;
else return -a;
}
public static void main(String[] args) {
String t = "test de crypt";
System.out.println(crypt(3,t));
}
}
Conclusion :
Je suppose qu'il y a d'autres (meilleures) façons d'implémenter ces fonctions de cryptage. Voici celle que j'ai faite rapidement.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.