# Vigenère cipher
## Как работи?

Това се нарича 'Vigenère table', чрез нея можем да encrypt/decrypt.
### Encrypt
- ***Plain text:*** $PETER$
- ***Cipher key:*** $KEY$
- ***Alphabet:*** - $ABCDEFGHIJKLMNOPQRSTUVWXYZ$ (всички букви - 26 на брой)
**Стъпки:**
1) понеже $PETER$ е по дълга дума от $KEY$, трябва 'циклично' да повторим $KEY$ - докато не стане с дължина равна на $PETER$ (5) => $KEYKE$
2) ползваме таблицата на Vigenere, по следния начин:

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, по следния начин:

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'***