Afinní šifra a C#

Co je Afinní šifra?
Afinní šifra je typ substituční šifry, která kombinuje dvě aritmetické operace – násobení a sčítání. Je to rozšíření Caesarovy šifry a patří mezi monoalfabetické šifry, což znamená, že každé písmeno z plaintextu je vždy zašifrováno stejným písmenem šifrového textu. Afinní šifra využívá dvě klíčové čísla, a
a b
, pro šifrování a dešifrování zpráv.
Princip fungování
Afinní šifra pracuje nad abecedou o m
písmenech (například anglická abeceda má 26 písmen). Každé písmeno v abecedě je přiřazeno k číslu (například A=0, B=1, …, Z=25). Šifrování a dešifrování pak probíhá pomocí dvou klíčů a
a b
a následujících vzorců:
- Šifrování: E(x) = (ax + b) mod m
- Dešifrování: D(x) = a^-1(x – b) mod m
Kde E
je šifrovací funkce, D
je dešifrovací funkce, x
je číselná hodnota písmene plaintextu, a^-1
je modulární inverze a
modulo m
, a mod m
označuje zbytek po dělení m
.
Bezpečnost Afinní šifry
Afinní šifra je bezpečnější než Caesarova šifra, protože nabízí širší škálu možných transformací díky dvěma klíčům. Nicméně, i když má více možných šifrovacích klíčů, stále je relativně snadné ji rozlousknout pomocí technik frekvenční analýzy nebo hrubé síly, zejména pokud útočník zná jazyk šifrovaného textu.
Implementace Afinní šifry v C#
Implementace Afinní šifry vyžaduje funkce pro šifrování, dešifrování a výpočet modulární inverze. Zde je zjednodušená implementace v C#:
namespace AffineCipher; internal class Program { private static int ModInverse(int keyA, int modulo) { keyA = keyA % modulo; for (var x = 1; x < modulo; x++) if (keyA * x % modulo == 1) return x; return 1; } private static string Encrypt(string input, int keyA, int keyB) { var result = ""; foreach (var c in input.ToUpper()) if (char.IsLetter(c)) { var x = c - 'A'; var enc = (char)((keyA * x + keyB) % 26 + 'A'); result += enc; } else { result += c; } return result; } private static string Decrypt(string input, int keyA, int keyB) { var result = ""; var aInv = ModInverse(keyA, 26); foreach (var c in input.ToUpper()) if (char.IsLetter(c)) { var x = c - 'A'; var dec = (char)(aInv * (x - keyB + 26) % 26 + 'A'); result += dec; } else { result += c; } return result; } private static void Main(string[] args) { var original = "This is a secret message"; var keyA = 5; var keyB = 8; var encrypted = Encrypt(original, keyA, keyB); var decrypted = Decrypt(encrypted, keyA, keyB); Console.WriteLine("Original: " + original); Console.WriteLine("Encrypted: " + encrypted); Console.WriteLine("Decrypted: " + decrypted); } }
Závěr
Afinní šifra poskytuje zajímavý pohled do světa substitučních šifer a nabízí lepší bezpečnost než její jednodušší předchůdci, jako je Caesarova šifra. Ačkoli není dostatečně silná pro moderní šifrování, je vynikajícím didaktickým nástrojem pro pochopení základních principů kryptografie. Implementace v C# demonstruje, jak lze Afinní šifru programovat a používat pro základní šifrovací a dešifrovací úkoly.