Domanda Macchina enigma in C dubbi sul algoritmo che cripta il messaggio!

Stato
Discussione chiusa ad ulteriori risposte.

ZIOBlack

Utente Silver
27 Dicembre 2014
253
19
42
97
Come consigliatomi da un moderatore apro una nuova discussione riguardante la macchina enigma !
Di recente ho iniziato il progetto scrivendoli in C e ritengo di essere a buon punto ma ho alcuni dubbi, uno di questi riguarda la funzione di riflessione di uno dei rotori che non mi è molto chiara e quindi chiedo se qualcuno può rispiegarmela gentilmente !
Posto anche un pezzo di codice dove genero i rotori che spero sia coretto:
Codice:
printf("Inserire la chiave del giorno per i rotori : ");

          scanf("%s", &key);

            printf("\n%s\n\n", key);

           int aus = (int)key[cr];
           aus = aus - 97;
           cr++;                                     // convertire in ascii
          /* variabili ausiliarie */

          printf("%d\n", aus);

          for(cont = 0;cont < 26;cont++)
          {
              if(aus > 26)
              {
                  aus = 0;
              }

              aus = aus + 1;
              ac1++;
              rotore1[ac1] = aus; /* creare funzione per salvare il rototre */
          }


          int aus2 = (int) key[cr];
          aus2 = aus2 - 97;
          cr++;
          /* variabili ausiliarie */

          printf("%d\n", aus2);

          for (cont = 0;cont < 26;cont++)
          {
              if (aus2 > 26)
              {
                  aus2 = 0;
              }


              aus2 = aus2 + 1;
              ac2++;
              rotore2[ac2] = aus2;

          }

          int aus3 = (int) key[cr];
          aus3 = aus3 - 97;
          /* variabili ausiliarie */

          printf("%d\n", aus3);

          for (cont = 0;cont < 26;cont++)
          {
              if (aus3 > 26)
              {
                  aus3 = 0;
              }


              aus3 = aus3 + 1;
              ac3++;
              rotore3[ac3] = aus3;

          }

Qui invece è la funzione che cripta il messaggio ( senza il rotore riflesso ):

Codice:
printf("Inserire il primo scambio:\n"); //ingresso scambi
          scanf("%s%s", &scambio1[1], &scambio11[1]);

          printf("\ndebug %c%c\n", scambio1[1], scambio11[1]);

          printf("Inserire il secondo scambio:\n");
          scanf("%s%s", &scambio2[1], &scambio21[1]);


          printf("\ndebug %c%c\n", scambio2[1], scambio21[1]);

                printf("Inserire la frase da criptare:");
                scanf("%s", &a);
                // implementare funzione di scambio dei caratteri

            /* funzione di scambio1 */
               for(lungA=0;lungA<strlen(a);lungA++)
            {
                if (a[lungA] == scambio1[1])a[lungA] = scambio11[1];
            }

            /* funzione di scambio2 */
             for(lungA=0;lungA<strlen(a);lungA++)
            {
                if (a[lungA] == scambio2[1])a[lungA] = scambio21[1];
            }
           
printf("\ndebug: %s\n", a);

            /* funzione di criptazione */
            for (lungA = 0, i = 0, z = 0, y = 0; lungA < strlen(a); lungA++)
             {

                copyrot = rotore1[i]; i++;
                a[lungA] = copyrot + 97;

                if (i == 26)copyrot = rotore2[z]; z++; a[lungA] = copyrot + 97; i = 0;

                if (z == 26)copyrot = rotore3[y]; y++; a[lungA] = copyrot + 97; z = 0;

                if (y == 26)y = 0;

               printf("%c", a[lungA]);
              
             }

Attendo risposte da chi più esperto :)
 
Come consigliatomi da un moderatore apro una nuova discussione riguardante la macchina enigma !
Di recente ho iniziato il progetto scrivendoli in C e ritengo di essere a buon punto ma ho alcuni dubbi, uno di questi riguarda la funzione di riflessione di uno dei rotori che non mi è molto chiara e quindi chiedo se qualcuno può rispiegarmela gentilmente !
Posto anche un pezzo di codice dove genero i rotori che spero sia coretto:
Codice:
printf("Inserire la chiave del giorno per i rotori : ");

          scanf("%s", &key);

            printf("\n%s\n\n", key);

           int aus = (int)key[cr];
           aus = aus - 97;
           cr++;                                     // convertire in ascii
          /* variabili ausiliarie */

          printf("%d\n", aus);

          for(cont = 0;cont < 26;cont++)
          {
              if(aus > 26)
              {
                  aus = 0;
              }

              aus = aus + 1;
              ac1++;
              rotore1[ac1] = aus; /* creare funzione per salvare il rototre */
          }


          int aus2 = (int) key[cr];
          aus2 = aus2 - 97;
          cr++;
          /* variabili ausiliarie */

          printf("%d\n", aus2);

          for (cont = 0;cont < 26;cont++)
          {
              if (aus2 > 26)
              {
                  aus2 = 0;
              }


              aus2 = aus2 + 1;
              ac2++;
              rotore2[ac2] = aus2;

          }

          int aus3 = (int) key[cr];
          aus3 = aus3 - 97;
          /* variabili ausiliarie */

          printf("%d\n", aus3);

          for (cont = 0;cont < 26;cont++)
          {
              if (aus3 > 26)
              {
                  aus3 = 0;
              }


              aus3 = aus3 + 1;
              ac3++;
              rotore3[ac3] = aus3;

          }

Qui invece è la funzione che cripta il messaggio ( senza il rotore riflesso ):

Codice:
printf("Inserire il primo scambio:\n"); //ingresso scambi
          scanf("%s%s", &scambio1[1], &scambio11[1]);

          printf("\ndebug %c%c\n", scambio1[1], scambio11[1]);

          printf("Inserire il secondo scambio:\n");
          scanf("%s%s", &scambio2[1], &scambio21[1]);


          printf("\ndebug %c%c\n", scambio2[1], scambio21[1]);

                printf("Inserire la frase da criptare:");
                scanf("%s", &a);
                // implementare funzione di scambio dei caratteri

            /* funzione di scambio1 */
               for(lungA=0;lungA<strlen(a);lungA++)
            {
                if (a[lungA] == scambio1[1])a[lungA] = scambio11[1];
            }

            /* funzione di scambio2 */
             for(lungA=0;lungA<strlen(a);lungA++)
            {
                if (a[lungA] == scambio2[1])a[lungA] = scambio21[1];
            }
          
printf("\ndebug: %s\n", a);

            /* funzione di criptazione */
            for (lungA = 0, i = 0, z = 0, y = 0; lungA < strlen(a); lungA++)
             {

                copyrot = rotore1[i]; i++;
                a[lungA] = copyrot + 97;

                if (i == 26)copyrot = rotore2[z]; z++; a[lungA] = copyrot + 97; i = 0;

                if (z == 26)copyrot = rotore3[y]; y++; a[lungA] = copyrot + 97; z = 0;

                if (y == 26)y = 0;

               printf("%c", a[lungA]);
             
             }

Attendo risposte da chi più esperto :)
La prima funzione è ok.

Poche non è presente la dichiarazione è l'inizializzazione non ho capito una cosa. Ma gli array scambioX Li hai definiti come array di stringhe o come array di caratteri?
 
Array di caratteri ! Dopo una discussione con un amico e la rilettura dei documenti storici sulla macchina enigma siamo arrivati alla conclusione che i rotori erano 4 fissi di cui ogni giorno venivano scelti in modo casuali 3 ! E la sostituzione nel disco era casuale , quindi la creazione dei rotori creata da me è inutile :( !

Inviato dal mio zioBlack-Device utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.