Criptosistemul Vernam

Aspecte teoretice:

O variantă mai nouă a cifrului Vigenere peste un alfabet binar, este cifrul Vernam care se diferenţiază prin cheia de cifrare, care este reprezentată de o secvenţă de caractere aleatoare care nu se repetă.
Fie M=m1m2…mn un mesaj clar binar şi K=k1k2…kn un şir binar care reprezintă cheia. Criptograma C = Ek (M) = c1c2…cn se obţine determinând fiecare caracter ci astfel : Ci = (mi+ki) (mod n), i=1, 2, … ,n .
Utilizarea o singură dată a cheii ne dă un exemplu de criptosistem care face ca mesajul să fie foarte rezistent la criptanaliză, practic imposibil de spart; textul clar este o secvenţă finită de biţi, să zicem cel mult 20. Cheia este şi ea o secvenţa de 20 de biţi. Ea este utilizată atât pentru criptare, cât şi pentru decriptare şi este comunicată receptorului printr-un canal sigur. Să luăm cheia
11010100001100010010;
un text clar, să zicem 010001101011, este criptat prin sumare bit cu bit cu biţii cheii, pornind cu începutul acesteia.
11010100001100010010 ⊕
010001101011
100100101000
Deci criptotextul este 100100101000. Acesta nu dă informaţii criptanalistului, deoarece el nu ştie nici ce biţi vin din textul clar, nici care au fost schimbaţi de către cheie. Aici este esenţial faptul că o cheie este folosită o singură dată, altfel, un text clar anterior împreună cu criptotextul corespunzător oferă posibilitatea aflării cheii sau cel puţin prefixul ei.
Dezavantajul evident al acestei tehnici este gestionarea dificilă a cheilor. Cheia, cel puţin la fel de lungă ca şi textul clar, trebuie comunicată printr-un canal sigur. Aceste cifruri au o largă utilizare în comunicaţiile diplomatice şi militare.

Implementare:

Visual_C++_Icon
Cod Sursa C++
// CriptareVernamCPP.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<iostream>
#include<string>
 
using namespace std;
 
class vernam
{
public:
	string s, k;
	char enc[1000], dec[1000];
	vernam(string astring b)
	{
		s = a;
		k = b;
	}
 
	void encrypt()
	{
		int i, j = 0;
		for (i = 0; i<s.size(); i++)
		{
			enc[i] = s[i] ^ k[j];
			j++;
			if (j >= k.size())
			{
				j = 0;
			}
		}
	}
 
	void decrypt()
	{
		int i, j = 0;
		for (i = 0; i<s.size(); i++)
		{
			dec[i] = enc[i] ^ k[j];
			j++;
			if (j >= k.size())
			{
				j = 0;
			}
		}
	}
 
	void printenc()
	{
		int i;
		char c;
		for (i = 0; i<s.size(); i++)
		{
			c = enc[i] % 74 + 48;
			cout << c;
		}
		cout << endl;
	}
 
	void printdec()
	{
		int i;
		for (i = 0; i<s.size(); i++)
		{
			cout << dec[i];
		}
		cout << endl;
	}
};
 
int main()
{
	string s, k;
	cout << "Introduceti textul: " << endl;
	cin >> s;
	cout << "Introduceti cheia: " << endl;
	cin >> k;
	vernam v(s, k);
	v.encrypt();
	cout << "Mesajul criptat : ";
	v.printenc();
	cout << endl;
	v.decrypt();
	cout << "Mesajul decriptat : ";
	v.printdec();
	system("pause");
}

Rezultat:

vernam rezultat

Leave a comment