Bien le bonjour à tous !

Je viens vous demander de l'aide car je rencontre actuellement un problème lors de l’exécution de mon petit programme. Pour résumer il me permet de chiffrer un message avec le chiffrage ADFGVX.

Voici un petit morceau de code (soyez indulgent j'ai commencé le C il n'y a que 2 semaines ) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
int cryptage()
{
  char phraseDecrypter[101];
  char *phraseCrypter, remplacement;
  char **tableauCryptage, **tableauCryptageBis;
  int longueurCle = 0;
  int *cleCryptage, i, j, longueurChaine, n, saisieTemporaire, validationSaisie, x, y, z;
  int coordX, coordY;
  char algo [6] = {'A','D','F','G','V','X'};
  char algoCryptage[6][6] = {{'c','1','o','f','w','j'},
			     {'y','m','t','5','b','4'},
			     {'i','7','a','2','8','s'},
			     {'p','3','0','q','h','x'},
			     {'k','e','u','l','6','d'},
			     {'v','r','g','z','n','9'}};
 
  affichageCartouche();
  affichageCryptage();
 
  // Saisie par l'utilisateur de la phrase decrypter
  scanf("%s", &phraseDecrypter);
 
  // Vider la mémoire après la saisie utilisateur
  viderBuffer();
 
  affichageCartouche();
 
  // Boucle permettant de demander et vérifier la longueur de la clé (comprise entre 3 et 9)
  while (longueurCle < 3 || longueurCle > 9)
  {
    affichageCartouche();
    printf("La phrase a crypter est : %s\n\n", phraseDecrypter);
    printf("Quelle est la longueur n de la clé de cryptage, tel que : 2 < n < 10 : ");
    scanf("%d", &longueurCle);
 
    viderBuffer();
  }
 
  // Création d'un tableau dynamique pour contenir les nombres de la clé
  cleCryptage = (int*)calloc(longueurCle, sizeof(int));
 
  // Première boucle imbriquée parcourant cleCryptage afin de la remplir
  for (i = 0; i < longueurCle; i++)
  {
    // Deuxième boucle permettant de verifier que la saisie est comprise entre 2 et longueurCle
    while (cleCryptage[i] < 1 || cleCryptage[i] > longueurCle)
    {      
      // Affichage personnalisé
      if (i == 0)
      {
	printf("Saisie du 1er chiffre de la clé de cryptage : ");
      }
      else
      {
	printf("Saisie du %deme chiffre de la clé de cryptage : ", i+1);
      }
 
      // Saisie du chiffre
      scanf("%d", &saisieTemporaire);
      viderBuffer();
 
      // Troisième boucle vérifiant si la saisie n'existe pas deja dans la clé
      for (j = 0; j < longueurCle; j++)
      {
	if (saisieTemporaire == cleCryptage[j])
	{
	  validationSaisie = 1;
	}
      }
 
      // Si la saisie n'apparait pas dans la liste on peux ajouter le chiffre
      if(validationSaisie == 1)
      {
	cleCryptage[i] = 0;
      }
      else
      {
	cleCryptage[i] = saisieTemporaire;
      }
 
      // On re-initialise la variable validationSaisie à 0
      validationSaisie = 0;
    }
  }
 
  // Recapitulation
  affichageCartouche();
  printf("La phrase a crypter est : %s\n", phraseDecrypter);
  affichageCle(cleCryptage, longueurCle);
 
  // Calcul de la taille de la phrase Crypter
  longueurChaine = strlen(phraseDecrypter);
  longueurChaine = longueurChaine * 2;
 
  // Dans le cas où on ajoute des X pour completer la ligne
  while (longueurChaine % longueurCle != 0)
  {
    longueurChaine = longueurChaine+1;
  }
 
  // Creation dynamique d'une liste de caractaires contenant les coordonnées des lettres de la phrase
  phraseCrypter = (char *)calloc(longueurChaine, sizeof(char));
 
  // Remplissage de la précédante liste en fonction des coordonnées
  for (i = 0; i < longueurChaine; i++)
  {
    z = i;
    for (x = 0; x < 6; x++)
    {
      for (y = 0; y < 6; y++)
      {
	if (algoCryptage[x][y] == phraseDecrypter[i])
	{
	  while (phraseCrypter[z] != 0) // permet de vérifier qu'on ecrase pas une donnée deja mise
	  {
	    z++;
	  }
	  phraseCrypter[z] = algo[x];
	  phraseCrypter[z+1] = algo[y];
	}
      }
    }
  }
 
  // On parcours la phrase crypter à partir du dernier caractaire renseigné,le reste vaut forcecment 
  for (i = strlen(phraseDecrypter) * 2; i < longueurChaine; i++)
  {
    // On met X
    phraseCrypter[i] = algo[5];
  }
 
  // Création dynamique d'un tableau à 2 dimension qui va traiter les coordonnées avant permutation
  coordX = longueurCle;
  coordY = longueurChaine / longueurCle;
 
  tableauCryptage = (char **)calloc(coordX, sizeof(char));
  for (i = 0; i < coordX; i ++)
  {
    tableauCryptage[i] = (char *)calloc(coordY, sizeof(char));
  }
 
  z = 0;
  for (y = 0; y < coordY; y++)
  {
    for (x = 0; x < coordX; x++)
    {
      tableauCryptage[x][y] = phraseCrypter[z];  // C'est cette ligne qui me met erreur de segmentation
      z++;
    }
  }
Lorsque je fait lon test avec une clé de permutation de longueur 4 ca marche, mais lorsque la longueur de la clé dépasse le nombre de ligne du tableau dynamique ... problème.

Ce que j'essaye de faire :

- ma chaine "attaque" devient FFDFDFFFGGVFVD Ok !
- Avec la longueur de la clé de permutation saisie par l'utilisateur je fabrique un tableau dynamique de taille longueur de la clé Ok !
- le nombre de ligne du tableau précèdent va correspondre à (la longueur de la phrase de l'utilisateur * 2) / longueur de la clé OK (cette valeur est forcément un entier car si % longueurCle != 0 j'incrémente d'1)
- Test sur une clé de longueur 5 / 6 / 7 ... Non Ok !


Voila, voila ... si quelqu'un a une petite idée ... je suis preneur ! S'il il manque des infos n'hésitez pas à me demander !!!


Bonne journée !

Agrakan