---
# System prepended metadata

title: Vigenère cipher

---

# Vigenère cipher

## Как работи?

![](https://hackmd.io/_uploads/HyR068c_t.png)

Това се нарича 'Vigenère table', чрез нея можем да encrypt/decrypt.
### Encrypt

- ***Plain text:*** $PETER$
- ***Cipher key:*** $KEY$
- ***Alphabet:*** - $ABCDEFGHIJKLMNOPQRSTUVWXYZ$ (всички букви - 26 на брой)

**Стъпки:**
1) понеже $PETER$ е по дълга дума от $KEY$, трябва 'циклично' да повторим $KEY$ - докато не стане с дължина равна на $PETER$ (5) => $KEYKE$

2) ползваме таблицата на Vigenere, по следния начин:
![](https://hackmd.io/_uploads/By3oxvcuK.png)

2.1)  1ва буква от текста, който искаме да encrypt е $P$ гледаме ред 'P' от таблицата. 
1ва буква от ключа е $K$ търсим колона 'K' и гледаме в коя буква се пресичат 2те линии => $Z$
2.2) Аналогично за 'E' : ред 'E', колона 'E' => $I$
2.3) Аналогично за 'T' : ред 'T', колона 'Y' => $R$
2.4) Аналогично за 'E' : ред 'E', колона 'K' => $O$
2.5) Аналогично за 'R' : ред 'R', колона 'E' => $I$

// *Забележка*: попринцип се прави по колона за plain text и ред за key, но понеже Vigenere Table е симетрична няма значение

3) $PETER$ encrypted с $KEY$, се получава $ZIROV$
### Decrypt
- ***Cipher text:*** $ZIROV$
- ***Cipher key:*** $KEY$
- ***Alphabet:*** - $ABCDEFGHIJKLMNOPQRSTUVWXYZ$ (всички букви - 26 на брой)

**Стъпки:**
1) понеже $ZIROV$ е по дълга дума от $KEY$, трябва 'циклично' да повторим $KEY$ - докато не стане с дължина равна на $ZIROV$ (5) => $KEYKE$

2) Отново  ползваме таблицата на Vigenere, по следния начин:
![](https://hackmd.io/_uploads/rJ_Muw9_F.png)
2.1) 1ва буква от ключа: 'K', на ред 'K' търсим къде е 'Z' (1ва буква от cipher text) => колона $P$
2.2) 2ра буква от ключа: 'E', на ред 'E' търсим къде е 'I' (2ра буква от cipher text) => колона $E$
2.3) 3та буква от ключа: 'Y', на ред 'Y' търсим къде е 'R' (3та буква от cipher text) => колона $T$
2.4) 4на буква от ключа: 'K', на ред 'K' търсим къде е 'O' (4та буква от cipher text) => колона $E$
2.5) 5та буква от ключа: 'E', на ред 'E' търсим къде е 'V' (5та буква от cipher text) => колона $R$

3) $ZIROV$ decrypted с $KEY$, се получава $PETER$

***
## Algebra behind
//Забележка: понеже е крайно неудобно да се ползват букви, ще използваме числа (0,1,2...,25) - зад всяко число стой буква (0-A, 1-B, ..) общо 26 букви.

*Дефиниции:*
$P$ - крайно множество, съдържащо всички 'plain text' букви.
$C$ - крайно множество, съдържащо всички 'cipher text' букви.
При Vigenère, очевидно те съвпадат (Защо?)
$P=C=\Bbb Z_{26}=\Bbb Z/n\Bbb Z$ 
[Тук може да прочетеш за Zn какво представлява](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n)
$m$ - дължина на ключ
$x_i$ - буква от 'plain text' на индекс $i$ ($i$ е от 0 до дължината без 1 на 'plain text')

Нека $E_k(x_i)$ е нашата функция за encryption, тя връща $y_i$, което е буквата от 'cipher text' на индекс $i$

$$E_k(x_i) = x_i +k_{(i\bmod m)}(\bmod 26)$$

***
*Пример*:

- ***Plain text:*** $PETER$ (15, 4, 19, 4, 17)
- ***Cipher key:*** $KEY$ (10, 4, 24), $m=3$
- ***Alphabet:*** - ${0...25}$ (всички букви - 26 на брой)

$$\begin{cases}
E_{key}(x_0) = x_0 + k_{(0\bmod 3)} =x_0 + k_0  =15 + 10 = 25 , \;25\bmod 26 = 25\;(буквата\;Z) \\
E_{key}(x_1)=x_1 + k_{(1\bmod 3)} =x_1 + k_1  =4 + 4 = 8 ,\;\;\;\;\;\;\;\;\; \;8\bmod 26 =8\;(буквата\;I) \\
E_{key}(x_2) = x_2 + k_{(2\bmod 3)} =x_2 + k_2  =19 + 24 = 43 ,\; 43\bmod 26 = 17\;(буквата\;R) \\
E_{key}(x_3) = x_3 + k_{(3\bmod 3)} =x_3 + k_0  =4 + 10 = 14 , \;\;\;14\bmod 26 = 14\;(буквата\;O) \\
E_{key}(x_4) = x_4 + k_{(4\bmod 3)} =x_4 + k_1  =17 + 4 = 21 , \;\;\;21\bmod 26 = 21\;(буквата\;V)
\end{cases}
$$


Аналогично можеш да си изкараш формулата за ***'decryption'***
