고전 암호학 versus 현대 암호학
고전 암호
치환(Substitution) & 전치(Trasposition)
- 치환(Substitution) 암호 = 대치 암호
- 전치(Transposition) 암호 = 전이식 암호 = 이동 암호
암호단위:(고전암호)문자, (현대암호)비트
1. 시저(Caesar) 암호
시저 암호(Caesar Chipher)란?
시저(Caesar) 암호 = 카이사르 암호 = 케사르 암호
- 더하기 암호(Shift Cipher, Additional Cipher)
- 단순 치환(대치식) 암호 = 단일 문자 치환(Monoalphabetic Cipher)
시저암호(Caesar Cipher)
- 줄리어스 시저(유리우스 케사르)가 사용하였다는 암호
- 평문으로 사용되는 알파벳을 일정한 문자수 만큼 "평행이동" 시킴으로써 암호화
시저 암호(Caesar Cipher)의 암호화
C = (P + K) mod 26 N = (k + 3) mod 26 |
시저암호 암호화 예 (키:3)
평문 : kabsoonyee
암호문: NDEVRRQBHH
시저 암호의 복호화
P = (C - K) mod 26 k = (N - 3) mod 26 |
시저암호 복호화 예(키:-3)
암호문: NDeVRRQBHH
평문 : kabsoonyee
전사 공격(Brute Force Attack)에 의한 해독
시저 암호(Seasar Cipher) => 전사 공격(Brute Force Attack)
전사 공격(Brute-force attack)
키가 될 수 있는 모든 가능한 후보들을 시도해 보는 방법
[실습] 시저(Caesar) 암호(암호화/복호화)
(조건) 다음과 같은 조건이 있다.
- 평문 입력은 소문자만 가능하다.
- 문자(소문자)외에 글자(예: 숫자)들은 암호화 하지 않는다.(EX: 입력=> 'hello4')
- 출력은 반드시 대문자로 변환한다.(EX: 소문자(a) => 대문자(A))
시저 암호
암호화 | 복호화 |
* 암호시스템 : 시저 암호 * 키 : 5 * 입력 평문 : nice to meet you * 출력 암호문 : ? (ㄱ) 대문자로 변환 (ㄴ) (문자 + 5) mod 26 |
* 암호시스템 : 시저 암호 * 키 : -5 * 입력 암호문 : SNHJ YT RJJY DTZ * 출력 평문 : ? (ㄱ) (문자 - 5) mod 26 (ㄴ) 소문자로 변환 |
caesarCipher.py
import random
import sys
import transposition
def main():
random.seed(42) # 무작위 랜덤 함수의 초기화를 위한 시드값을 상수로 설정 한다.
for i in range(20): # 20회 테스트 한다.
# 테스트용 무작위 메세지를 생성한다.
# 생성된 메세지는 길이가 임의의 값이 될것이다.
message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * random.randint(4, 40)
# plaintext 문자열을 뒤섞기 위해 리스트를 만든다.
message = list(message)
# 리스트의 요소 뒤섞기
random.shuffle(message)
# 리스트를 다시 문자열로 전환
message = ''.join(message)
print("Test #%s: |%s|" % (i+1, message[:50]))
# 각 message에 대해 가능한 모든 키 값을 확인한다.
for key in range(1, int(len(message)/2)):
encrypted = transposition.transposition_cipher_encrypt(message, key)
decrypted = transposition.transposition_cipher_decrypt(encrypted, key)
# 원래 message의 복호화된 message가 틀리면 에러 메세지를 출력하고 종료
if message != decrypted:
print('Mismatch with key %s and plaintext %s' % (key, message))
print('Decrypted as: ' + decrypted)
sys.exit(1)
print('Transposition cipher test passed.')
if __name__ == '__main__':
main()
caesarCipher2.py
import random
import sys
import transposition
def main():
random.seed(42) # 무작위 랜덤 함수의 초기화를 위한 시드값을 상수로 설정 한다.
for i in range(20): # 20회 테스트 한다.
# 테스트용 무작위 메세지를 생성한다.
# 생성된 메세지는 길이가 임의의 값이 될것이다.
message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * random.randint(4, 40)
# plaintext 문자열을 뒤섞기 위해 리스트를 만든다.
message = list(message)
# 리스트의 요소 뒤섞기
random.shuffle(message)
# 리스트를 다시 문자열로 전환
message = ''.join(message)
print("Test #%s: |%s|" % (i+1, message[:50]))
# 각 message에 대해 가능한 모든 키 값을 확인한다.
for key in range(1, int(len(message)/2)):
encrypted = transposition.transposition_cipher_encrypt(message, key)
decrypted = transposition.transposition_cipher_decrypt(encrypted, key)
# 원래 message의 복호화된 message가 틀리면 에러 메세지를 출력하고 종료
if message != decrypted:
print('Mismatch with key %s and plaintext %s' % (key, message))
print('Decrypted as: ' + decrypted)
sys.exit(1)
print('Transposition cipher test passed.')
if __name__ == '__main__':
main()
'현대 암호학' 카테고리의 다른 글
[현대 암호학] 03-4. 전치 암호와 치환 암호 (0) | 2021.06.21 |
---|---|
[현대 암호학] 03-2. 단일 치환 암호 (0) | 2021.06.18 |
[현대 암호학] 02. 암호의 세계(2) (0) | 2021.06.18 |
[현대 암호학] 02. 암호의 세계(1) (0) | 2021.06.18 |
[현대 암호학] 01. 정보 보호 개요 (0) | 2021.06.18 |