728x90
반응형
2021/02/03 - [파이썬/프로젝트] - [파이썬] 고전 암호(치환 암호 구현).ver 1 - 공부하는 도비
저번엔 사용자가 임의로 치환하고자 하는 값을 미리 소스코드에 정의해뒀는데, 사실 알파벳 a 부터 z 까지 겹치지 않게 신경 써서 딕셔너리를 만들고 있는 거 보단,
프로그램의 힘을 빌려 랜덤으로 겹치지 않는 알파벳을 출력받아, 그걸 치환소스로 사용하여 암호화 해볼려고 합니다.
우선, 랜덤으로 겹치지 않게 a~z 까지 든 문자열을 가지고 있어야겠죠?
파이썬은 랜덤 값을 만들 수 있는 모듈이 있습니다.
import random 을 사용하고,
알파벳 a부터 z 까지 다 치고 있을 순 없으니
import string
alpha = string.ascii_lowercase 를 사용하겠습니다.
* 겹치지 않는 랜덤한 알파벳 스트링 뽑기
랜덤이니 매번 다르게 나오겠죠?
자 이걸 이용해서, 치환 코드북을 만들어 봅시다.
alpha 변수는 a b c ~~ x y z 가 저장되어 있으니 dictionary의 key로 사용합니다.
random_alpha 변수는 랜덤 한 스트링이 저장되어 있으니 dictionary의 value로 사용합니다.
자 이제 이 dictionary를 이용해 치환 암호를 구현해봅시다.!!!
소스코드
import random
import string
def substitution_codebook():
alpha = string.ascii_lowercase
temp = ""
random_alpha = ""
for i in range(len(alpha)):
while temp in random_alpha:
temp = random.choice(alpha)
random_alpha += temp
encbook = {}
for i in range(len(alpha)):
encbook[alpha[i]] = random_alpha[i]
decbook = {}
for k in encbook:
temp = encbook[k]
decbook[temp] = k
return encbook, decbook
def encrypt(msg1, encbook):
temp = ""
for c in msg1:
c = encbook[c]
temp += c
return temp
def decrypt(msg2, decbook):
temp = ""
for c in msg2:
c = decbook[c]
temp += c
return temp
if __name__ == '__main__':
print("평 문 : ",end=" ")
plaintext = input()
encbook, decbook = substitution_codebook()
ciphertext = encrypt(plaintext, encbook)
print("암호화 : ",ciphertext)
deciphertext = decrypt(ciphertext, decbook)
print("복호화 : ",deciphertext)
이렇게 고전 암호인 치환 암호를 파이썬으로 구현해보았습니다.
반응형
'Python > Project' 카테고리의 다른 글
hashlib의 MD5 사용 - 공부하는 도비 (0) | 2022.11.21 |
---|---|
단일 치환 암호 해독 (패턴 분석 공격) - 공부하는 도비 (2) | 2022.11.14 |
파이썬 확장 유클리드 알고리즘(Extended Euclidean Algorithm) 구현 - 공부하는 도비 (0) | 2021.05.21 |
파이썬 유클리드 알고리즘(Euclidean Algorithm) 구현 - 공부하는 도비 (0) | 2021.05.21 |
파이썬 고전 암호(치환 암호 구현).ver 1 - 공부하는 도비 (0) | 2021.02.03 |