[목차]
1. 시저 암복호화 프로그램 코딩1
2. 시저 암복호화 프로그램 코딩2
3. 단일 치환 암호 코딩
4. 주상 전치 암복호화 문제 풀기
5. 정리
[시저 암복호화 프로그램 코딩1]
#!/usr/bin/python3
# input : str('nice to meet you')
# encryption system: caesar cipher
# key : 5
# output : str('SNHJ YT RJJY DTZ')
# make encryption and decryption book
# * encbook = {'A': 0, 'B': 1, 'C': 2, ...}
# * decbook = {0 : 'A', 1 : 'B', 2 : 'C', ...}
import sys
def main():
plaintext = 'nice to meet you!'
key = 5
encbook, decbook = makebook()
# (1) encryption
key = 5
encrypted = translate(plaintext, key, encbook, decbook, 'encryption')
print('Plaintext: ', plaintext)
print('Enctrypted: ', encrypted)
# (2) decryption
key = -5
decrypted = translate(encrypted, key, encbook, decbook, 'decryption')
print("Decrypted: ", decrypted)
def translate(msgs, key, enc, dec, mode):
# input : dict(encbook), dict(decbook), int(key), str(msgs), str(encryption|decryption)
# output : str(translated)
# function:
# * caesar Cipher Algorithm: C = ( P + K ) mod 26
# print(msg, key, enc)
translated = ''
if mode == 'encryption':
msgs = msgs.upper()
for msg in msgs:
# print(msg)
if msg in enc:
dict_key = (enc[msg] + key) % 26
translated += dec[dict_key]
else:
translated += msg
if mode == 'decryption':
results = translated.lower()
return results
return translated
def makebook():
# input: None
# output: dict(encbook), dict(decbook)
# function: encbook, decbook을 만든다.
encbook = {}
decbook = {}
for i in range(0, 26):
print(chr(65 + i),i)
key = chr(65+i)
value = i
encbook[key] = value
decbook[value] = key
print(encbook, decbook)
return encbook, decbook
if __name__ == '__main__':
main()
[시저 암복호화 프로그램 코딩 2]
def main():
mysymbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 !?."
mymsgs = "This is my secret plaintext."
mykey = 13
encrypted = enc_caesar_cipher(mymsgs, mykey, mysymbols)
print("Plaintext: ", mymsgs)
print("Ciphertext: ", encrypted)
decrypted = dec_casesar_cipher(encrypted, mykey, mysymbols)
print("Decrypted :", decrypted)
def dec_casesar_cipher(msgs, key, symbols):
# print(msgs, key, symbols)
dec_str = ''
for msg in msgs:
#print(msg)
if msg in symbols:
# P = (C - Key) % len(symbols)
symbols_index = symbols.find(msg)
symbols_len = len(symbols)
translated_index = (symbols_index - key) % symbols_len
dec_str += symbols[translated_index]
else:
dec_str += msg
return dec_str
def enc_caesar_cipher(msgs, key, symbols):
# input: str(msg), int(key), str(symbol)
# output: enc_str
# function:
# print(msgs, key, symbols)
enc_str = ''
for msg in msgs:
# print(msg)
if msg in symbols:
# C = (P + K) % len(symbols)
symbols_index = symbols.find(msg)
#print(symbols_index) ; input()
symbols_len = len(symbols)
translated_index = (symbols_index + key) % symbols_len
enc_str += symbols[translated_index]
else:
enc_str += msg
return enc_str
if __name__ == "__main__":
main()
위 파일을 모듈로 활용해 작성한 코드
import caesarCipher
myencrypted_msg = "guv5Jv5Jz!J5rp4r6J2ynv06r 6M"
mysymbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 !?."
def main():
for key, ch in enumerate(mysymbols):
# print(key, ch)
decrypted = caesarCipher.dec_casesar_cipher(myencrypted_msg, key, mysymbols)
print("Key #%d: %c - |%s|" %(key, ch, decrypted))
if __name__ == '__main__':
main()
[단일 치환 암호 코딩]
# input : encbook, decbook, str('hello world')
# * encbook = {'h':'A', 'e':'K',...}
# * decbook = {'A':'h', 'K':'e',...}
# output : encrypted_msg or decrypted_msg
# function :
def main():
myencbook = {'h': 'A', 'e': 'K', 'l': 'O', 'o': 'B', 'w': 'L', 'r': 'Z', 'd': 'Y'}
mydecbook = makebook(myencbook)
# print(mydecbook)
mymsg = 'hello world!!'
# (1) encryption
encrypted = substitution(mymsg, myencbook)
print("Plaintet : ", mymsg)
print("Ciphertext: ", encrypted)
# (2) decryption
decrypted = substitution(encrypted, mydecbook)
print("Decryted : ", decrypted)
def substitution(msg, keytab):
# input: str(msg), dic(keytab)
# output : str(enc_msg|dev_msg)
# print(msg, enc)
translated = ''
for i in msg:
# print(i)
if i in keytab:
translated += keytab[i]
else:
translated += i
# print(translated)
return translated
def makebook(enc):
# input : dict(enc)
# output : dict(dec)
# decbook = {v: k for k, v in enc.items()}
# print(decbook)
return {v: k for k, v in enc.items()}
if __name__ == '__main__':
main()
[주상 전치 암복호화 문제풀기]
transposition_Encrypt.py
# 주상 전치 암호화 - 1st version # # (1) 입력 : 평문 메세지 (Input: Common sense is not so common.) # (2) 출력 : 주상 전치 암호화/복호화 후 메세지 (Ouput: |Cenoonommstmme oo snnio. s s c|) # (3) 기능 : # * 평문 메세지를 입력으로 받아서 # * 주상 전치 암호화 알고리즘을 이용하여 암호화/복호화 한다. # (4) [참고] 전치 암호화 과정 # 1) messages와 key의 문자 수를 센다. # 2) 키와 같은 개수의 상자를 한줄에 그린다.(예: 키가 8개면 상자 8개) # 3) 왼쪽에서 오른쪽으로 상자를 채우고 상자 한개에 글자 한개를 넣는다. # 4) 문자가 상자 끝에 이르면 상자의 줄을 한 줄 더 그린다. # 5) 마지막 문자까지 오면 마지막 행에 있는 사용하지 않은 상자는 칠해 둔다. # 6) 왼쪽 상단부터 시작해 각 열을 내려가면서 문자를 쓴다. # 열의 가장 아래에 이르면 오른쪽의 다음 열로 이동한다. # 지운 상자는 건너뛴다. 이것이 암호문이 된다. |
암호시스템 : 주상 전치 암호 키 : 8 입력 평문 : Common sense is not so common. 출력 암호문: ? |
import transpositionDecrypt
def main():
mymsgs = "Common sense is not so common."
mykey = 8
enc_msg = encrypt_transposition(mymsgs, mykey)
print("Plaintext: |%s|" % mymsgs)
print("Ciphertext: |%s| " % enc_msg)
dec_msg = transpositionDecrypt.decrypt_transposition(enc_msg, mykey)
print("Decrypted : |%s|" % dec_msg)
def encrypt_transposition(msgs, key):
encrypted = [''] * key
print(encrypted)
for n, ch in enumerate(msgs):
# print(n, ch)
list_index = n % key
encrypted[list_index] += ch
return ''.join(encrypted)
if __name__ == '__main__':
main()
transposition_Decrypt.py
# 주상 전치 복호화 - 1st version # # (1) 입력 : 평문 메세지 (Input: Common sense is not so common.) # (2) 출력 : 주상 전치 암호화/복호화 후 메세지 (Ouput: ) # (3) 기능 : # * 평문 메세지를 입력으로 받아서 # * 주상 전치 암호화 알고리즘을 이용하여 암호화/복호화 한다. # (4) [참고] 전치 암호화 과정 # 1) messages와 key의 문자 수를 센다. # 2) 키와 같은 개수의 상자를 한줄에 그린다.(예: 키가 8개면 상자 8개) # 3) 왼쪽에서 오른쪽으로 상자를 채우고 상자 한개에 글자 한개를 넣는다. # 4) 문자가 상자 끝에 이르면 상자의 줄을 한 줄 더 그린다. # 5) 마지막 문자까지 오면 마지막 행에 있는 사용하지 않은 상자는 칠해 둔다. # 6) 왼쪽 상단부터 시작해 각 열을 내려가면서 문자를 쓴다. 열의 가장 아래에 이르면 오른쪽의 다음 열로 이동한다. # 지운 상자는 건너뛴다. 이것이 암호문이 된다. |
암호 시스템: 주상 전치 암호 입력 암호문: Cenoonommstmme oo snnio. s s c 키 : 8 출력 평문 : ?
■ 올림 import math math.ceil(len(messages)/key) ■ 올림, 내림, 반올림 math.ceil() : 올림, meth.floor(), 내림, math.round() : 반올림 |
import math
def main():
mymsgs = "Cenoonommstmme oo snnio. s s c"
mykey = 8
decrypt_transposition(mymsgs, mykey)
def decrypt_transposition(msgs, key):
# input : str(msgs(encrypted))
# output : int(key)
# print(msgs, key)
msgs_size = len(msgs)
list_index = math.ceil(msgs_size / key)
total_array_size = key * list_index
black_box_size = total_array_size - msgs_size
#print("=> 30 :", msgs_size)
#print("=> 32 :", total_array_size)
#print("=> 2 : ", black_box_size)
black_box_list = []
for i in range(black_box_size):
black_box_index = (total_array_size -1) - (i * list_index)
black_box_list.append(black_box_index)
black_box_list.reverse() # or .sort()
# print(black_box_list)
for num in black_box_list:
msgs = msgs[:num] + '^' + msgs[num:]
decrypted = [''] * list_index
for n, ch in enumerate(msgs):
# print(n, ch)
decrypted_list_index = n % list_index
decrypted[decrypted_list_index] += ch
# print("=>", decrypted)
decrypted = ''.join(decrypted)
decrypted = decrypted[:msgs_size]
# print("Decrypted : |%s|" % decrypted)
return decrypted
if __name__ == '__main__':
main()
[정리]
고전 암호
치환(Substitution) & 전치(Trasposition)
* 치환(Substitution) 암호 = 대치 암호
* 전치(Transposition) 암호 = 전이식 암호 = 이동 암호
암호단위:(고전암호)문자, (현대암호)비트
치환암호
단일 치환 암호
* 1:1 치환 암호 방식
* 빈도 정보를 통해 복호화가 가능하다(알파벳, 단어 등의 빈도 수)
* 암호문이 길수록 복호화가 쉬워진다.
* (예) 시저(caesar) 암호 -> Brute Force Attack
* (예) 아핀(affine) 암호 -> 문자/문자열 빈도수
다중 치환 암호
* 하나의 평문 알파벳에서 여러 암호 알파벳이 나올수 있다.
* 빈도 정보를 통해 복호화가 가능하다.(알파벳, 단어 빈도 수)
* 암호문이 길수록 보호화가 쉬워진다.
* (예) 비즈니어(Vigenere) 암호
-> 카시스키 분석법, 프리드만 암호공격을 통해 복호화가 가능하다.
전치암호
단일(단순) 전치 암호
* 문자의 순서를 재배치
* 암호문과 평문이 같은 문자 조합을 갖는다.
* (예) 단일 전치 암호
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day79 : 암호학 4 (0) | 2020.12.29 |
---|---|
정보보안 과정 Day78 : 암호학 3 (0) | 2020.12.28 |
정보보안 과정 Day 76-2 : 암호학 실습 (0) | 2020.12.23 |
정보보안 과정 Day 76-1 : 암호학 이론 (0) | 2020.12.23 |
정보보안 과정 Day76 : Python 마지막 (0) | 2020.12.23 |