Crittografia C++ (scuola media)

Da Wikiversità, l'apprendimento libero.
lezione
lezione
Crittografia C++ (scuola media)
Tipo di risorsa Tipo: lezione
Materia di appartenenza Materia: Informatica per la scuola media 3
Avanzamento Avanzamento: lezione completa al 75%

Il progetto ha lo scopo di istruire principalmente i ragazzi delle scuole secondarie di primo grado all'utilizzo del linguaggio C++.

Tramite la programmazione e l'esecuzione di un programma di crittografia, basato sul cifrario di Cesare ed il cifrario a trasposizione numerica, i ragazzi implementeranno la loro conoscenza del codice ed impareranno le basi della crittografia; questo argomento risulta molto attuale e presente nel mondo informatico soprattutto a causa delle recenti modifiche legislative volte ad aumentare la tutela della privacy degli utenti della rete. L'obiettivo principale è di istruire gli utenti all'utilizzo del linguaggio di programmazione C++ attraverso un progetto in grado di aumentare la loro conoscenza delle tecniche di scrittura base.

Crittografia[modifica]

Per "crittografia" si intende quella tecnica che permette di "cifrare" un messaggio rendendolo incomprensibile a tutti tranne che al suo destinatario, il quale possiede la soluzione per decodificarlo. In generale i due processi principali che vengono applicati in crittografia si dividono in "cifratura" e "codifica". La cifratura è un procedimento che, tramite una regola conosciuta, rende non comprensibile un testo; il procedimento inverso è detto codifica e permette di convertire il messaggio in un linguaggio comprensibile grazie alla conoscenza della soluzione.

Tipologie di crittografia utilizzate[modifica]

Cifrario di Cesare[modifica]

Il cifrario di Cesare, chiamato così in onore di Giulio Cesare che lo utilizzava per proteggere i suoi messaggi segreti, è uno dei più antichi metodi di crittografia di cui si abbia traccia storica. È un metodo a sostituzione alfabetica in cui ogni lettera del testo da codificare è sostituita dalla lettera che si trova un certo numero di posizioni dopo nell'alfabeto; la chiave di cifratura, ovvero la quantità di posizioni in cui viene spostata la lettera, è definita dall'utente.

Cesare
Cesare

Cifrario a trasposizione numerica[modifica]

Un cifrario a trasposizione numerica è un metodo di cifratura in cui le lettere vengono convertite in numeri seguendo l'ordine crescente dell'alfabeto, così che il testo cifrato costituisca una variante numerica del testo alfabetico.

trasposizione numerica
trasposizione numerica

Il linguaggio C++[modifica]

In informatica il C++ è un linguaggio di programmazione di alto livello che permette di eseguire operazioni complesse a partire da un codice sorgente composto da poche righe.

Nato nel 1983 dall’ingegno di Bjarne Stroustrup, allora ricercatore presso AT&T, C++ è tra i primi 5 linguaggi più utilizzati al mondo.

I campi di applicazione sono i più svariati: dal gaming alle applicazioni real-time, dai componenti per sistemi operativi ai software di grafica e musica, dalle app per cellulari ai sistemi per supercomputer. Praticamente, C++ è ovunque.

Le variabili[modifica]

Il linguaggio C++ prevede l'utilizzo di variabili, ovvero di valori che possono essere inseriti da tastiera (input) o elaborati dal programma e stampati a video (output). In base alla tipologia di variabile esistono differenti termini utilizzati:

  • int = corrisponde a variabili numeriche intere (negative o positive);
  • float = corrisponde a variabili numeriche non necessariamente decimali, ma che possono avere anche una parte decimale;
  • char = corrisponde a variabili composte da un singolo carattere (che può essere anche speciale);
  • string = corrisponde a variabili alfanumeriche, composte da lettere e numeri. I numeri inseriti non saranno trattati come numeri, ma come testo normale;
  • bool = corrisponde a una variabile che può essere solo vera (1) o falsa (0)

Costrutto selezione If/Else[modifica]

Il costrutto If/Else è un comando utilizzabile per imporre la scelta di una condizione sulla base di due o piu opzioni; alla scelta di una determinata condizione corrisponde una azione univoca.

Ciclo For[modifica]

Il ciclo for è un comando in grado di far ripetere una o più azioni per un numero determinato di volte, definito da una variabile prestabilita.

L'utilizzo di tale strumento permette di non dovere ripetere molteplici volte lo stesso comando nel codice e di determinare quante ripetizioni avverranno prima dell'arresto.

Funzioni di testo[modifica]

Nel linguaggio C++ sono presenti due funzioni di testo, una necessaria a ricevere variabili dall'utente (input) ed una necessaria a stampare a video (output), e quindi proporre all'utente una variabile di qualsiasi tipo.

  • cout<<"testo": è la funzione di output che permette di stampare a video ed imporre al programma di mostrare all'utente una determinata variabile.
#include <iostream> // libreria input output 
using namespace std; // uso dello spazio dei nomi standard (per evitare di mettere std:: prima di ogni comando)
int main()
{
   cout << "Hello World!"<<endl; 

   return 0; // valore di ritorno del programma 
}


C++ base description
C++ base description


  • cin>>variabile: dopo aver definito la tipologia, questa funzione di input permette al programma di ricevere una o più variabili immesse dall'utente.
#include <iostream> // libreria input output 
using namespace std; // uso dello spazio dei nomi standard (per evitare di mettere std:: prima di ogni comando)
int main()
{
   int variabile;
   cout << "Inserisci un valore" <<endl;
   cin >> variabile;
   cout << variabile;

   return 0; // valore di ritorno del programma 
}


C++ base description
C++ base description

L'intestazione iniziale[modifica]

Per permettere ad un programma C++ di funzionare correttamente è necessario includere all'inizio di ogni codice

#include <iostream> // libreria input output 
using namespace std; // uso dello spazio dei nomi standard (per evitare di mettere std:: prima di ogni comando)
int main() // corpo del programma
{
}

Comando Return 0[modifica]

Il comando di return 0 serve per interrompere subito il funzionamento del programma, facendolo terminare. Tecnicamente il comando ha anche altre funzioni, che non verranno approfondite adesso. Basti sapere che questo comando può utilizzare qualsiasi tipo di valore, che sia un numero intero, decimale, un carattere dell'alfabeto, una parola o addirittura una variabile.

Il programma[modifica]

Come nasce l'idea[modifica]

Il programma nasce dalla volontà frequente dei giovani di comunicare in un linguaggio segreto, e protetto, conosciuto soltanto dal mittente e destinatario. La scelta di utilizzare il linguaggio C++ è motivata dalla semplicità e dalla rapidità con cui tale codice permette di creare azioni che risulterebbero altrimenti complicate e molto lunghe.

Obiettivi[modifica]

L'obiettivo principale del programma è, tramite l'utilizzo del linguaggio C++, la codifica di parole con due differenti sistemi di criptaggio. Sono state scelti il cifrario di Cesare e il cifrario a trasposizione numerica perché entrambi molto semplici ed intuitivi, sono infatti basati sulla traslazione dell'alfabeto e della conversione delle lettere in numeri secondo uno schema ben definito.

Analisi del programma[modifica]

  • Definizione delle variabili
int scelta, chiave, i; 
char parola[500];
  • Il programma richiede all'utente il metodo di criptazione
cout<<"Questo programma cripta un testo inserito da tastiera"<<endl;
cout<<"(senza spazi o caratteri non alfabetici, compresi i caratteri con accenti)"<<endl<<endl;
	
cout<<"I tipi di criptaggio che questo programma utilizza sono:"<<endl;
cout<<"	1. Cifrario di Cesare"<<endl;
cout<<"	2. Trasposizione numerica"<<endl<<endl;
	
cout<<"Quale scegli? ";
cin>>scelta;
  • Il programma, tramite un ciclo If/Else, elabora la scelta e continua l'esecuzione con il metodo selezionato
  • Se il metodo selezionato è il "cifrario di Cesare" viene richiesta all'utente la parola da criptare e l'immissione di un valore che rappresenterà la traslazione nell'alfabeto della lettera corrispondente. Successivamente, tramite un Ciclo For, viene stampata a video la parola composta dalle lettere dell'alfabeto secondo la chiave di cifraggio.
if(scelta==1)
{
    cout<<"Scrivi la parola da criptare (tutto in minuscolo): ";
    cin>>parola;

    cout<<"Inserire la chiave per criptare la parola: ";
    cin>>chiave;

    cout<<"La parola criptata e' ... ";
    for(i=0; i<500; i++)
   	{
		if(parola[i]==0)
		{
			return 0;
		}
		parola[i]=parola[i]+chiave;
		if(parola[i]>122)
		{
			parola[i]=parola[i]-26;
		}	
		cout<<parola[i];
    }
}
  • Altrimenti, se viene selezionato il "cifrario a trasposizione numerica" il programma chiederà la parola da criptare.
else if(scelta==2)
{
	cout<<"Scrivi la parola da criptare (tutto in minuscolo): ";
	cin>>parola;
  • In seguito la parola verrà analizzata carattere per carattere tramite un ciclo For ed ogni lettera verrà sostituita dal numero corrispondente.
for(int i=0; i<500; i++)
{
	if(parola[i]=='a')
	{
		cout<<"1";
	}else if(parola[i]=='b')
	{
		cout<<"2";
	}else if(parola[i]=='c')
	{
		cout<<"3";
	}else if(parola[i]=='d')
	{
		cout<<"4";
	}else if(parola[i]=='e')
	{
		cout<<"5";
	}else if(parola[i]=='f')
	{
		cout<<"6";
	}else if(parola[i]=='g')
	{
		cout<<"7";
	}else if(parola[i]=='h')
	{
		cout<<"8";
	}else if(parola[i]=='i')
	{
    	cout<<"9";
	}else if(parola[i]=='j')
	{
		cout<<"10";
	}else if(parola[i]=='k')
	{
		cout<<"11";
	}else if(parola[i]=='l')
	{
		cout<<"12";
	}else if(parola[i]=='m')
	{
		cout<<"13";
	}else if(parola[i]=='n')
	{
		cout<<"14";
	}else if(parola[i]=='o')
	{
		cout<<"15";
	}else if(parola[i]=='p')
	{
		cout<<"16";
	}else if(parola[i]=='q')
	{
		cout<<"17";
	}else if(parola[i]=='r')
	{
		cout<<"18";
	}else if(parola[i]=='s')
	{
		cout<<"19";
	}else if(parola[i]=='t')
	{
		cout<<"20";
	}else if(parola[i]=='u')
	{
		cout<<"21";
	}else if(parola[i]=='v')
	{
		cout<<"22";	
	}else if(parola[i]=='w')
	{
		cout<<"23";
	}else if(parola[i]=='x')
	{
		cout<<"24";
	}else if(parola[i]=='y')
	{
		cout<<"25";
	}else if(parola[i]=='z')
	{
		cout<<"26";
	}else
	{
		i=500;
	}
}
}
  • Nel caso in cui venga selezionato un metodo di criptaggio differente da quelli proposti (1&2) il programma stamperà a video un messaggio di errore
else
{
	cout<<"Opzione non disponibile";
}
  • Il programma termina
return 0;

Programma completo[modifica]

#include <iostream> 

using namespace std;

int main()
{
	int scelta, chiave, i; //definizione variabili
	char parola[500]; //definizione variabili
	
	cout<<"Questo programma cripta un testo inserito da tastiera"<<endl;
	cout<<"(senza spazi o caratteri non alfabetici, compresi i caratteri con accenti)"<<endl<<endl;
	
	cout<<"I tipi di criptaggio che questo programma utilizza sono:"<<endl;
	cout<<"	1. Cifrario di Cesare"<<endl;
	cout<<"	2. Trasposizione numerica"<<endl<<endl;
	
	cout<<"Quale scegli? ";
	cin>>scelta;
	
	if(scelta==1) //ciclo di scelta del sistema di criptaggio (=1 se Cifrario di Cesare, =2 se Cifrario a trasposizione numerica)
	{
		cout<<"Scrivi la parola da criptare (tutto in minuscolo): ";
		cin>>parola;
		
		cout<<"Inserire la chiave per criptare la parola: ";
		cin>>chiave;
		
		cout<<"La parola criptata e' ... ";
		
		for(i=0; i<500; i++) //inizio ciclo for per analisi della parola
		{
			if(parola[i]==0)
			{
				return 0;
			}
			
			parola[i]=parola[i]+chiave;
			
			if(parola[i]>122)
			{
				parola[i]=parola[i]-26;
			}
			
			cout<<parola[i];
		}
	}
	else if(scelta==2) //ciclo di scelta del sistema di criptaggio (=1 se Cifrario di Cesare, =2 se Cifrario a trasposizione numerica)
	{
		cout<<"Scrivi la parola da criptare (tutto in minuscolo): ";
		cin>>parola;
		
		for(int i=0; i<500; i++) //ciclo for per conversione delle parole in numeri
		{
			if(parola[i]=='a')
			{
				cout<<"1";
			}else if(parola[i]=='b')
			{
				cout<<"2";
			}else if(parola[i]=='c')
			{
				cout<<"3";
			}else if(parola[i]=='d')
			{
				cout<<"4";
			}else if(parola[i]=='e')
			{
				cout<<"5";
			}else if(parola[i]=='f')
			{
				cout<<"6";
			}else if(parola[i]=='g')
			{
				cout<<"7";
			}else if(parola[i]=='h')
			{
				cout<<"8";
			}else if(parola[i]=='i')
			{
				cout<<"9";
			}else if(parola[i]=='j')
			{
				cout<<"10";
			}else if(parola[i]=='k')
			{
				cout<<"11";
			}else if(parola[i]=='l')
			{
				cout<<"12";
			}else if(parola[i]=='m')
			{
				cout<<"13";
			}else if(parola[i]=='n')
			{
				cout<<"14";
			}else if(parola[i]=='o')
			{
				cout<<"15";
			}else if(parola[i]=='p')
			{
				cout<<"16";
			}else if(parola[i]=='q')
			{
				cout<<"17";
			}else if(parola[i]=='r')
			{
				cout<<"18";
			}else if(parola[i]=='s')
			{
				cout<<"19";
			}else if(parola[i]=='t')
			{
				cout<<"20";
			}else if(parola[i]=='u')
			{
				cout<<"21";
			}else if(parola[i]=='v')
			{
				cout<<"22";	
			}else if(parola[i]=='w')
			{
				cout<<"23";
			}else if(parola[i]=='x')
			{
				cout<<"24";
			}else if(parola[i]=='y')
			{
				cout<<"25";
			}else if(parola[i]=='z')
			{
				cout<<"26";
			}else
			{
				i=500;
			}
		}
	}
	else
	{
		cout<<"Opzione non disponibile";
	}
	
	return 0; //codice di arresto
}

Esempio pratico[modifica]

Cifrario di Cesare[modifica]

Cifrario a trasposizione numerica[modifica]

Vedi anche[modifica]

Collegamenti esterni[modifica]