Playfair šifra a C#

Co je Playfair šifra?
Playfair šifra je klasická polygramová šifra, která byla vynalezena roku 1854 Charlesem Wheatstonem, ale proslavil ji lord Lyon Playfair, podle kterého nese jméno. Na rozdíl od jednoduchých substitučních šifer, které pracují s jednotlivými písmeny, Playfair šifra šifruje dvojice písmen (digramy). Díky tomu je výrazně odolnější vůči frekvenční analýze než například Caesarova šifra.
Princip fungování
- Nejprve se vytvoří šifrovací tabulka 5×5, která obsahuje písmena abecedy. Typicky se sloučí písmena I a J, aby se vešla všechna do 25 políček. Tabulka je vytvořena z klíčového slova (bez opakování písmen), a poté se doplní zbývající písmena abecedy. Například pro klíčové slovo KEYWORD vznikne tabulka:
K E Y W O R D A B C F G H I/J L M N P Q S T U V X Z
- Text k zašifrování se rozdělí na dvojice písmen. Pokud jsou obě stejná, vloží se mezi ně písmeno X. Pokud zbude na konci jedno písmeno, také se doplní X. Např. slovo HELLO → HE LX LO
- Každý digram se šifruje podle pravidel:
- Stejný řádek: obě písmena se nahradí písmeny napravo (pokud na konci, vezme se první z řádku).
- Stejný sloupec: obě písmena se nahradí písmeny pod nimi (pokud dole, vezme se první shora).
- Jiný řádek i sloupec: písmena se nahradí těmi, co leží na průsečících obdélníku.
Bezpečnost Playfair šifry
Playfair šifra byla svého času považována za velmi silnou, protože znemožňuje jednoduchou frekvenční analýzu jednotlivých písmen. Útočník musí analyzovat frekvenci digramů, což je složitější. Přesto není Playfair šifra v dnešní době bezpečná – moderní počítače ji dokážou prolomit velmi rychle. Nicméně v 19. a 20. století byla populární v armádě i diplomacii.
Názorný příklad
Použijeme tabulku s klíčovým slovem KEYWORD:
- Rozdělení textu: HE LX LO
- HE → H (ř.3, sl.3), E (ř.1, sl.2) → vytvoří obdélník → výsledkem je GY
- LX → L (ř.3, sl.5), X (ř.5, sl.4) → výsledkem je QI
- LO → L (ř.3, sl.5), O (ř.1, sl.5) → stejný sloupec → posun dolů → SZ
Výsledek: GYQISZ
Implementace Playfair šifry v C#
using System; using System.Collections.Generic; using System.Text; class PlayfairCipher { private char[,] table; public PlayfairCipher(string keyword) { table = GenerateTable(keyword); } private char[,] GenerateTable(string keyword) { string alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"; // I a J sloučené StringBuilder keyBuilder = new StringBuilder(); foreach (char c in keyword.ToUpper()) { if (c == 'J') continue; if (!keyBuilder.ToString().Contains(c)) keyBuilder.Append(c); } foreach (char c in alphabet) { if (!keyBuilder.ToString().Contains(c)) keyBuilder.Append(c); } char[,] table = new char[5, 5]; int index = 0; for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { table[row, col] = keyBuilder[index++]; } } return table; } public string Encrypt(string text) { text = text.ToUpper().Replace("J", "I"); StringBuilder sb = new StringBuilder(); // Rozdělení do digramů for (int i = 0; i < text.Length; i += 2) { char a = text[i]; char b = (i + 1 < text.Length) ? text[i + 1] : 'X'; if (a == b) { b = 'X'; i--; } (int rowA, int colA) = FindPosition(a); (int rowB, int colB) = FindPosition(b); if (rowA == rowB) { sb.Append(table[rowA, (colA + 1) % 5]); sb.Append(table[rowB, (colB + 1) % 5]); } else if (colA == colB) { sb.Append(table[(rowA + 1) % 5, colA]); sb.Append(table[(rowB + 1) % 5, colB]); } else { sb.Append(table[rowA, colB]); sb.Append(table[rowB, colA]); } } return sb.ToString(); } private (int, int) FindPosition(char c) { for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { if (table[row, col] == c) return (row, col); } } return (-1, -1); } } class Program { static void Main() { var cipher = new PlayfairCipher("KEYWORD"); string plaintext = "HELLO"; string encrypted = cipher.Encrypt(plaintext); Console.WriteLine($"Původní text: {plaintext}"); Console.WriteLine($"Zašifrovaný text: {encrypted}"); } }
Závěr
Playfair šifra představuje zajímavý krok mezi jednoduchými monoalfabetickými šiframi a složitějšími polyalfabetickými metodami. Díky práci s dvojicemi písmen je odolnější proti frekvenční analýze než například Caesarova či Atbash šifra. Přesto byla s rozvojem moderní kryptoanalýzy postupně prolomena a dnes slouží spíše jako ukázkový příklad historického šifrování. Pro studium základů kryptografie má však Playfair šifra stále své nezastupitelné místo.