The Best Geek Forum

Contest Programmazione Estate Tebigeek 2016!

In questa sezione verranno pubblicati Contest ai quali potranno partecipare tutti gli Utenti. Ogni contest ha le proprie regole.

Moderatore: Moderatore in prova

Salve a tutti,
questo è il primo codice che pubblico, in onore dei nuovi cambiamenti estivi 2016, sperando che sia a tutti di grande aiuto soprattutto il nuovo Codebox!
Immagine
Come da titolo, presento un Contest basato sulla crittografia da principiante. Infatti non è altro che un semplicissimo simulatore della macchina cifrante elettrica Enigma, utilizzata dalle forze armate tedesche durante la seconda guerra mondiale.

Chiaramente il sistema crittografico usato all'interno di questo simulatore è ideologicamente simile, ma praticamente diverso dalla realtà. E' basato sul progetto reperito su questo sito che, presentando molti difetti, è stato sostanzialmente modificato con un funzionamento del tutto differente (basti provare entrambi i codici per verificare in modo rapido).

L'idea di questo Contest è proporvi questo banalissimo codice di libera licenza e di farne uscire qualcosa di nuovo.

Il codice che vi sto per presentare, non avrà difetti rilevanti e proprio per questo sarà semplice da riadattare in un qualsiasi altro contesto che non sia necessariamente un simulatore enigma di livello avanzato.

Lo scopo del contest è chiaramente sviluppare un programma , basato sul sistema crittografico di enigma, semplice o complesso che sia, che dia vita ad un progetto molto più articolato.
Ad esempio, si potrebbe sviluppare un form di login basato su una combinazione di 9 cifre che a loro volta modifichino la decifratura di Username e Password successivamente inseriti.

Ovviamente questo è solo un esempio! Ci sono N programmi possibili da poter sviluppare.

Come e cosa si vince?

Questo Contest ha come obbiettivo lo scambio culturale nell'ambito della programmazione software, quindi ,come ovvio potrebbe sembrare, vincerà il programma più interessante (non per forza il più complesso!). I programmi verranno esaminati a fondo e verranno valutati da una giuria imparziale.
Il vincitore avrà il pregio di poter pubblicare il suo programma ufficializzato da Tebigeek.com ed inoltre provvederemo ad una sponsorizzazione corposa nei motori di ricerca e nei social in modo da evidenziare molto la creazione del concorrente e quindi la persona stessa! Diamo questa opportunità all'utente che ci dimostrerà di avere creatività.
Per vincere, bisogna anche seguire il regolamento sottostante.

Le regole del contest sono molto semplici:
  • Essere iscritti al Forum di Tebigeek.com .
  • Essere Fan della nostra Pagina Facebbok.
  • Aver messo "Like" al post inerente al Contest che sarà pubblicato sulla Fan Page ed averlo condiviso sul proprio profilo.
  • Non copiare codici degli altri concorrenti.
  • Il codice deve compilare!
  • Attenersi al Regolamento generale di Tebigeek.com.
Il Contest parte da oggi e si concluderà Martedì 9/08/2016 .
Unica pecca è che il contest non avrà validità se non includerà almeno 10 partecipanti (eventuali multiaccount verranno identificati ed esclusi).
Si partecipa seguendo i punti del regolamento del contest e chiaramente pubblicando il codice utilizzando il Codebox (a questo link trovate le novità del Forum e la spiegazione).

Codice: Seleziona tutto


/**
* @author Giuseppe La Gualano - http://www.tebigeek.com
* @license This software is free - http://www.gnu.org/licenses/gpl.html
*/

#include <iostream>
#include <stdlib.h>
#include <cstdlib> // PER RAND()
#include <ctime> // PER TIME(NULL)
using namespace std;

int main()
{
srand((unsigned)time(NULL)); // AZZERO IL RANDOM (SEED)
char lettera;
int input,opzione,x,x1,x2,x3,x4,x5,x6,x7,x8,x9;

//PRESENTAZIONE PROGRAMMA
cout<<endl<<" -------------------------";
cout<<endl<<" | SIMULATORE ENIGMA C++ |";
cout<<endl<<" -------------------------\n";
cout<<"\nBenvenuto nel simulatore di Enigma"<<endl;

cout<<endl<<"\nInserisci la chiave per l'algoritmo crittografico. (Premi 1 per random o 2 per input manuale): ";
cin>>input;

if(input==1){

x1 = (rand()%100+20);
x2 = (rand()%100+20);
x3 = (rand()%100+20);
x4 = (rand()%100+20);
x5 = (rand()%100+20);
x6 = (rand()%100+20);
x7 = (rand()%100+20);
x8 = (rand()%100+20);
x9 = (rand()%100+20);

}

else if(input==2){
cout<<endl<<"Primo numero: ";
cin>>x1;

cout<<endl<<"Secondo numero: ";
cin>>x2;

cout<<endl<<"Terzo numero: ";
cin>>x3;

cout<<endl<<"Quarto numero: ";
cin>>x4;

cout<<endl<<"Quinto numero: ";
cin>>x5;

cout<<endl<<"Sesto numero: ";
cin>>x6;

cout<<endl<<"Settimo numero: ";
cin>>x7;

cout<<endl<<"Ottavo numero: ";
cin>>x8;

cout<<endl<<"Nono numero: ";
cin>>x9;
}

int rotore1[3] = {x1,x2,x3};
int rotore2[3] = {x4,x5,x6}; // IPOTIZZIAMO VETTORI DI DIMENSIONE 3 PER ENIGMA
int rotore3[3] = {x7,x8,x9};

cout<<"\nrotore 1: "<<x1<<" "<<x2<<" "<<x3; // RIASSUNTO DELLA CHIAVE
cout<<"\nrotore 2: "<<x4<<" "<<x5<<" "<<x6;
cout<<"\nrotore 3: "<<x7<<" "<<x8<<" "<<x9;

//SELETTORE OPZIONE

do{
int i=0,z=0; //RESET DEL CONTATORE PER NON DOVER RIAVVIARE IL PROGRAMMA
cout<<endl<<"-----------------------------------\n";
cout<<endl<<"[1] * Decripta"
<<endl<<"[2] * Cripta"
<<endl<<"[3] * Esci\n"<<endl;
cout<<"Al tuo comando: ";
cin>>opzione; //ACQUISISCO IL COMANDO SCELTO E PASSO ALLO SWITCH
cout<<endl<<"-----------------------------------\n";

// SELETTORE DEL CASO DA OPZIONE SCELTA SOPRA

switch (opzione)
{
case 1:
{while(z!=1){ // IMPOSTO IL CICLO WHILE PER NON DOVER RIPETERE IL MENU'
cout<<"\nInserisci una lettera (ALT+987 per tornare al menu' principale): "; //LETTERA DA DECRIPTARE Û (U maiuscola con accento circonflesso)
cin>>lettera;

if (lettera==(-37)){ // ESCO DAL CICLO WHILE PER INCREMENTO DELLA VARIABILE AD 1 E TORNO AL MENU'
z++;
break; //TERMINO IL CICLO WHILE QUANDO Z VA AD 1 E PASSO AL CASE GIUNGENDO AL BREAK DI FONDO
}
else
cout<<"\nIl carattere che hai inserito e' : \""<<int(lettera)<<"\" in ASCII"<<endl; //CORRISPONDENZA IN ASCII

// FUNZIONAMENTO MATEMATICO CONGRUO ALLA TABELLA ASCII ESTESA //

x=lettera-rotore1[i]; // ROTORI CHE PARTONO CON i=0 E SI RESETTANO TORNANDO AL MENU'
if (x < 32)
x = 126-(32-x);

else if (x > 126)
x = (x-126)+32;
x=x-rotore2[i];

if (x < 32)
x = 126-(32-x);

else if (x > 126)
x = (x-126)+32;
x=x-rotore3[i];

if (x < 32)
x = 126-(32-x);

else if(x > 126)
x = (x-126)+32;
cout<<"\nEnigma ha generato il numero: "<<x<<endl; //GENERAZIONE MATEMATICA DELL'ALGORITMO

cout<<"\nIl carattere che hai inserito adesso e' : \""<<char(x)<<"\" in ASCII"<<endl; //LETTERA DECRIPTATA
i++; //INCREMENTO DELLA VARIABILE "i" CHE CONTA I TRE ROTORI
cout<<endl<<"-----------------------------------\n";
}
break; //QUANDO TERMINA IL CICLO WHILE PER LA VARIABILE Z AD 1, ALLORA SI ATTIVA IL BREAK E TORNO AL MENU'
}


case 2:
{while(z!=1){ // IMPOSTO IL CICLO WHILE PER NON DOVER RIPETERE IL MENU'
cout<<"\nInserisci una lettera (ALT+987 per tornare al menu' principale): "; //LETTERA DA DECRIPTARE
cin>>lettera;

if (lettera==(-37)){ // ESCO DAL CICLO WHILE PER INCREMENTO DELLA VARIABILE AD 1 E TORNO AL MENU'
z++;
break; //TERMINO IL CICLO WHILE QUANDO Z VA AD 1 E PASSO AL CASE GIUNGENDO AL BREAK DI FONDO
}
else
cout<<"\nIl carattere che hai inserito e' : \""<<int(lettera)<<"\" in ASCII"<<endl; //CORRISPONDENZA IN ASCII

// FUNZIONAMENTO MATEMATICO CONGRUO ALLA TABELLA ASCII ESTESA //

x=lettera+rotore1[i]; // ROTORI CHE PARTONO CON i=0 E SI RESETTANO TORNANDO AL MENU'
if (x < 32)
x = 126-(32-x);

else if (x > 126)
x = (x-126)+32;
x=x+rotore2[i];

if (x < 32)
x = 126-(32-x);

else if (x > 126)
x = (x-126)+32;
x=x+rotore3[i];

if (x < 32)
x = 126-(32-x);

else if(x > 126)
x = (x-126)+32;
cout<<"\nEnigma ha generato il numero: "<<x<<endl; //GENERAZIONE MATEMATICA DELL'ALGORITMO

cout<<"\nIl carattere che hai inserito adesso e' : \""<<char(x)<<"\" in ASCII"<<endl; //NUOVA LETTERA CRIPTATA
i++; //INCREMENTO DELLA VARIABILE "i" CHE CONTA I TRE ROTORI
cout<<endl<<"-----------------------------------\n";
}
break; //QUANDO TERMINA IL CICLO WHILE PER LA VARIABILE Z AD 1, ALLORA SI ATTIVA IL BREAK E TORNO AL MENU'
}

}

}

while (opzione !=3); //TERMINAZIONE DEL PROGRAMMA
return 0;
}
Per questione di ordine e di spazio, consiglio vivamente di scaricare il file Enigma.cpp in modo da visualizzarlo in modo corretto!

Detto ciò, eventuali domande sul contest possono essere fatte in privato (sotto questo topic andranno solo i vostri codici).

Non mi resta altro da dire, in bocca al lupo e che vinca il migliore!
Ciao Giuseppe! Ho preso come esempio il tuo codice di enigma per partecipare al contest e ho creato un semplissimo generatore di password numeriche. I comandi sono simili a quelli del tuo enigma!

Codice: Seleziona tutto

#include <iostream>
#include <stdlib.h>
#include <cstdlib> // PER RAND()
#include <ctime> // PER TIME(NULL)
using namespace std;

int main()
{
srand((unsigned)time(NULL));
int input,opzione,lunghezza,i,temp,password,password1;


//PRESENTAZIONE PROGRAMMA
cout<<endl<<"------------------------------------";
cout<<endl<<"| GENERATORE DI PASSWORD NUMERICHE |";
cout<<endl<<"------------------------------------\n";
cout<<"\n Genera una password!"<<endl;

cout<<endl<<"\n (Premi 1 per password random o 2 per input manuale): ";
cin>>input;

if(input==1){
password= (rand()%1000000);
cout<<"La password generata e': "<<password<<endl;
}
else if(input==2){
cout<<endl<<"Inserisci una password numerica: ";
cin>>password;
cout<<endl<<"Reinserisci la password: ";
cin>>password1;
if(password == password1){
cout<<endl<<"La password inserita e': "<<password<<endl;
}
else if(password =! password1){
cout<<"Le password non corrispondono, riprova"<<endl;
}

}

int z=0;
i=0; //RESET DEL CONTATORE PER NON DOVER RIAVVIARE IL PROGRAMMA
cout<<endl<<"-----------------------------------\n";
cout<<endl<<"[1] * Cambia password"
<<endl<<"[2] * Rimuovi password"
<<endl<<"[3] * Esci\n"<<endl;
cout<<"Al tuo comando: ";
cin>>opzione; //ACQUISISCO IL COMANDO SCELTO E PASSO ALLO SWITCH
cout<<endl<<"-----------------------------------\n";
// SELETTORE DEL CASO DA OPZIONE SCELTA SOPRA

switch (opzione)
{
case 1:
int pass_temp;
cout<<endl<<"Conferma la password attuale: ";
cin>>pass_temp;
if(pass_temp == password){
cout<<endl<<"Inserisci una nuova password: ";
cin>>password;
cout<<"La nuova password e': "<<password;
}
else{
cout<<"Password non coincide con quella attuale,riprovare"<<endl;
break;
}

case 2:
string conferma;
cout<<endl<<"Sei sicuro di rimuovere la password? (si o no) ";
cin>>conferma;
if(conferma == "si"){
password = 0;
cout<<endl<<"Password azzerata";
}
else if(conferma == "no"){
cout<<endl<<"La password e' rimasta ancora: "<<password;
}

}
}