Like it?
[C] Cifrario di Vigenère
Scritto da carloVentrella  in  Programmazione >>  C  il 2012-05-02

Dopo aver analizzato e sviluppato il cifrario di Cesare, eccomi oggi con un nuovo metodo di criptazione, il cifrario di Vigenère, un metodo pubblicato nel 1586 e considerato il più semplice tra i cifrari polialfabetici.

Cifrario di Vigenere

Come funziona

Il funzionamento prevede lo scivolamento di ogni singola lettera della frase per un valore chiave, corrispondente al numero ordinale della lettera del verme: si tratta di una lettera che deve esser nota al destinatario del messaggio e che deve essere avere una lunghezza pari a quella della frase da criptare, in caso contrario la si ripeterà fino a raggiungere la lunghezza necessaria:

Testo cifrato : primomaggio

verme :         maremaremar

Test criptato:   brzqamrksif

Algoritmo in C

Come potete immaginare l´algoritmo non sarà molto diverso da quello del cifrario di Cesare in quanto i due metodi seguono la stessa logica di scivolamento delle lettere.

Rispetto al precedente ho migliorato lo scivolamento e impedito l´inserimento di lettere maiuscole in modo da non allungare troppo il codice.

Vediamolo subito:

 
#include <stdio.h>
#include<stdlib.h>
 
main()
{
    // variabili
    char parola[25];
    char chiave[25];
    int i,lunghezza_parola,lunghezza_chiave,x,y,valore_ascii,chiave_num;
    char n;
    printf("Cifrario di Vigenere");
    printf("Inserisci la parola da criptare (senza spazi): ");
    scanf("%s", &parola);
    printf("Inserisci la chiave: ");
    scanf("%s", &chiave);
 
    // calcolo lunghezza parola
    for (x=0; x<sizeof(parola);x++)
    {
       if(parola[x] == ´´)
       break;
       // controllo che siano solo lettere
       else if((int)parola[x] < 97 || (int)parola[x] > 122)
        {
            printf("Solo lettere minuscole.");
            return 0;
        }
    }
    lunghezza_parola = x;
 
    // calcolo lunghezza chiave
    for (x=0; x<sizeof(chiave);x++)
    {
       if(chiave[x] == ´´)
       break;
       // controllo che siano solo lettere
        else if((int)chiave[x] < 97 || (int)chiave[x] > 122)
        {
            printf("Solo lettere minuscole.");
            return 0;
        }
    }
    lunghezza_chiave = x;
 
    // inizializzo verme
    char verme[lunghezza_chiave];
    // riempio verme
    x=0;
    for (n=0; n<lunghezza_parola;n++)
    {
        if (x==lunghezza_chiave) // ricomincio da capo
        {
           x = 0;
        }
 
        verme[n] = chiave[x];
        x++;
    }
 
    printf("Testo criptato: ");
    // cripto la parola
    for (x=0; parola[x] != ´´; x++){
 
    i = (int)verme[x]; // valore ordinale della lettera del verme
 
    y=0; // valore criptato
 
    valore_ascii = (int)parola[x]; // valore ordinale della lettera della parola
    chiave_num = i-97; // posti effettivi di scivolamento
    // ottengo il valore della lettera criptata
    if ((chiave_num + valore_ascii) <= 122)
    {
        y = (chiave_num + valore_ascii);
    }
    else // se la somma supera la ´z´ devo ripartire da ´a´
    {
        y = 96 + (chiave_num - (122 - valore_ascii));
    }
    char z=0;
    // passo dalla lettera al numero
    z = (char)y;
    printf("%c", z);
    }
 
}
 

In breve..

  • Leggo la parola da criptare e la chiave
  • Controllo se le lettere sono maiuscole
  • Creo il verme
  • Effettuo lo scivolamento

Tags:   programmazione   password   C   crittografia   cifrario   chiave   algoritmo   Vigenère   cifrario di Vigenère
Commenti(0)

    Non ci sono commenti.

Sono Carlo Ventrella, studente e appassionato di programmazione, particolarmente interessato allo sviluppo di applicazioni e script per il web. Linguaggi attualmente conosciuti: C,Java, Javascript, css, css3, php e html5.

Carlo Ventrella
Sito realizzato da Carlo Ventrella | Feb 2012

Feedback

La tua opinione è indispensabile per migliorare il sito!

Critica Consiglio


CAPTCHA Image

Collabora

Ciao! Come sicuramente avrai notato il sito è ancora 'spoglio' e lo si deve al fatto che è nato da poco e la manodopera diciamo che...scarseggia! Il sito al momeno è gestito da una sola persona ed è per questo motivo che nuovi collaboratori sarebbero ben accetti! La collaborazione parte dalla gestione di una o più categorie fino all'inserimento di un semplice articolo che secondo voi potrebbe suscitare particolare interesse. Se volete aiutarmi potete anche solo mandarmi un feedback nel quale mi dite cosa vi piace o cosa pensate che debba essere migliorato. Ve ne sarei molto grato!
Grazie.

Feedback

Cosa ne pensi di questo articolo?