크립텍트, 에너그램
암호화, 평문, 암호문, 복호화
암호화 Encryption
f(plain) = encrypted
복호화 Decryption
f(-1)(encrypted) = plain
-1 = 역함수
암호문들의 집합
복호화
@ A
# = > B
$ C
암호화
A @
B = > #
C $
====암호함수의 중요한 점====
암호화는 쉬운데 복호화가 어려운 것, 암호함수의 역함수를 쉽게 찾을 수 있으면 안된다
일방향 함수
고전암호
======전치암호======
전치암호는 평문의 문자 순서를 재배치하여 암호화하는 것이다
======치환암호======
아래는 각각의 암호학에 맞게 코딩한 python 코드이다.
스키테일 ( scytale )
스키테일 암호는 APPLE이라는 문자열이 있을 때 key값을 n으로 해주었을 때 A와 P사이에 랜덤 값을 n-1개넣어줘서 암호화 시키는 방식이다.
암호화 코드
import random
import string
print("[*] SCYTALE - ENCRYPT")
plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Scytale Key >> ")
comp = ""
for i in range(0, len(plain)):
comp += plain[i]
for j in range(0, int(key)-1):
comp += random.choice(string.ascii_letters)
print(comp)
복호화 코드
print("[*] SCYTALE - ENCRYPT")
plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Scytale Key >> ")
comp = ""
for i in range(0, len(plain)):
if(i % int(key) == 0):
comp += plain[i]
print(comp)
카이사르 ( caesar )
카이사르 암호는 A라는 문자를 받으면 아스키코드값에서 n번째 뒤에 떨어지거나 n번째 앞에 있는값으로 치환하여 암호화해주는 방식이다.
암호화
print("[*] Caesar - ENCRYPT")
plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Caesar Key >> ")
comp = ""
comp = ""
for i in range(0, len(plain)):
comp += chr(ord(plain[i]) + int(key))
print(comp)
복호화
print("[*] Caesar - ENCRYPT")
plain = input("[+] Input Plain Text >> ")
key = input("[+] Input Caesar Key >> ")
de_c = ""
num = ""
for i in range(0, len(plain)):
de_c += chr(ord(plain[i]) - int(key))
print(de_c)
복호화 ( Brute Force )
inp = input("[+] 복호화할 문자열을 입력하세요 : ")
inp1 = input("[+] 그 중에서 찾을 문자열을 입력하세요 : ")
comp = ""
# Brute Force
for i in range(0, 26):
# 문자열 변환
for j in range(0, len(inp)):
# 대소문자 구분
if inp[j].isupper() == True:
comp += chr((ord(inp[j]) - ord('A') + int(i+1))%26 + ord('A'))
else:
comp += chr((ord(inp[j]) - ord('a') + int(i+1))%26 + ord('a'))
# search String
if inp1.lower() in comp.lower():
print("================================================\n[+] 복호화된 암호문 : %s"%comp)
print("[+] key 값 : %d"%i)
break
비즈네르 ( Vigenère )
암호화
inp = input("비르네르 암호화 시킬 문자열을 입력해주세요 : ")
key = input("key 값 : ")
x = ""
y = ""
# 공백 제거
inp = inp.replace(" ", "")
key = key.replace(" ", "")
# 암호화
for i in range(0, len(inp))
# 비즈네르에서 x값 설정
x = (ord(key[i % len(key)].upper()) - ord('A')) % 26
# 비즈네르에서 y값 설정한 뒤, y에 저장
y += chr((ord(inp[i].upper()) - ord('A') + int(x)) % 26 + ord('A'))
# x, y에 위치한 값 출력
print(y)
복호화는 한줄만 바꾸면 된다
y += chr((ord(inp[i].upper()) - ord('A') + int(x)) % 26 + ord('A'))에서
+ int(x) > - int(x)
인코딩
문자 코드를 기준으로 문자를 코드로 변환하는 것을 문자 인코딩, 코드를 문자로 변환하는 것을 문자 디코딩이라 한다
입력 데이터를 컴퓨터 속에서 사용하는 코드로 변환하는 것 = 문자를 코드로 변환
디코딩
변환된 코드를 다시 부호화되기 전으로 되돌리는 처리 방식 = 코드를 문자로 변환
암호화와 인코딩의 차이
인코딩은 데이터 가용성을 유지하기위한 것이며 공개적으로 사용할 수있는 스키마를 사용합니다.
암호화는 데이터 기밀성을 유지하기위한 것이므로 특정한 사람만 변환을 되돌릴 수 있다.
암호화 해시
해시는 평문을 암호화된 문장으로 만들어 주는 기능만 한다 문자열의 길이 또한 암호화가 되더라도 일정하다
암호화(Encryption)는 암호화로 만들어주는 것 뿐만 아니라 그 문장을 다시 복호화해주는 기능을 제공한다