Domanda Macchina enigma

Stato
Discussione chiusa ad ulteriori risposte.
La macchina Enigma é fantastica, sviluppata inizialmente come prodotto commerciale da una società tedesca, durante la Seconda Guerra Mondiale é stata modificata e venduta ai nazisti e usata da quest'ultimi per scambiarsi messaggi.

Si la storia la so :asd: il funzionamento non mi è ancora molto chiaro, a parte che se non sbaglio é basato sul cifrario di Vigenére, correggetemi se sbaglio eh.

Comunque non ho mai provato, ma penso ti basti studiare il suo funzionamento, ed implementare tutto, anche le parti fisiche magari semplificandone, tipo la macchina usava due tastiere, su una digitavi il messaggio in chiaro/cifrato e sull' altra si illuminavano le lettere, le annotavi e alla fine ottenevi il messaggio cifrato/ in chiaro; bene potresti fare che tu digiti una lettera e lui ti da il corrispetivo.

Insomma semplifica, inoltre volevi un punto d'inizio, parti dall' implementare le due tastiere.
Inviato dal mio Ascend G510 utilizzando Tapatalk
 
Ma la macchina enigma non era un concetto astratto? :\

- - - Updated - - -

Per la risoluzione problemi

Quella di cui parli è la Macchina di Turing

- - - Updated - - -

Comunque non ho mai provato, ma penso ti basti studiare il suo funzionamento, ed implementare tutto, anche le parti fisiche magari semplificandone, tipo la macchina usava due tastiere, su una digitavi il messaggio in chiaro/cifrato e sull' altra si illuminavano le lettere, le annotavi e alla fine ottenevi il messaggio cifrato/ in chiaro; bene potresti fare che tu digiti una lettera e lui ti da il corrispetivo.

Insomma semplifica, inoltre volevi un punto d'inizio, parti dall' implementare le due tastiere.

Il funzionamento dei rotori (che dovrebbero essere 3) non mi sembra molto semplice da attuare :nono:
 
Ultima modifica:
Ma la macchina enigma non era un concetto astratto? :\

- - - Updated - - -

Per la risoluzione problemi

Mi sa che ti stai confondendo con la macchina di turing.


edit:
Per i rotori non è troppo difficile, sostanzialmente ogni rotore applica un cifrario a sostituzione che può essere banalmente implementato da un semplice array, dove l'indice n rappresenta l'(n-1)-esima lettera dell'alfabeto e il valore contenuto nella cella dell'array con questo indice rappresenta la lettera risultante dopo la sostituzione.

Per esempio, un array tale che la A è mappata sulla C, la B sulla Z e la C sulla F inizierà così:
int rotore[]={2,25,5,...}


Il problema è che i rotori ruotano di una lettera ogni tanto, ad esempio dopo una rotazione il rotore di prima mappa la A alla Z, la B alla F, la C a quello su cui prima veniva mappata la D etc. etc. fino alla Z che è mappata sulla C.

In C mettiamo di dover codificare una A attraverso 4 rotori, basta fare una cosa del genere:

rotore4[(step4+rotore3[(step3+rotore2[(step2+rotore1[(step1+codice_lettera)%26])%26])%26])%26]

Dove gli step sono controllati esternamente dal ciclo principale che gestisce il tutto, ad esempio se vuoi che il primo rotore ruoti ad ogni lettera e il secondo ogni 10 lettere metterai nel ciclo principale una condizione che li aumenta sempre e solo quando il counter del ciclo è congruo a 0 modulo 10, rispettivamente.

Il %26 assicura che le coordinate restino sempre nel range giusto.

Ovviamente ci sono metodi molto più eleganti ed efficenti di fare la stessa cosa, soprattutto evitare il modulo 26, ma questo è quello più breve
 
  • Mi piace
Reazioni: TheSeeker
Macchina di Turing: quella che risolve gli algoritmi
Macchina Enigma: quella che i crucchi usavano nella seconda guerra mondiale per cifrare i messaggi
 
oggi finalmente ho cominciato e sono arrivato a questo
Codice:
using namespace std;
#define MAX 10000


int main()
{
char a[MAX];
int len;
int i;
int x;
int z;
int rotore[]={4,10,12,5,11,6,3,16,21,25,13,19,14,22,24,7,23,20,18,15,0,8,1,17,2,9};
int rotore2[]={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,0};
   cout << "Inserire frase:" << endl;
   cin.getline(a,MAX);
 for (x = 0 , i = 1 , len=strlen(a) , z = 1; x < len ; x++ , i++) 
 {
   printf("%c", a[x] + rotore[i] + rotore2[z]);
   if (i == 26)
   {
       i = 0;
       z++;
   }
 }
 cout <<endl;
 system("pause");
}
ma ho un problema se la lettera equivale o e maggiore della h vado a finire tra i caratteri ascii come faccio a farlo ricominciare dalla a,
per esempio
z + 1 = {
io invece vorrei che fosse uguale ad a come faccio.

- - - Updated - - -
 
Codice:
z=(z+1)%26

Quindi ad esempio se z è 25 e aggiungi 1 diventa 26, che modulo 26 è 0, quindi z diventa 0.

se z è 24 ed aggiungi 5 diventa 29, che modulo 26 è 3, quindi z diventa 3.
 
Non riesco a far printare solo lettere dell'alfabeto aiuto
Ciao io sto tentando rifare la macchina enigma in C ! Questo è quello che ho fatto in questi giorni ma ora mi trovo bloccato! non sono sicuro su come cifro il messaggio ?
Codice:
// alpha test 0.1 per shark

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

#define MAX 10000

int main()
{
    char a[MAX], key[MAX], scambio2[1], scambio21[1], scambio1[1], scambio11[1];
    int len, i, cr = 0, x, y, z, w, lungA, ac1 = -1, ac2 = -1, ac3 = -1, cont = 0, copyrot, scelta;
    int rotore1[27];
    int rotore2[27];
    int rotore3[27];
    menu:
    printf("\t\t##################ENIGMA##################\n\n");
    printf("1 Cripta\n2 Decripta\n");
    scanf("%d", &scelta);

    switch (scelta)
        {
         case 1 :

          Cleanup1 :  ;

          printf("\n\t\t##################ENIGMA##################\n");

          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;

          }



          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]);
              
             }
            printf("\n\n");
            system("pause");
            goto menu;
            break;

            case 2:

            Cleanup2 : ;
                printf("Inserire la chiave del giorno per i rotori : ");

                scanf("%s", &key);

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

                cr = 0;
                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 */
                }


                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;

                }

                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;

                }



                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);

                printf("\ndebug: %s\n", a);
                // implementare decriptazione

                for ()
                {

                    //decriptazione
                   

                }

                // implementare funzione di scambio dei caratteri

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

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

                printf("%s", a);

            break;

            default:
                printf("ERRORE");
            break;

        }
  return 0;

}
 
Ciao io sto tentando rifare la macchina enigma in C ! Questo è quello che ho fatto in questi giorni ma ora mi trovo bloccato! non sono sicuro su come cifro il messaggio ?
Codice:
// alpha test 0.1 per shark

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

#define MAX 10000

int main()
{
    char a[MAX], key[MAX], scambio2[1], scambio21[1], scambio1[1], scambio11[1];
    int len, i, cr = 0, x, y, z, w, lungA, ac1 = -1, ac2 = -1, ac3 = -1, cont = 0, copyrot, scelta;
    int rotore1[27];
    int rotore2[27];
    int rotore3[27];
    menu:
    printf("\t\t##################ENIGMA##################\n\n");
    printf("1 Cripta\n2 Decripta\n");
    scanf("%d", &scelta);

    switch (scelta)
        {
         case 1 :

          Cleanup1 :  ;

          printf("\n\t\t##################ENIGMA##################\n");

          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;

          }



          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]);
             
             }
            printf("\n\n");
            system("pause");
            goto menu;
            break;

            case 2:

            Cleanup2 : ;
                printf("Inserire la chiave del giorno per i rotori : ");

                scanf("%s", &key);

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

                cr = 0;
                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 */
                }


                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;

                }

                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;

                }



                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);

                printf("\ndebug: %s\n", a);
                // implementare decriptazione

                for ()
                {

                    //decriptazione
                  

                }

                // implementare funzione di scambio dei caratteri

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

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

                printf("%s", a);

            break;

            default:
                printf("ERRORE");
            break;

        }
  return 0;

}

Necropost.
@Kolo93
 
@ZIOBlack
Sarebbe corretto aprire una nuova discussione spiegando nel dettaglio il tuo problema, al limite potresti completare linkando la discussione ( in questo caso quella in cui stiamo parlando ) come riferimento.

@Loncore512
Grazie per avermi avvertito ma la prossima volta clicca sul tasto "segnala"

Intanto chiudo :figurati:
 
Stato
Discussione chiusa ad ulteriori risposte.