Hillova šifra a C#


Co je Hillova šifra?

Hillova šifra je polygramová šifra, kterou v roce 1929 vynalezl Lester S. Hill. Na rozdíl od jednoduchých substitučních šifer pracuje s bloky písmen, typicky o délce 2×2, 3×3 nebo více, a využívá lineární algebru pro šifrování a dešifrování. Hillova šifra je založena na maticových operacích nad modulem velikosti abecedy, typicky 26 pro anglickou abecedu.

Princip fungování

  1. Bloky písmen – text se rozdělí na bloky stejné délky. Například pro blok 2×2: HELLO → HE LL OX (doplňující písmeno X, aby byl blok úplný).
  2. Matice klíče – šifrovací klíč je čtvercová matice o velikosti n×n, kde n odpovídá velikosti bloku. Pro šifrování musí být matice invertibilní modulo 26, aby šlo provést i dešifrování.
  3. Šifrovací operace – blok textu se převede na vektor čísel (A=0, B=1, …, Z=25) a vektor se vynásobí maticí klíče modulo 26. Výsledkem je zašifrovaný blok. Matematicky: C = K * P mod 26 kde C = šifrovaný blok, K = matice klíče, P = vektor otevřeného textu.
  4. Dešifrování – provádí se pomocí inverzní matice klíče modulo 26: P = K^-1 * C mod 26

Bezpečnost Hillovy šifry

Hillova šifra byla na svou dobu velmi silná, protože polygramové bloky komplikují frekvenční analýzu jednotlivých písmen. Přesto není bezpečná proti moderním útokům, zejména při znalosti části otevřeného textu (tzv. known-plaintext attack), protože lineární algebra umožňuje poměrně rychlé prolomení. Hillova šifra je tedy dnes spíše historickým a didaktickým příkladem.

Příklad šifrování slova HELLO

Použijeme 2×2 matici klíče:

K = | 3 3 |
    | 2 5 |

Text: HELLO → bloky: HE LL OX → číselné vektory: [7,4], [11,11], [14,23]

Šifrování:

C1 = [3 3 ; 2 5] * [7;4] mod 26 = [7*3+4*3 ; 7*2+4*5] mod 26 = [33;34] mod 26 = [7;8] → HI
C2 = [3 3 ; 2 5] * [11;11] mod 26 = [66;77] mod 26 = [14;25] → OZ
C3 = [3 3 ; 2 5] * [14;23] mod 26 = [111;157] mod 26 = [7;1] → HB

Výsledek: HIOZHB

Implementace Hillovy šifry v C#

using System;

class HillCipher
{
    private int[,] keyMatrix;
    private int size;

    public HillCipher(int[,] key)
    {
        size = key.GetLength(0);
        keyMatrix = key;
    }

    private int[] TextToNumbers(string text)
    {
        int[] numbers = new int[text.Length];
        for (int i = 0; i < text.Length; i++)
            numbers[i] = text[i] - 'A';
        return numbers;
    }

    private string NumbersToText(int[] numbers)
    {
        char[] chars = new char[numbers.Length];
        for (int i = 0; i < numbers.Length; i++)
            chars[i] = (char)((numbers[i] % 26) + 'A');
        return new string(chars);
    }

    public string Encrypt(string plaintext)
    {
        plaintext = plaintext.ToUpper().Replace(" ", "");
        int padding = size - (plaintext.Length % size);
        if (padding != size) plaintext += new string('X', padding);

        int[] numbers = TextToNumbers(plaintext);
        int[] encrypted = new int[numbers.Length];

        for (int i = 0; i < numbers.Length; i += size)
        {
            for (int row = 0; row < size; row++)
            {
                int sum = 0;
                for (int col = 0; col < size; col++)
                {
                    sum += keyMatrix[row, col] * numbers[i + col];
                }
                encrypted[i + row] = sum % 26;
            }
        }

        return NumbersToText(encrypted);
    }
}

class Program
{
    static void Main()
    {
        int[,] key = { { 3, 3 }, { 2, 5 } };
        var cipher = new HillCipher(key);
        string plaintext = "HELLO";
        string encrypted = cipher.Encrypt(plaintext);
        Console.WriteLine($"Původní text: {plaintext}");
        Console.WriteLine($"Zašifrovaný text: {encrypted}");
    }
}

Závěr

Hillova šifra je výborným příkladem matematického přístupu ke kryptografii. Díky práci s bloky písmen a maticemi nabízí vyšší bezpečnost než jednoduché substituční šifry, avšak moderní analytické metody ji dokáží prolomit. Hillova šifra je skvělým didaktickým nástrojem pro pochopení lineární algebry v kontextu šifrování a ukazuje, jak matematické principy mohou být aplikovány v kryptografii.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *