Criptosistemul Atbash

Aspecte teoretice:

Atbash este un caz simplu de cifrul substituției pentru alfabetul ebraic. Este format prin înlocuirea lui alef (prima literă) cu tav (ultima), bet (a doua) cu sin (penultima) ș.a.m.d., inversând alfabetul. Două cuvinte din Cartea lui Ieremia, Leb Kamai și Sheshakh, sunt Atbash pentru Kasdim/Kasdin (Caldea) și, respectiv, Babel (Ier. 25:26; 51:1, 41). A fost asociat cu metodologiile esoterice ale interpretărilor misticismului ebraic ale textelor religioase ebraice precum cele din Cabala.
Un cifru Atbash pentru alfabetul latin este următorul:
Normal:  abcdefghijklmnopqrstuvwxyz
Cifru:  ZYXWVUTSRQPONMLKJIHGFEDCBA
Atbash poate fi folosit și pentru a exprima același lucru în orice alt alfabet. Este un caz foarte simplu de cifrul substituției.
De exemplu, în Atbash, literele “yzmr” indică cuvântul “bani”.
Câteva cuvinte românești ‘Atbash’ în alte cuvinte românești. De exemplu, “lor”=”oli”, “tir”=”gri”, “zar”=”azi”.
Este un cifru foarte slab deoarece are o singură cheie posibilă și este un cifru cu substituție monoalfabetică. Totuși, aceasta s-ar putea să nu fi fost o problemă la timpul când a fost creat și folosit.
Cifrul Atbash este referit în Da Vinci Code Quest de la Google, unde participanții trebuie să descifreze un cuvânt comun din Atbash.
Implementare:
Visual_C++_Icon
Cod Sursa C++
// CriptareAtbashCPP.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<iostream>
#include<string>
 
using namespace std;
 
char msg[1000], cip[36], enc[1000], decy[1000];
 
void table(string k)
{
	int l, i = 0;
	int v[26] = { 0 }, n[10] = { 0 };
	for (l = 0; l<k.size(); l++)
	{
		if (k[l] >47 && k[l]<58 && n[k[l] - 48] == 0)
		{
			cip[i] = k[l];
			n[k[l] - 48] = 1;
			i++;
		}
		else if (k[l] >96 && k[l]<123 && v[k[l] - 97] == 0)
		{
			cip[i] = k[l];
			v[k[l] - 97] = 1;
			i++;
		}
	}
	for (l = 0; l<10; l++)
	{
		if (n[l] == 0)
		{
			cip[i] = l + 48;
			i++;
		}
	}
	for (l = 0; l<26; l++)
	{
		if (v[l] == 0)
		{
			cip[i] = l + 97;
			i++;
		}
	}
}
 
int findIndex(char ch)
{
	int x;
	for (int i = 0; i<36; i++)
	{
		if (cip[i] == ch)
		{
			x = i;
			i = 36;
		}
	}
	return x;
}
 
int encrypt(string s)
{
	int i, l = 0, x;
	for (i = 0; i<s.size(); i++)
	{
		if ((s[i] >47 && s[i]<58) || (s[i] >96 && s[i]<123))
		{
			x = findIndex(s[i]);
			enc[i] = cip[36 - x];
		}
	}
	return i;
}
 
void decrypt(char s[])
{
	int i, l = 0, x;
	for (i = 0; i<sizeof(enc) / sizeof(*enc); i++)
	{
		if ((s[i] >47 && s[i]<58) || (s[i] >96 && s[i]<123))
		{
			x = findIndex(s[i]);
			decy[i] = cip[36 - x];
		}
	}
	return;
}
 
int main()
{
	string s, k;
	cout << "Introduceti textul de criptat: " << endl;
	getline(cin, s);
	cout << "Introduceti cheia de criptare : " << endl;
	cin >> k;
	int i, j, f = 0;
	cout << "\nVectorul Abtash : ";
	table(k);
	for (i = 0; i<sizeof(cip) / sizeof(*cip); i++)
	{
		cout << cip[i];
	}
	cout << endl;
	cout << "\nMesajul criptat : ";
	j = encrypt(s);
	for (i = 0; i<j; i++)
	{
		cout << enc[i];
	}
	cout << "\nMesajul decriptat : ";
	decrypt(enc);
	for (i = 0; i<j; i++)
	{
		cout << decy[i];
	}
	cout << endl;
	system("pause");
}

Rezultat:

atbash

Leave a comment