Partage
  • Partager sur Facebook
  • Partager sur Twitter

Crypter des entiers

Sujet résolu
    16 septembre 2020 à 10:51:19

    Bonjour,

    J'essaye de crypter et de décrypter des nombres entiers entre 0 et 9 en modifiant leur valeur avec un décalage de 3 : par exemple 1 donnerait 4, 3 donnerait 6, vous voyez l'idée.

    J'ai un code qui fonctionne :

    // Ce bout de code récupère un char (str), le convertit en // int et exécute le 'chiffrement'
    while (str[k] != '\0') {
      	int nombre;
        if (str[k] >= '0' && str[k]<= '9') {
        	nombre = atoi(str);
        	nombre = nombre + 3;
        	if(nombre==10){nombre=0;}
        	if(nombre==11){nombre=1;}
        	if(nombre==12){nombre=2;}
        	printf("\nnombre : %d",nombre);
        	str[k] = nombre + '0';
        }
        k++;
      }
    // Ce bout de code décrypte
    while (str[k] != '\0') {
      	int nombre;
    	    if (str[k] >= '0' && str[k]<= '9') {
    	    	nombre = atoi(str);
    	    	nombre = nombre - 3;
    	    	if(nombre==-1){nombre=9;}
    	    	if(nombre==-2){nombre=8;}
    	    	if(nombre==-3){nombre=7;}
    	    	printf("\nnombre : %d",nombre);
    	    	str[k] = nombre + '0';
    	    }
        k++;
        }

    Le problème c'est que ça marche que pour les entiers entre 0 et 9, pas au-delà. J'aimerais par exemple chiffrer 12 en 45 (1+3,2+3), comment dois-je procéder ?


    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2020 à 11:06:50

      Regarde du coté de l'opérateur modulo pour eviter tout tes if.

      Pour ta question, il suffit de traiter chaque caracteres separement et de combiner les caracteres obtenus.

      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2020 à 13:00:57

        Bonjour ! Pour chiffrer de même un nombre ayant plusieurs chiffres, il suffit de saisir une chaîne de caractères et d'appliquer l'algorithme caractère par caractère (on peut tout à fait ajouter +3 à un caractère ; si c'est un chiffre, ça donnera bien le chiffre +3 attendu (*)). À la fin, pour transformer la chaîne en entier, on peut utiliser sscanf.

        ----

        (*) Par contre, en agissant sur les caractères, on ne pourra plus utiliser le modulo.

        -
        Edité par robun 16 septembre 2020 à 13:04:45

        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2020 à 13:26:43

          Le problème, c'est que ça ne prend pas en compte les différents entiers : par exemple, si j'entres 10, je veux avoir comme résultat 43 (1+3,0+3), 10 c'est en fait deux nombres : 1 et 0.
          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2020 à 13:28:31

            Je me suis mal expliqué ?

            Dans la chaîne "10", tu as '1' et '0' (et '\0').

            Une boucle parcourt la chaîne : '1' est transformé en '4', '0' est transformé en '3' (et '\0' provoque la fin du parcours). (C'était aussi l'idée de thetui.)

            Après la boucle, on transforme la chaîne en entier avec 'sscanf' : "43" devient 43. C'est bien ça, le but ?

            -
            Edité par robun 16 septembre 2020 à 13:30:02

            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2020 à 13:51:01

              Et pour 89, ça donne quoi ?
              • Partager sur Facebook
              • Partager sur Twitter
                16 septembre 2020 à 13:59:32

                C'est effectivement ce que je recherche robun, je n'avais songer à le faire comme ça.

                Ben 89 ça donnera 12 (8+3,9+2), à la seconde où un entier est supérieur à 9, il revient vers 0, ainsi 89 donnera 12, comme 193 donnera 426 (1+3,9+3,3+3).

                EDIT : je n'y arrives toujours pas : j'essayes de cibler des éléments de la chaîne de caractères mais j'en arrives toujours à des résultats erronés.

                -
                Edité par ReunanBeauvois 16 septembre 2020 à 14:22:15

                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2020 à 14:19:29

                  Pour un char :

                      char x = '0';
                      x = (((x-'0')+3)%10)+'0';

                  A toi de le faire pour un tableau de char

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 septembre 2020 à 15:02:16

                    J'ai quelque chose :

                    char x[100] = "10";
                    	for(int i=0;i<100;i++)
                    	{
                    		x[i] = (((x[i]-'0')+3)%10)+'0';
                    	}
                    	printf("\nx = %s",x);

                    Mais le résultat est 43+++++++++++++++++++++++++++++++++++++++++++++++++++d.

                    Comment supprimer tout ces + et le d à la fin ?

                    EDIT : en déclarant char x[] = "10"; j'ai comme résultat : 43+d .

                    EDIT 2 : hum... Apparemment j'ai résolu le problème :

                    char x[] = "148";
                    for(int i=0;i<100;i++)
                    	{
                    		x[i] = (((x[i]-'0')+3)%10)+'0';
                    		if(x[i] == '+' || x[i] == 'd')
                    		{
                    			strcpy(&x[i],"");
                    		}
                    	}
                    	printf("\nx = %s",x);

                    J'ai un dernier petit problème : lorsque j'utilise scanf, j'ai des résultats erronés (scanf("%[^\n]",x);)


                    -
                    Edité par ReunanBeauvois 16 septembre 2020 à 15:19:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2020 à 15:17:24

                      Tu as deux caractères dans ta chaîne de caractère, il ne faut donc traiter seulement les deux caractères.

                      Pour info tu peux utiliser strlen pour savoir combien tu as de caractères dans une chaîne de caractères.

                      Tu peux aussi arrêter le traitement au caractère de fin de chaîne '\0' (ce caractère doit rester tel quel dans ta chaîne modifié) !

                      -
                      Edité par rouloude 16 septembre 2020 à 15:19:58

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 septembre 2020 à 15:22:31

                            char x[] = "10";
                            int i = 0;
                            while(x[i]!='\0')
                            {
                                x[i] = (((x[i]-'0')+3)%10)+'0';
                            
                            	i++;
                            }
                            printf("\nx = %s",x);
                        
                        Chez moi ça sa marche.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 septembre 2020 à 15:25:11

                          La solution avec une fonction :

                          #include <stdio.h>
                          
                          void code(char *pstr, unsigned int key)
                          {
                              while(*pstr)
                              {
                                 *pstr = ((*pstr+key-'0')%10)+'0';
                                 pstr++;
                              }
                          }
                          
                          int main(void)
                          {
                              char str[] = "1234567890";
                              code(str, 3);
                              puts(str);
                          
                              return 0;
                          }



                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 septembre 2020 à 15:37:13

                            Et avec scanf("%[^\n]",x) ? Je souhaite modifier ainsi des nombres saisis par l'utilisateur.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 septembre 2020 à 15:55:42

                              #include <stdio.h>
                              
                              void code(char *pstr, unsigned int key)
                              {
                                  while(*pstr)
                                  {
                                     *pstr = ((*pstr+key-'0')%10)+'0';
                                     pstr++;
                                  }
                              }
                              
                              int main(void)
                              {
                                  char str[100];
                              
                                  scanf("%[^\n]",str);
                              
                                  code(str, 3);
                                  puts(str);
                              
                                  return 0;
                              }
                              

                              Va falloir réviser tes cours !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 septembre 2020 à 16:03:56

                                Au passage, c'est important : http://chiffrer.info

                                • Partager sur Facebook
                                • Partager sur Twitter

                                git is great because Linus did it, mercurial is better because he didn't.

                                  16 septembre 2020 à 16:10:26

                                  Rouloude, je sais utiliser scanf mais en effet il faut mieux que j'apprennes à l'utiliser pour toutes les formes de variables.

                                  Markand, c'est vrai que je fais un peu la confusion entre crypter et chiffrer, donc merci.

                                  Dans tous les cas, mon problème principal est réglé, donc merci à tous.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 septembre 2020 à 16:11:31

                                    ReunanBeauvois a écrit:

                                    Rouloude, je sais utiliser scanf 

                                    Pourquoi la question alors ?

                                    PS : http://www.academie-francaise.fr/crypter

                                    -
                                    Edité par rouloude 16 septembre 2020 à 16:16:46

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 septembre 2020 à 23:11:42

                                      C'est pour les différentes formes de scanf (pour les différents types de variables : %d pour int, %f pour les floats, %c pour les char, %s pour les strings, %u pour les unsigned), je ne les connais pas toutes.

                                      Connaître à 100% tout un langage de programmation est impossible, à moins de ne faire que ça 24h/7j mais je doute que ce soit à la portée du commun des mortels (ça ne l'est pas en ce qui me concerne).

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Crypter des entiers

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown