Cifrari di….Cesare e Vigenere

Cesare

In crittografia il cifrario di Cesare è uno dei più antichi algortmi crittografici di cui si abbia traccia storica. È un cifrario a sostituzione monoalfabetica in cui ogni lettera del testo in chiaro è sostituita nel testo cifrato dalla lettera che si trova un certo numero di posizioni dopo nell’alfabeto. Questi tipi di cifrari sono detti anche cifrari a sostituzione o cifrari a scorrimento a causa del loro modo di operare: la sostituzione avviene lettera per lettera, scorrendo il testo dall’inizio alla fine.

esempio in c++

#include <stdio.h>
#include <string.h>
void cesare (char s,int salto)
{
char alfabeto[21]={‘a’,’b’, ‘c’, ‘d’ ,’e’ ,’f’ ,’g’ ,’h’ ,’i’ ,’l’ ,’m’ ,’n’, ‘o’, ‘p’ ,’q’, ‘r’, ‘s’ ,’t’ ,’u’, ‘v’ ,’z’} ;
int i;
for(i=0;i<21;i++)
{
if(s==alfabeto[i])
{
printf (“%c”,alfabeto[i+salto]);
break;
}
}
}
int main()

{
char cript[100];
int S,lung,i;
printf(“Inserisci la parola da criptare > “);
scanf(“%­s”,cript);
S=rand()%21; //S è il salto che dovrà eseguire nella criptazione
lung=strlen(cript);
for (i=0;i<lung;i++)
{
cesare(cript[i],S);
}
return 0;
}

 

Vigenere

Il cifrario di Vigenere è un metodo per crittografare caratteri. Consiste nel far valere come salto la somma dei numeri dei caratteri presenti nella parola da crittografare. Di conseguenza ogni carattere avrà un salto diverso.

Le funzioni

L’uso di funzioni permette di strutturare il programma in modo modulare, sfruttando tutte le potenzialità fornite dalla programmazione strutturata fornite dal C++.

Una funzione è un blocco di istruzioni con un nome che viene eseguito in

ogni punto del programma in cui viene richiamata la funzione usando il nome.

Essa si dichiara nel modo seguente….

Tipo restituito NomeFunzione ( Argomento1, Argomento2 , …)

{Istruzioni;

   return valoreRestituito;

}

dove:
· Tipo restituito è il tipo del valore ritornato dalla funzione.

  • NomeFunzione è il nome con cui possiamo richiamare la funzione.
  • Argomento (possiamo indicarne quanti ne vogliamo, anche nessuno). Un argomento è costituito da un nome di tipo seguito da un  identificatore (ad esempio int x ), esattamente come in una dichiarazione di variabile; ed infatti, all’interno della funzione, un argomento si comporta come una variabile (locale). Gli argomenti permettono di passare dei parametri quando la funzione viene richiamata. I parametri sono separati da virgole.
  • Istruzioni è il corpo della funzione: un blocco di istruzioni racchiuse tra parentesi graffe {}

Esempio di funzione:

// esempio dell uso di una funzione
#include <iostream>

      int z;          //variabile globale
                   // parametri formali
int somma (int a, int b)
{
  int r; //variabile locale
  r=a+b;
  return r;
}
int main ()
{
z = somma (5,3); //chiamata alla funzione con il

                  // passaggio di  parametri attuali
  cout << “Il risultato e’ ” << z;
  return 0;
}

Cicli

Teorema di Jacopini: Qualunque algoritmo può essere risolto con una delle tre strutture di controllo fondamentali: Sequenza, selezione, iterazione. Cicli di ripetizione Premessa: Contatore (C) Variabile numerica intera che si incrementa di una unità ad ogni iterazione. C=C+1 oppure C++. E’ buona norma prima di usare un contatore inizializzarlo a zero Sommatore (S) Variabile numerica che viene incrementata di una certa quantità ad ogni iterazione. S=S+X E’ buona norma prima di usare un sommatore inizializzarlo a zero Cosa intendiamo per ciclo nell’ambito della programmazione? Essenzialmente ci riferiamo ad una serie di istruzioni che possono essere espresse in una forma sintetica attraverso una iterazione perchè risultano in qualche modo simili. Ad esempio immaginiamo di voler calcolare la media delle età di 20 persone. L’istruzione elementare di riferimento è sempre la stessa, quella che consente di caricare 20 età e di accumulare le età in una variabile di tipo sommatore. Situazioni simili a quella descritta (ovvero con necessità di ripetere istruzioni simili) sono molto frequenti e si può dire che i cicli siano utilizzati praticamente in ogni tipo di programma. Il vantaggio, utilizzando un ciclo, è di non dover scrivere le istruzione tante volte quante è necessario ripeterle ma, come vedremo meglio in seguito, una volta soltanto, specificando il numero di ripetizioni. In alcuni casi il numero delle ripetizioni viene specificato in forma esplicita (parliamo in questo caso di un tipo particolare di ciclo detto ciclo for) o in forma implicita (è il caso dei cicli di tipo while o do-while). Esaminiamo ora più nel dettaglio le caratteristiche dei vari tipi di cicli appena menzionati nel linguaggio C++, cominciando dal ciclo for. Il ciclo for (o ciclo con contatore) Come già accennato, nel caso del ciclo for specifichiamo in modo esplicito per quante volte l’istruzione deve essere ripetuta usando un contatore. Esercizio determinazione della media delle età di 20 persone.

….. …..
int e, sommae=0;
float med;
int main()
{
for(int i=0;i<20;i++)
{
cout<<”inserisci e=”;
cin>>e;
sommae=sommae+e;
cout<<“\n”;
}
med=sommae/20;
cout<<”\n la media delle eta\’:”<<med;
return 0;
}

Array

Array ( vettore)
Definizione. Un array è una variabile strutturata
Un array può essere definito come una “collezione organizzata di oggetti”. Analizziamo la
definizione e capiremo molte cose, innanzitutto il concetto di “collezione” implica che tali
oggetti siano dello stesso tipo, così, prendendo spunto dal mondo reale, potremmo
definire un array di mele, che, quindi non può contenere nessun “oggetto pera”; un array
in C è una collezione di variabili dello stesso tipo.
“Organizzata” implica che sia possibile identificare univocamente tutti gli oggetti
dell’array in modo sistematico; questo in C viene fatto tramite l’uso di indici numerici
che, in un array di dimensione N, vanno da 0 ad N-1.
Riprendendo l’esempio della rubrica del cellulare, usato per spiegare le variabili nella
lezione 11, si può pensare a quando creiamo un “gruppo suonerie”, ad esempio di
nome “amici scuola”; tale gruppo può contenere a tutti gli effetti un certo numero di
nomi/numeri dei nostri compagni di classe, ecco questo “gruppo” è un array, perchè
formato da oggetti dello stesso tipo (nomi/numeri) ed indentificato da un nome (amici
scuola) che li accomuna.
Ma vediamo nel dettaglio come è possibile dichiarare un array:
int myarray[10];
Come si può notare un array viene dichiarato mettendo il nome della variabile
(myarray), e ,tra parentesi quadre, la cifra che identifica il numero di elementi dello
stesso tipo (int) e quindi la dimensione dell’array.
Nell’esempio, ognuno dei dieci interi viene chiamato elemento dell’array e dieci è la
dimensione dell’array. In C, come già detto, ogni elemento viene identificato da un
numero, contando da 0 (invece che da 1) ed arrivando ad N (la dimensione, nel nostro
esempio uguale a 10) – 1 (quindi arriviamo a 9); per far comprendere meglio il concetto
abbiamo creato la seguente immagine che ci riporta ad un paragone con il mondo
reale;
myarray[3]=’w’;
In questa immagine l’array viene paragonato ad un palazzo. Pensateci bene, quando
diciamo che un palazzo ha 5 piani, in realtà ha sei livelli; cioè il piano terra è il primo
livello, il primo piano il secondo, e così via; analogamente succede nell’array, se
abbiamo un array di dimensione 6, i suoi indici andranno da 0 a 5 e un elemento
richiamato, ad esempio, tramite l’indice 3, è il quarto elemento, questo perché si inizia a
contare da 0.
L’analogia assume maggiore importanza, anche per far capire che le variabili dell’array
sono dello stesso tipo, così come un array di int può contenere solo int (e non char o
float), un palazzo che contiene uffici, in questo esempio, può contenere solo uffici (e
non abitazioni).

Aiken

Codifica pesata di Aiken
E’ una codifica a 4 bit con peso pari a 2-4-2-1.
E’ una codifica ridondante.
Si dice complemento a n di un numero x il valore n-x
Es C[9]5=4, C[7]5=2
Con Aiken codifico 10 numeri decimali da 0…9
2 4 2 1
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 1 0 1 1
6 1 1 0 0
7 1 1 0 1
8 1 1 1 0
9 1 1 1 1
Codificare con Aiken i seguenti numeri: 59, 127, 72
59=1011 1111 Aiken
Codice Quinario
Codice a 4 bit con pesi pari a 5-4-2-1
Codifico 13 cifre da 0…12
In che modo
5 4 2 1
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 1 0 0 0
6 1 0 0 1
7 1 0 1 0
8 1 0 1 1
9 1 1 0 0
10 1 1 0 1
11 1 1 1 0
12 1 1 1 1
Codificare in quinario il numero 87-129
Per casa rappresentare in BCD i seguenti numeri: 254, 372
Rappresentandoli nelle due modalità
23+58= bcd
67-54= bcd
Rappresentare con Aiken: 275, 397
Rappresentare in quinario: 589, 687.

Immagini

109
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
Lettere e numeri non costituiscono le uniche informazioni
utilizzate dagli elaboratori ma si stanno diffondendo sempre
di più applicazioni che utilizzano ed elaborano anche altri tipi
di informazione: diagrammi, immagini, suoni, filmati. Spesso
in questi casi si parla di applicazioni di tipo
multimediale multimediale
110
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Vediamo dapprima il caso delle immagini
• Esistono numerose tecniche che vengono utilizzate per la
memorizzazione digitale e l’elaborazione di un’immagine
• Consideriamo un’immagine in bianco e nero, senza
ombreggiature o livelli di chiaroscuro
111
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
Suddividiamo l’immagine mediante una griglia formata da
righe orizzontali e verticali a distanza costante
112
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Ogni quadratino derivante da tale suddivisione prende il nome
di pixel (picture element) e può essere codificato in binario
secondo la seguente convenzione:
– Il simbolo “0” viene utilizzato per la codifica di un pixel
corrispondente ad un quadratino bianco (in cui il bianco è
predominante)
– Il simbolo “1” viene utilizzato per la codifica di un pixel
corrispondente ad un quadratino nero (in cui il nero è
predominante)
113
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Poiché una sequenza di bit è lineare, è necessario definire delle
convenzioni per ordinare la griglia dei pixel in una sequenza. Assumiamo che i pixel siano ordinati dal basso verso l’alto e da
sinistra verso destra
1 1
1 111
0 1
0
0
0
0 00 0 0
0 0
0
0 0
0 0
0 0
0
0 0 1 234567
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Con questa convenzione la rappresentazione della figura sarà data dalla stringa binaria
0000000 0111100 0110000 0100000
114
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta

La codifica delle immagini
• Non sempre il contorno della figura coincide con le linee della
griglia. Quella che si ottiene nella codifica è
un’approssimazione della figura originaria
• Se riconvertiamo la stringa 0000000011110001100000100000
in immagine otteniamo
115
Informatica di Base Informatica di Base — R.Gaeta R.GaetaLa codifica delle immagini
• La rappresentazione sarà più fedele all’aumentare del numero
di pixel, ossia al diminuire delle dimensioni dei quadratini della
griglia in cui è suddivisa l’immagine
zz
116
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Assegnando un bit ad ogni pixel è possibile codificare solo
immagini senza livelli di chiaroscuro
• Le immagini in bianco e nero hanno delle sfumature (diversi
livelli di intensità di grigio
• Per codificare le immagini con diversi livelli di grigio si usa la
stessa tecnica: per ogni pixel si stabilisce il livello medio di
grigio cui viene assegnata convenzionalmente una
rappresentazione binaria
• Per memorizzare un pixel non è più sufficiente un solo bit. Ad
esempio, se utilizziamo quattro bit possiamo rappresentare
24=16 livelli di grigio, mentre con otto bit ne possiamo
distinguere 28=256, ecc.
117
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Analogamente possiamo codificare le immagini a colori. In
questo caso si tratta di individuare un certo numero di
sfumature di colore differenti e di codificare ogni sfumatura
mediante un’opportuna sequenza di bit
• Ad esempio, i monitor utilizzano risoluzioni di 640X480,
1024X768, oppure 1280X1024 ed un numero di colori per
pixel che va da 256 fino a sedici milioni di colori
• La rappresentazione di un’immagine mediante la codifica dei
pixel, viene chiamata codifica bitmap
• Il numero di byte richiesti dipende dalla risoluzione e dal
numero di colori che ogni pixel può assumere
118
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Per distinguere 256 colori sono necessari otto bit per la
codifica di ciascun pixel: la codifica di un’immagine formata
da 640X480 pixel richiederà 2.457.600 bit (307200 byte)
• Esistono delle tecniche di compressione delle informazione
che consentono di ridurre drasticamente lo spazio occupato
dalle immagini
119
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Rappresentazione con grafica vettoriale
• crea le immagini manipolando linee e curve
• i dati dell’immagine vengono tradotti in formule
matematiche che contengono tutte le istruzioni
necessarie per tracciarla, e.g., una retta, una
circonferenza
• la colorazione avviene attraverso la colorazione delle
linee e delle aree chiuse
120
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• la grafica vettoriale è più definita e di qualità
maggiore, soprattutto per rappresentare disegni
semplici
• la grafica bitmap o raster, invece, riesce a rendere con
qualità maggiore immagini con un numero elevato di
colori
• è facile rasterizzare le immagini vettoriali, cioè
trasformarle in bitmap, mentre molto complesso è il
procedimento inverso
121
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• la grafica bitmap si presta meglio alla visualizzazione su
video in quanto lo stesso monitor è formato da una
griglia, mentre la grafica vettoriale per essere
visualizzata deve passare necessariamente attraverso
un processo di rasterizzazione
• Altre caratteristiche…………
122
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica delle immagini
• Immagini complesse od irregolari: codifica raster o
bitmap
– Codifiche standard: GIF, JPEG, BMP
• Immagini regolari: codifica vettoriale
– Codifiche standard (proprietarie): CGM, DWG, DXF
• Codifiche ibride (raster/vettoriale):
– Codifiche standard (proprietarie): Postscript, PDF (Portable
Document Format)
123
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica di immagini in movimento
• Immagini in movimento: memorizzazione mediante
sequenze di fotogrammi (sono necessarie delle tecniche
per ottimizzare tale memorizzazione)
• 30 immagini ad alta risoluzione al secondo
• 30 immagini/sec x 2457600 bit/immagine=73728000 bit/sec
• Un minuto di filmato richiederebbe 60 sec x 73728000 bit/sec =
4423680000 bit
124
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica di immagini in movimento
• MPEG (Moving Picture Experts Group):
– Standard molto diffuso
– Molto efficiente ma complesso
• QuickTime:
– Proposto da Apple
– Meno efficiente ma più semplice
• Indeo – AVI:
– Proposto da Intel, usato da MicroSoft
– Poco efficiente
125
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• I suoni costituiscono un tipo di informazione con cui siamo
costantemente a contatto (linguaggio parlato, musica, rumori)
• Anche i suoni possono essere rappresentati in forma digitale
• Dal punto di vista fisico un suono è un’alterazione della pressione dell’aria che, quando rilevata, ad esempio dall’orecchio umano, viene trasformata in un particolare
stimolo elettrico
• Mediante un microfono queste alterazioni vengono
trasformate in un particolare stimolo elettrico
• La durata, l’intensità e la variazione nel tempo della pressione dell’aria sono le quantità fisiche che rendono un
suono diverso da ogni altro
126
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• Fisicamente un suono è rappresentato come un’onda (onda sonora)
che descrive la variazione della pressione dell’aria nel tempo
t
Sull’asse delle ascisse viene rappresentato il tempo e sull’asse
delle ordinate viene rappresentata la variazione di pressione
corrispondente al suono stesso
127
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• La rappresentazione precedente viene detta analogica, in quanto
descrive esattamente l’analogo della quantità fisica in esame, e
fornisce una descrizione continua dell’onda sonora
• Le rappresentazioni di tipo analogico non sono adatte al mondo
dell’informatica, data l’impossibilità di poter trattare con
informazioni di tipo continuo
• È necessario trovare un modo di per rappresentare in forma digitale
(numerica) un’onda sonora
128
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• Si effettuano dei campionamenti sull’onda (cioè si misura il
valore dell’onda a intervalli costanti di tempo) e si codificano
in forma digitale le informazioni estratte da tali
campionamenti
t
• Quanto più frequentemente il valore di intensità dell’onda
viene campionato, tanto più precisa sarà la sua
rappresentazione
129
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• La sequenza dei valori numerici ottenuta dai campioni può essere
facilmente digitalizzata
t
130
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni: la voce
• Se volessimo codificare la voce umana dovremmo:
– Campionare il segnale vocale ogni 125 milionesimi di secondo
(producendo 8000 campioni al secondo) per segnale con
frequenze inferiori a 4kHz (frequenze della voce umana)
– Per ogni campione (che è un numero) si usano 8 bit
– Per cui, il numero di bit che sarebbero necessari per codificare
ogni secondo è pari a
8000 campioni x 8 bit/campione=64000 bit
131
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni: la musica su CD
• Se volessimo codificare la musica di qualità CD
dovremmo:
– Usare due registrazioni corrispondenti a due microfoni distinti
– Campionare il segnale musicale producendo 44100 campioni al
secondo
– Per ogni campione (che è un numero) si usano 16 bit
– Per cui, il numero di bit che sarebbero necessari per codificare
ogni secondo è pari a
2 x 44100 campioni x 16 bit/campione=1414200 bit
132
Informatica di Base Informatica di Base — R.Gaeta R.Gaeta
La codifica dei suoni
• Codifiche standard:
– formato WAV (MS-Windows),
– formati AU e AIFF (rispettivamente SUN ed Apple)
– MIDI
– MP3
• MIDI:
– codifica le note e gli strumenti che devono eseguirle
– solo musica, non voce
– richiede un sintetizzatore o “campioni” per la riproduzione (non utilizzabile
“direttamente”)
– molto efficiente
• MP3:
– MPEG-3: variante MPEG per suoni
– Grande diffusione
– molto efficiente

Codici digitali non pesati

SONO CODICI NON POSIZIONALI, NON ESISTE
UN PESO PER CUI MOLTIPLICARE I SINGOLI BIT

 

La codifica di Gray
SI TRATTA DI UN CODICE CONTRADDISTINTO DAL FATTO CHE, OGNI NUMERO DIFFERISCE
DAL SUO SUCCESSIVO E DAL SUO PRECEDENTE PER UN UNICO BIT. ESSO SI OTTIENE
AGGIUNGENDO ALLA SINGOLA CIFRA (ESPRESSA IN BINARIO PURO) LA SUA SUCCESSIVA
PARTENDO DA DESTRA VERSO SINISTRA, SENZA CONSIDERARE IL RIPORTO (CODICE DI
TIPO RIFLESSO).
IL CODICE GRAY NON È UN CODICE PESATO, QUINDI LE CIFRE BINARIE NON ASSUMONO
VALORE DIFFERENTE A SECONDA DELLA POSIZIONE OCCUPATA.

Numero Decimale  Numero Binario Puro  Numero in Gray
0                         0000                            0000
1                          0001                            0001
2                          0010                            0011
3                          0011                             0010
4                          0100                             0110
5                          0101                              0111
6                          0110                              0101
7                          0111                               0100
8                          1000                              1100
9                          1001                               1101
10                        1010                               1111
11                         1011                               1110
12                         1100                              1010
13                         1101                               101 1
14                         1110                               1001
15                         1111                                1000

Canepina

Canepina è un comune italiano di 3035 abitanti della provincia di Viterbo nel Lazio. Dista dal capoluogo circa 13 km.

Il nome Canepina deriva dalla parola canapa: non a caso, ancora nel XVII secolo, il paese era soltanto una vasta piantagione di canapa. Da qui nacque il nome Canapina poi divenuto nel secolo successivo Canepina.