Vigenèrova šifra a C#


Co je Vigenèrova šifra?

Vigenèrova šifra je historická polyalfabetická substituční šifra, která se značně liší od jednoduchých monoalfabetických šifer, jako je Caesarova nebo Atbash. Místo jednoho posunu používá klíčové slovo, podle kterého se jednotlivá písmena šifrují různým způsobem. Díky tomu je mnohem odolnější vůči frekvenční analýze a byla po dlouhou dobu považována za velmi bezpečnou.

Princip fungování

Vigenèrova šifra využívá opakující se klíčové slovo, které určuje posun pro každé písmeno otevřeného textu (A = 0, B = 1, …, Z = 25). Každý znak šifrovaného textu se vypočítá jako:

Encrypted = (PlaintextIndex + KeyIndex) mod 26

A obdobně se dešifruje:

Plaintext = (EncryptedIndex - KeyIndex + 26) mod 26

Názorný příklad

  • Otevřený text: HELLO
  • Klíč: KEY
  • Klíč opakovaný: KEYKE

Tabulkové znázornění:

Text:H (7)E (4)L (11)L (11)O (14)
Klíč:K (10)E (4)Y (24)K (10)E (4)
Šifrovaný text:R (17)I (8)J (9)V (21)S (18)

Výsledek šifrování → RIJVS

Bezpečnost Vigenèrovy šifry

I když byla Vigenèrova šifra po staletí považovaná za „neprolomitelnou“, díky metodám jako Kasiskiho test a Friedmanův test je dnes snadno prolomitelná:

  • Kasiskiho test pomáhá odhadnout délku klíče na základě opakování sekvencí v šifrovaném textu.
  • Po odhalení délky klíče se text rozdělí na několik částí, které lze analyzovat frekvenční metodou.

V moderní kryptografii má tedy spíše historický a vzdělávací význam.

Implementace Vigenèrovy šifry v C#

using System;
using System.Text;

namespace VigenereCipher
{
    internal class Program
    {
        private const string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        public static string Encrypt(string plaintext, string key)
        {
            var result = new StringBuilder();
            plaintext = plaintext.ToUpper();
            key = key.ToUpper();
            int keyIndex = 0;

            foreach (char c in plaintext)
            {
                if (Alphabet.Contains(c))
                {
                    int p = Alphabet.IndexOf(c);
                    int k = Alphabet.IndexOf(key[keyIndex % key.Length]);
                    int enc = (p + k) % 26;
                    result.Append(Alphabet[enc]);
                    keyIndex++;
                }
                else
                {
                    result.Append(c);
                }
            }
            return result.ToString();
        }

        public static string Decrypt(string ciphertext, string key)
        {
            var result = new StringBuilder();
            ciphertext = ciphertext.ToUpper();
            key = key.ToUpper();
            int keyIndex = 0;

            foreach (char c in ciphertext)
            {
                if (Alphabet.Contains(c))
                {
                    int ci = Alphabet.IndexOf(c);
                    int k = Alphabet.IndexOf(key[keyIndex % key.Length]);
                    int dec = (ci - k + 26) % 26;
                    result.Append(Alphabet[dec]);
                    keyIndex++;
                }
                else
                {
                    result.Append(c);
                }
            }
            return result.ToString();
        }

        private static void Main()
        {
            string plaintext = "HELLO";
            string key = "KEY";

            string encrypted = Encrypt(plaintext, key);
            string decrypted = Decrypt(encrypted, key);

            Console.WriteLine($"Otevřený text: {plaintext}");
            Console.WriteLine($"Klíč: {key}");
            Console.WriteLine($"Šifrovaný text: {encrypted}");
            Console.WriteLine($"Dešifrovaný text: {decrypted}");
        }
    }
}

Závěr

V tomto článku jsme si představili Vigenèrovu šifru jako historický princip pokročilejšího šifrování založeného na klíčovém slovu a polyalfabetické substituci. Ukázal jsem, jak funguje šifrování i dešifrování na příkladu textu HELLO a klíče KEY, jaká je její bezpečnost a praktická implementace v jazyce C#. V současnosti slouží především jako zajímavý vzdělávací nástroj, nikoli pro reálnou kryptografickou ochranu.

Napsat komentář

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