Python/Project

파이썬 고전 암호(치환 암호 구현).ver 2 - 공부하는 도비

DOVISH WISDOM 2021. 2. 3. 19:10  
728x90
반응형

2021/02/03 - [파이썬/프로젝트] - [파이썬] 고전 암호(치환 암호 구현).ver 1 - 공부하는 도비

 

[파이썬] 고전 암호(치환 암호 구현).ver 1 - 공부하는 도비

# 고전 암호 - 치환 암호 def substitution_codebook(): encbook = {'a':'c', 'b':'f', 'c':'d', 'd':'p', 'e':'z', 'f':'j', 'g':'h', 'h':'a', 'i':'b', 'j':'l', 'k':'m',\ 'l':'n', 'm':'e', 'n':'q', 'o':'y'..

yang-wistory1009.tistory.com

저번엔 사용자가 임의로 치환하고자 하는 값을 미리 소스코드에 정의해뒀는데, 사실 알파벳 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)

 

이렇게 고전 암호인 치환 암호를 파이썬으로 구현해보았습니다.

 

반응형