사용하지않는공간/Python

[Python] 원타임패드, 일회성패드 ( One-Time Pad ) 암호화/복호화 만들기

반나무 2020. 10. 6. 15:49

암호화 프로그램 

import random
import string

word = input("평문을 입력하세요 : ")
password_b = [] # 평문 -> 이진화
string_pool = string.ascii_uppercase # 키 리스트 생성
password_s = [] # 이진화 -> 암호문

key = [] # 연산용 키 리스트 초기화
keyorigin = [] # 키 리스트 오리진
ch = '' # 문자 하나 따오기
ac = 0 # ASCII code로 변환

####################

print("입력한 평문은 [%s] 입니다. > 암호화를 진행하겠습니다." %word )

# 평문 -> 이진화
for i in range(len(word)):
    ch = word[i] # 개별 문자 받기
    ac = ord(ch) # 문자 -> 아스키코드 변환
    bi = bin(ac) # 아스키코드 -> 바이너리 변환

    password_b.append(bi) # 리스트 추가

# 키 -> 이진화
for i in range(len(word)):
    #ch = ran_key[i]
    ch = random.choice(string_pool) # 개별 문자 받기
    ac = ord(ch) # 문자 -> 아스키코드 변환
    bi = bin(ac) # 아스키코드 -> 바이너리 변환
    keyorigin.append(ch) # 출력할 키 추가
    key.append(bi) # 리스트 추가
    
# 암호화
for i in range(len(password_b)):
    code1 = int(password_b[i],2) # 이진화된 평문을 연산하기위해 정수형 변환
    code2 = int(key[i],2) # 이진화된 키를 연산하기위해 정수형 변환

    password_s.append(chr((code1^code2))) # 평문과 키 XOR연산

# 키, 암호문 출력
print("키 : %s" % ''.join(keyorigin))
print("암호문 : %s" %''.join(password_s))

복호화 프로그램

import random
import string

word = input("암호문을 입력하세요 : ")
keyin = input("키를 입력하세요")
password_b = [] # 암호문 -> 이진화
password_s = [] # 이진화 -> 평문

key = [] # 키 리스트 초기화
ch = '' # 문자 하나 따오기
ac = 0 # ASCII code로 변환
##############################################
print("입력한 암호문은 [%s] 입니다. > 복호화를 진행하겠습니다." %word )


# 암호문 -> 이진화
for i in range(len(word)):
    ch = word[i] # 개별 문자 받기
    ac = ord(ch) # 문자 -> 아스키코드 변환
    bi = bin(ac) # 아스키코드 -> 바이너리 변환

    password_b.append(bi) # 리스트 추가

# 키 -> 이진화
for i in range(len(word)):
    ch = keyin[i] # 개별 문자 받기
    ac = ord(ch) # 문자 -> 아스키코드 변환
    bi = bin(ac) # 아스키코드 -> 바이너리 변환

    key.append(bi) # 리스트 추가
    
# 복호화
for i in range(len(password_b)):
    code1 = int(password_b[i],2) # 이진화된 암호문을 연산하기위해 정수형 변환
    code2 = int(key[i],2) # 이진화된 키를 연산하기위해 정수형 변환

    password_s.append(chr((code1^code2))) # 암호문과 키 XOR연산

# 평문 출력
print("평문 : %s" %''.join(password_s))

반응형