Aplikácia modulárnej aritmetiky v kryptografii

Caesarova a Vigenèrova šifra

Author

Kateryna Boiko

Published

June 20, 2026

1 Úvod

Modulárna aritmetika predstavuje jeden zo základných stavebných kameňov aplikovanej matematiky a je neoceniteľná v oblasti kryptografie. Tento projekt sa zaoberá implementáciou a analýzou dvoch klasických šifrovacích metód — Caesarovej a Vigenèrovej šifry — v programovacom prostredí R. Základy efektívnej manipulácie s dátami v tomto prostredí vychádzajú z metodických postupov, ktoré popisuje Bacigál (2022).

Cieľom je demonštrovať praktickú aplikáciu teoretických matematických konceptov a ukázať, ako jednoduché operácie modulo vedú k vytvoreniu funkčných šifrovacích systémov.

2 Teoretické pozadie

Teoretické základy klasickej kryptografie, symetrických šifier a ich historický kontext podrobne rozoberá vo svojej práci Stallings (2020).

2.1 Modulárna aritmetika

Dve celé čísla \(a\) a \(b\) sú kongruentné modulo \(n\), ak platí: \[a \equiv b \pmod{n} \quad \Leftrightarrow \quad n \mid (a-b)\]

2.2 Caesarova šifra

Každé písmeno abecedy (A–Z) je reprezentované číslom \(0\)\(25\). Šifrovanie prebieha podľa vzorca: \[E(x) = (x + k) \mod 26\]

2.3 Vigenèrova šifra

Používa kľúčové slovo, ktoré definuje rôzne posuny pre jednotlivé písmená: \[E(x_i) = (x_i + k_{i \mod m}) \mod 26\] kde \(m\) je dĺžka kľúča.

Code
encrypt_caesar <- function(text, shift = 3) {
  codes <- utf8ToInt(toupper(text))
  is_letter <- codes >= 65 & codes <= 90
  codes[is_letter] <- (codes[is_letter] - 65 + shift) %% 26 + 65
  intToUtf8(codes)
}

decrypt_caesar <- function(text, shift = 3) {
  encrypt_caesar(text, (26 - shift) %% 26)
}

encrypt_vigenere <- function(text, key) {
  if (nchar(key) == 0) return(text)
  text_upper <- toupper(text)
  key_upper <- toupper(str_extract_all(key, "[A-Z]")[[1]])

  codes <- utf8ToInt(text_upper)
  pos <- which(codes >= 65 & codes <= 90)
  if (length(pos) == 0) return(text)

  text_nums <- codes[pos] - 65
  key_nums  <- utf8ToInt(paste0(key_upper, collapse = "")) - 65
  full_key  <- rep(key_nums, length.out = length(text_nums))

  enc_nums <- (text_nums + full_key) %% 26
  codes[pos] <- enc_nums + 65

  intToUtf8(codes)
}

3 Praktická časť a analýza textu

V tejto časti demonštrujeme aplikáciu vytvorených funkcií na konkrétnych textových údajoch a analyzujeme vplyv šifrovania na distribúciu znakov. Príklad výpočtu a transformácie je znázornený v Table 1.

Code
text <- "PINEAPPLE"
key  <- "DOG"
zasifrovane <- encrypt_vigenere(text, key)

tab <- data.frame(
  Pozícia = 1:nchar(text),
  Pôvodné = str_split(text, "")[[1]],
  Zašifrované = str_split(zasifrovane, "")[[1]]
)
kable(tab)
Table 1: Príklad šifrovania textu „PINEAPPLE“ pomocou Vigenèrovej šifry s kľúčom „DOG“
Pozícia Pôvodné Zašifrované
1 P S
2 I W
3 N T
4 E H
5 A O
6 P V
7 P S
8 L Z
9 E K

Ako môžeme vidieť na Figure 1, distribúcia frekvencií sa pri rôznych šifrách výrazne líši.

Code
original <- "THIS IS A LONGER EXAMPLE TEXT FOR FREQUENCY ANALYSIS IN CRYPTOGRAPHY USING MODULAR ARITHMETIC IN R LANGUAGE"

caesar <- encrypt_caesar(original, 7)
vigenere <- encrypt_vigenere(original, "CRYPTO")

freq <- function(txt) {
  letters_only <- unlist(str_extract_all(toupper(txt), "[A-Z]"))
  df_letters <- data.frame(Pismeno = factor(letters_only, levels = LETTERS))

  df_letters %>%
    group_by(Pismeno) %>%
    summarise(Pocet = n(), .groups = "drop") %>%
    complete(Pismeno = factor(LETTERS, levels = LETTERS), fill = list(Pocet = 0))
}

df <- bind_rows(
  freq(original)  %>% mutate(Typ = "Originál"),
  freq(caesar)    %>% mutate(Typ = "Caesar (shift 7)"),
  freq(vigenere)  %>% mutate(Typ = "Vigenère (kľúč CRYPTO)")
)

ggplot(df, aes(x = Pismeno, y = Pocet, fill = Typ)) +
  geom_col(position = "dodge") +
  facet_wrap(~ Typ, ncol = 1) +
  theme_minimal() +
  labs(y = "Počet výskytov písmen") +
  theme(legend.position = "none")
Figure 1: Frekvenčná analýza – porovnanie originálneho textu a zašifrovaných verzií

Cyklické správanie operácie modulo 26 je podrobne vizualizované na Figure 2.

Code
df_mod <- data.frame(
  Index = 1:200,
  Zvysok = (1:200) %% 26
)

p <- ggplot(df_mod, aes(x = Index, y = Zvysok, color = Zvysok,
                        text = paste("Index:", Index, "<br>Zvyšok mod 26:", Zvysok))) +
  geom_line(alpha = 0.7) +
  geom_point(size = 2) +
  scale_color_gradient(low = "blue", high = "red") +
  labs(x = "Pozícia", y = "Hodnota modulo 26") +
  theme_minimal()

ggplotly(p, tooltip = "text")
Figure 2: Periodické správanie operácie modulo 26

4 Záver

V tomto projekte som úspešne implementovala Caesarovu a Vigenèrovu šifru pomocou modulárnej aritmetiky v jazyku R. Ukázalo sa, že Caesarova šifra je veľmi náchylná na frekvenčnú analýzu, zatiaľ čo Vigenèrova šifra je vďaka premennému posunu odolnejšia.

Projekt spája teoretickú matematiku s praktickou implementáciou a dátovou vizualizáciou, čo plne spĺňa požiadavky predmetu „Softvér na analýzu dát“.

Možné rozšírenia: automatická dešifrovacia metóda pre Caesarovu šifru, testovanie na reálnych textoch, implementácia moderných algoritmov (napr. RSA).

5 Prehľad použitej literatúry

Bacigál, Tomáš. 2022. Základy Práce so Softvérom Na Analýzu Dát. Slovenská technická univerzita v Bratislave.
Stallings, William. 2020. Cryptography and Network Security: Principles and Practice. 8th ed. Pearson.