Cryptage selon la méthode de césar

Soyez le premier à donner votre avis sur cette source.

Snippet vu 28 286 fois - Téléchargée 16 fois

Contenu du snippet

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.

A voir également

Ajouter un commentaire

Commentaires

cs_phlyper
Messages postés
8
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
21 janvier 2016
-
Salut,

il y a une petite erreur dans le programme:
si on test sur la dernier lettre 'z':

public static void main(String[] args)
{
String s = crypt(2, "zzz");
System.out.println(s);
System.out.println(decrypt(2, s));
}

le resultat est :
java Cesar
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 27
at Cesar.crypt(Cesar.java:33)
at Cesar.main(Cesar.java:104)
pyo656
Messages postés
34
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 février 2010
-
J'ai corrigé, c'était une petite erreur dans la condition "if(pos2 + 1 == 25)" qui devient "if(pos2 + 1 >= 25)".
cs_phlyper
Messages postés
8
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
21 janvier 2016
-
merci :D
Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5 -
Salut,
Tu es interessé par la cryptologie ?
Sinon je te propose une idée de truc à faire dans le même genre : chiffrement ("cryptage") de Vigenère. C'est un peu plus difficile mais également très éducatif.

Cordialement, Bacterius !
pyo656
Messages postés
34
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 février 2010
-
Pourquoi pas Bacterius ;)

Je note ta proposition !

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.