Szyfr Cezara, stosowany prze Juliusza Cezara do szyfrowania swoich listów jest bardzo prosty, ale i przy tym w zasadzie nieskuteczny. Choć podobno Rosjanie jeszcze na początku XX wieku korzystali w wojsku z tego szyfru, ze względu na jego prostotę :)
Algorytm jest wręcz banalny, opiera się na przesunięciu o 3 każdej litery alfabetu. Gdy szyfrujemy przesuwamy “w prawo”, gdy deszyfrujemy “w lewo”. Zapis matematyczny:
1. E(p) = ( p + 3 ) mod k
2. D(p) = ( p- 3 ) mod k
Gdzie k jest ilością liter danego alfabetu a p aktualnie szyfrowaną literą. Zgodnie z oryginalnym szyfrem, nie szyfrujemy cyfr i innych znaków ( co oczywiście ułatwia deszyfrację ) . Oto kod szyfrowania w C++:
string cezarEncode( string text )
{
const unsigned int CEZAR_SHIFT = 3;
const unsigned int ALPHABET_SIZE = 26;
string result = "";
unsigned int length = text.length();
for ( int i(0); i < length; ++i )
{
// 65 is ASCII code of A, 90 is ASCII code of Z
if ( text[i] >= 65 && text[i] <= 90 )
result += ( text[i] - 65 + CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
// 97 is ASCII code of a, 122 is ASCII code of z
else if ( text[i] >= 97 && text[i] <= 122 )
result += ( text[i] - 97 + CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
else
result += text[i];
}
return result;
}
Deszyfrowanie:
string cezarDecode( string text )
{
const unsigned int CEZAR_SHIFT = 3;
const unsigned int ALPHABET_SIZE = 26;
string result = "";
unsigned int length = text.length();
for ( int i(0); i < length; ++i )
{
// 65 is ASCII code of A, 90 is ASCII code of Z
if ( text[i] >= 65 && text[i] <= 90 )
result += ( text[i] - 65 - CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
// 97 is ASCII code of a, 122 is ASCII code of z
else if ( text[i] >= 97 && text[i] <= 122 )
result += ( text[i] - 97 - CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
else
result += text[i];
}
return result;
}
I na tym koniec
Taki nie zaawansowany rot13 :)
Taki rot(13-10) na dobrą sprawę :)
Całość uogólniłem, oryginalny szyfr Cezara obejmuje przesunięcie o 3