sinwindis 2021. 3. 18. 01:13
Ciphers

Ciphers

Additive Cipher

C=(Cipher),P=(PlainText),k=C = 암호화된 문장 (Cipher), P = 평문 (Plain Text), k = 키 값
C=(P+k)%26C = (P + k) \% 26 P=(Ck)%26P = (C -k)\%26

One-Time Pad

Additive Cipher의 고정된 키를 가변 키로 바꾸는 것
K의 시퀀스를 미리 서로 정해둬야 한다.
Ci=(Pi+ki)%26C_i = (P_i + k_i)\%26

Multiplicative Cipher

C = 암호화된 문장 (Cipher)
P = 평문 (Plain Text)
k = 키 값 (곱셈역이 존재해야 함)
C=(Pk)%26C = (P * k) \%26 P=(Ck1)%26P = (C * k^{-1})\%26

Affine Cipher

C = 암호화된 문장 (Cipher)
P = 평문 (Plain Text)
k1 = 곱셈 사이퍼의 키 값
k2 = 덧셈 사이퍼의 키 값
T=(Pk1)%26T = (P * k_1) \% 26C=(T+k2)%26C = (T + k_2)\%26
>->
T=(Ck2)%26T = (C -k_2) \% 26 P=(Tk11)%26P = (T * k_1^{-1})\%26

Monoalphabetic Cipher

단일 알파벳 문자를 단일 알파벳 문자로 치환한 표를 갖고 있음

a b c d e f g h i j k l m n
N O A T R B E C F U X D Q G

Statistical attack에 약함

Statistical Attack

평문에서의 알파벳의 등장 빈도를 계산해 두고, 암호문에서의 알파벳 등장 빈도와 비교하여 치환해 보며 해독하는 기법

Autokey Cipher

Index 0 1 2 3 4 5 6 7 8 9 10 11 12
Plain text a t t a c k i s t o d a y
P 00 19 19 00 02 10 08 18 19 14 03 00 24
Key 12 00 19 19 00 02 10 08 18 19 14 03 00
C 12 19 12 19 02 12 18 00 11 07 17 03 24
Cipher text M T M T C M S A L H R D Y

P’s values: 알파벳을 1~26의 숫자로 치환한 것
Key stream: 이전 P’s value
C’s values: P’s value와 Key를 더한 것

Ci=(Pi+ki)%26C_i = (P_i + k_i)\%26 Pi=(Ciki)%26P_i = (C_i-k_i)\%26

Playfair Cipher

L G D B A
Q M H E C
U R N I/J F
X V S O K
Z Y W T P

평문을 encrypt하려면 두 글자씩 나눠서 encrypt
hello의 경우 같은 두 글자 ll이 있으므로 해당 ll 사이에 미리 설정한 글자 (ex: x)를 넣어 helxlo로 만들어 둠

he -> EC

두 글자가 같은 가로줄에 있으면 각 글자를 오른쪽으로 한 칸씩 이동한다.

lx -> QZ

두 글자가 같은 세로줄에 있으면 각 글자를 아래쪽으로 한 칸씩 이동한다.

lo -> BX

그 외에는 두 글자가 이루는 직사각형에서의 반대편 row의 글자로 바꾼다.

decryption은 열심히 역연산해보자

Vigenere Cipher

autokey cipher에서 key 값만 미리 설정한 문장으로 바꾸면 됨

key가 "PASCAL"일 때 15 00 18 02 00 11 의 키 값을 반복해서 넣어줌

Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13
Plain text s h e i s l i s t e n i n g
P 18 07 04 08 18 11 08 18 19 04 13 08 13 06
Key 15 00 18 02 00 11 15 00 18 02 00 11 15 00
C 07 07 22 10 18 22 23 18 11 06 13 19 02 06
Cipher text H H W K S W X S L G N T C G

Hill Cipher

행렬곱을 이용

C=PKC = P * K

plain text: “code is ready”
m = 4 일 때

K=[k11k12k13k14k21k22k23k24k31k32k33k34k41k42k43k44]=[09071113040705060221140903232108]K=\left[\begin{array}{rrr}k_{11}&k_{12}&k_{13}&k_{14}\\k_{21}&k_{22}&k_{23}&k_{24}\\k_{31}&k_{32}&k_{33}&k_{34}\\k_{41}&k_{42}&k_{43}&k_{44}\end{array}\right] = \left[\begin{array}{rrr}09&07&11&13\\04&07&05&06\\02&21&14&09\\03&23&21&08\end{array}\right]
P=[021403040818170400032425]=[codeisreadyz]P=\left[\begin{array}{rrr}02&14&03&04\\08&18&17&04\\00&03&24&25\end{array}\right] = \left[\begin{array}{rrr}c&o&d&e\\i&s&r&e\\a&d&y&z\end{array}\right]
마지막 z는 칸을 맞추기 위한 쓰레기 값
C=(PK)%26=[140710130807061111081818]=[OHKNIHGKLISS]C = (P * K)\%26 = \left[\begin{array}{rrr}14&07&10&13\\08&07&06&11\\11&08&18&18\end{array}\right] = \left[\begin{array}{rrr}O&H&K&N\\I&H&G&K\\L&I&S&S\end{array}\right]

decryption
P=(CK1)%26P = (C * K^{-1})\%26
따라서 K는 역행렬이 존재해야 한다.

Transposition Cipher

글자들의 순서를 바꾸는 암호 방식

Keyless Transposition Cipher

“Meet me at the park”
[meetmeatthepark]\left[\begin{array}{rrr}m&e&e&t\\m&e&a&t\\t&h&e&p\\a&r&k&\end{array}\right]
에서 세로로 읽기

Keyed Transposition Cipher

key가 순열로 주어짐
key = (3 1 4 5 2)
해당 위치의 글자로 바꾸면 C가 됨
enemy -> eemyn

Double Transposition Cipher

여러 Transposition Ciphers들을 결합하여 더 강력한 암호문을 만들 수 있음

현대 암호문들은 대부분 Substitution + Transposition Cipher 형태임

Stream Cipher

입력이 스트림으로 들어오기 때문에 키도 스트림, 출력도 스트림이어야 함
Vigenere Cipher, Autokey Cipher 등이 Stream Cipher임

Block Cipher

여러 글자를 (블록 단위를) 동시에 암호화하는것
Hill Cipher 등…