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.

Napsat komentář

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