dimanche 17 mai 2015

[projet] Chiffre de Vigenère

Bonjour à tous,

J'ai lu quelques articles sur la cryptologie, et le chiffre de Vigenère me semble être un bon début

pour s'initier dans la crypto'. J'ai donc pour projet d'implémenter cette manière de crypté en C. Je ne sais pas si c'est

le meilleur langage pour faire cela, je sais seulement que je suis capable de le faire en C.

Voici comment le programme devrait se comporté :

Chiffre de Vigenère :

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* inUpperCase(const char chaine[]) {

    char  alphabet[26]  = {'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',0};
    char  alphabet0[26] = {'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',0};
    char    cache[100] = {0};
    int              i = 0;
    int              j = 0;
    int          trouve = 0;

    for(i=0;i<strlen(chaine);i++){
        for(j=0;i<strlen(alphabet) && !trouve;j++) {
            if(chaine[i] == alphabet[j])
            {
                cache[i] = alphabet0[j];
                trouve = 1;
            }
            else
            {
                cache[i] = chaine[i];
            }
        }
        trouve = 0;
    }
    return cache;
}

int main()
{
    char  alphabet0[26]  = {'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',0};
    char  alphabet1[26]  = {'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','A',0};
    char  alphabet2[26]  = {'C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B',0};
    char  alphabet3[26]  = {'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C',0};
    char  alphabet4[26]  = {'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D',0};
    char  alphabet5[26]  = {'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E',0};
    char  alphabet6[26]  = {'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F',0};
    char  alphabet7[26]  = {'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G',0};
    char  alphabet8[26]  = {'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H',0};
    char  alphabet9[26]  = {'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I',0};
    char  alphabet10[26] = {'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J',0};
    char  alphabet11[26] = {'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K',0};
    char  alphabet12[26] = {'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L',0};
    char  alphabet13[26] = {'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M',0};
    char  alphabet14[26] = {'O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N',0};
    char  alphabet15[26] = {'P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',0};
    char  alphabet16[26] = {'Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',0};
    char  alphabet17[26] = {'R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',0};
    char  alphabet18[26] = {'S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R',0};
    char  alphabet19[26] = {'T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S',0};
    char  alphabet20[26] = {'U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',0};
    char  alphabet21[26] = {'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U',0};
    char  alphabet22[26] = {'W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V',0};
    char  alphabet23[26] = {'X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W',0};
    char  alphabet24[26] = {'Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X',0};
    char  alphabet25[26] = {'Z','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',0};

    printf("%s",inUpperCase("rouge"));


    return 0;
}

Le code n'est surement pas optimisé cependant c'est une bonne base pour commencé.

Le principe du chiffre de Vigenère est le suivant :

Vous avez 26 alphabets différents sachant qu'elles suivent une même logique, chaque alphabet est décalée de une lettre par rapport à

la précédente, c'est tout se qu'il faudra retenir.

Il faudra ensuite choisir un mot clé, secret. Prenons par exemple le mot "salut".

Il faudra ensuite choisir le message à chiffré, prenons "Bonjour".

Voici le fonctionnement du chiffre de Vigenère :

________________________
SALUTSALUT
Bonjour

SALUTSALUTSALUTSALUTSALUT
Bonjour comment vas tu
_________________________

Nous écrivons le mot secret autant de fois que nécessaire au-dessus du texte à crypté jusqu'à se qu'il n'y est plus de lettre du message à

crypté sans une autre au-dessus. Ici nous devrons donc écrire deux fois "salut" pour "couvrir" le message "bonjour".

Ensuite, il faudra aller chercher dans le Carré de Vigenère (nom que l'on donne à la représentation des 26 alphabets) le chiffrement à

appliqué à la lettre, la première lettre à chiffrée est "b", et la lettre du mot secret qui lui correspond est S, nous allons donc dans le

carré de Vigenère à l'alphabet qui commencera par S, vous pouvez trouver un carré de Vigenère facilement sur Google.

Lorsque vous avez repéré cet alphabet, prenez le "b" de l'alphabet en clair( l'alphabet non décalé) et regarder à quoi il correspond.

Notre "b" correspond à un "T". Faisons de même pour la deuxième lettre "o", la lettre du mot secret qui lui correspond est "A", ici vous

l'aurez compris la lettre ne changera pas. Passons maintenant à la troisième lettre "n", la lettre du mot secret lui correspondant est "L",

On va donc chercher l'alphabet qui commencera par "L" dans le carré de Vigenère, lorsqu'on a trouvé cet alphabet, prenez le "n" de

l'alphabet en clair, et regardez à quoi il correspond dans l'alphabet commençant par "L", le "n" correspond à "Y" dans l'alphabet

qui commence par "L".

Au final on obtiendra le message crypté suivant : TOYDHMR pour le message : "bonjour"

Le code que j'ai joint au poste n'est qu'une partie du code final, il permet juste de répondre aux deux questions qui me préoccupées le plus,

Faut-il générer les tables ou directement les inclures dans le programme ?

Comment doit-on traiter le cas où l'utilisateur n'entre pas un mot clé en majuscule ?

Il faudra ajouter à ce code une interface pour l'utilisateur, la génération du message crypté et vos propres améliorations !


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/1ProRJ8
via IFTTT

Aucun commentaire:

Enregistrer un commentaire