Criptosistemul Vigenère

Aspecte teoretice:

Cifrul Vigenère este o metodă de criptare care folosește o serie de cifruri Cezar diferite bazate pe literele unui cuvânt-cheie. Este o formă simplă de substituție polialfabetică.
Cifrul Vigenère a fost reinventat de multe ori. Metoda a fost descrisă inițial de către Giovan Batista Belaso în 1553, în cartea sa La cifra del. Sig. Giovan Batista Belaso; totuși, schema a fost atribuită greșit mai târziu lui Blaise de Vigenère în secolul al XIX-lea, și este cunoscută acuma ca “cifrul Vigenère”.
Acest cifru este cunoscut deoarece deși este ușor de înțeles și implementat, pare pentru începători imposibil de spart; acestui fapt i se datorează descrierea le chiffre indéchiffrable (franceză, “cifrul indescifrabil”). În consecință, mulți oameni au încercat să implementeze scheme de criptare care sunt, esențialmente, cifruri Vigenère, doar ca să fie sparte.
Algoritmul de criptare

Primul pas al algoritmului constă în aranjarea literelor alfabetului într-o matrice pătratică cu L linii și L coloane, unde L este numărul de simboluri ale alfabetului. 

Prima linie a matricei este formată din literele alfabetului în ordine lexicograficã, iar următoarele L – 1 linii sunt obținute fiecare din linia precedentă printr-o permutare la stânga cu o poziție. În cazul alfabetului ales matricea obținută este următoarea : Se observă că un caracter nu apare decât o singură dată pe o linie sau o coloană și fiecare linie sau coloană conține toate literele alfabetului considerat.

Următorul pas constă în alegerea unei parole formată din simboluri ale alfabetului. Pentru ca această tehnică să fie eficientă, ar fi ideal ca lungimea parolei să fie mai mare sau cel puțin egală cu lungimea textului care urmează a fi criptat. Datorită faptului că o astfel de parolă nu poate fi reținută de către utilizator, se alege o parolă mai scurtă asupra căreia se aplică diverse metode prin care ea este extinsă pentru ca lungimea ei să depășească lungimea textului. Cea mai simplă metodă utilizată în acest sens constă în concatenarea parolei cu ea însăși până în momentul în care lungimea sa este cel puțin egală cu lungimea textului.

  La ultimul pas, fiecare al k-lea caracter din textul initial este criptat astfel: 
• se determină numărul de ordine i, corespunzător poziției caracterului în alfabetul considerat;
• se determină numărul de ordine j, corespunzător poziției în alfabetul considerat a celui de-al k-lea caracter din parolă;
• se scrie caracterul care se află pe linia i și coloana  j în matrice.
Așadar, caracterul care va apărea pe prima poziție a textului criptat se află pe coloana a doua a celei de-a șasea linii din matrice:   
Acest procedeu continuă pentru toate valorile  k mai mici sau egale cu lungimea textului.
Logo_C_Sharp
Cod Sursa C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CriptareVigenere
{
    class VCipher
    {
        public string encrypt(string txt, string pw, int d)
        {
            int pwi = 0, tmp;
            string ns = "";
            txt = txt.ToUpper();
            pw = pw.ToUpper();
            foreach (char t in txt)
            {
                if (t < 65) continue;
                tmp = t - 65 + d * (pw[pwi] - 65);
                if (tmp < 0) tmp += 26;
                ns += Convert.ToChar(65 + (tmp % 26));
                if (++pwi == pw.Length) pwi = 0;
            }
 
            return ns;
        }
    };
 
    class Program
    {
        static void Main(string[] args)
        {
            VCipher v = new VCipher();
 
            string s0 = "Beware the Jabberwock, my son! The jaws that bite, the claws that catch!",
                   pw = "VIGENERECIPHER";
 
            Console.WriteLine(s0 + "\n" + pw + "\n");
            string s1 = v.encrypt(s0, pw, 1);
            Console.WriteLine("Encrypted: " + s1);
            s1 = v.encrypt(s1, "VIGENERECIPHER", -1);
            Console.WriteLine("Decrypted: " + s1);
            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey();
        }
    }
 
}

Rezultat:

vigenere rezultat

Leave a comment