Criptosistemul Hill

Aspecte teoretice:

Sistemul de cifrare Hill este o metodă de substituție poligrafică bazată pe calcule efectuate în algebra mod p.

În faza de preprocesare delimitatorul de spațiu este ignorat sau înlocuit cu caracterul cel mai puțin frecvent din limba în care este textul clar (în limba română Q).

Algoritmul procesează un bloc de date M de n caractere (litere), cheia de cifrare fiind reprezentată de o matrice K de dimensiune n x n, inversabilă mod p.

Există două subclase ale algoritmului Hill pentru care regulile de cifrare diferă prin ordinea în care se efectuează înmulțirile: o primă subclasă are ca regulă de cifrare operația de înmulțire C=MK cu descifrarea M=CK-1 iar a doua clasă folosește ca regulă de cifrare înmulțirea C=KM având descifrarea corespunzătoare M=K-1C.

Dacă matricea K este simetrică (matricea K și transpusa ei sunt egale) atunci regulile de cifrare pentru cele două subclase sunt echivalente.

În cazul alfabetului latin p=26, cheia de cifrare K trebuie să fie o matrice inversabilă mod 26.

Exemplu:

Să se cifreze mesajul: ”BLAZE OF GLORY”. Algoritmul utilizat este cifrul lui Hill (2×2), cheia de cifrare fiind matricea:

hill1

Prin înlocuirea literelor din cheie cu pozițiile corespunzătoare din alfabet (A – 0; B – 1; etc.) se obține:

hill2

Textul clar se sparge în blocuri de 2 caractere, care se cifrează pe rând. De exemplu, BL corespunde matricii:

M = ( 1 11)

Diagrama se cifrează în:

hill3

Deci, BL se cifrează în GL. Se continuă în mod analog. În final se obține:

GLFSS MPBDT HB.

Implementare:

Visual_C++_Icon
Cod Sursa C++
// CriptareHillCPP.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<iostream>
#include<string>
#include<stdio.h>
 
using namespace std;
 
class hill
{
public:
	string msg, k;
	int *enc;
	int key[3][3], inv[3][3];
	hill(string astring b)
	{
		msg = a;
		k = b;
		int i, j, l = 0;
		cout << "\nMatricea Cheie : " << endl;
		for (i = 0; i<3; i++)
		{
			for (j = 0; j<3; j++)
			{
				if (l >= k.size())
				{
					key[i][j] = 'x' - 'a' + 1;
				}
				else
				{
					key[i][j] = k[l] - 'a' + 1;
				}
				cout << key[i][j] << " ";
				l++;
			}
			cout << endl;
		}
		cout << endl;
		while (msg.size() % 3 != 0)
		{
			msg = msg + 'x';
		}
		cout << "Mesajul extins : ";
		cout << msg << endl;
		enc = new int[msg.size()];
	}
 
	void encrypt()
	{
		int i, j, l, m;
		for (l = 0; l<msg.size();)
		{
			m = l;
			for (i = 0; i<3; i++)
			{
				enc[l] = (key[i][0] * (msg[m] - 'a' + 1) + key[i][1] * (msg[m + 1] - 'a' + 1) + key[i][2] * (msg[m + 2] - 'a' + 1)) % 26 + 'a' - 1;
				cout << (char)enc[l];
				l++;
			}
		}
	}
};
 
 
int main()
{
	string s, k;
	cout << "Introduceti mesajul de criptat: " << endl;
	fflush(stdin);
	getline(cin, s);
	cout << "Introduceti cheia de criptare: " << endl;
	fflush(stdin);
	getline(cin, k);
	hill h(s, k);
	cout << endl;
	cout << "Mesajul criptat este : ";
	h.encrypt();
	cout << endl;
	system("pause");
}

Rezultat:

hill rezultat

One Comment Add yours

  1. poti posta si codul sursa pentru decriptare …multumesc anticipat

    Like

Leave a comment