algorithm

[python] 비즈네르(Vigenere) 암호화 알고리즘

HANBEEN 2020. 11. 5. 21:44
반응형

비즈네르 암호화란 평문의 각 문자에 대해 서로 다른 변환표를 사용하는 것이다.

여기서 평문의 문자들은 위치에 따라 다른 간격의 밀기 방식으로 치환하여 사용한다

 

예를들어, 아래와 같은 키와 평문이 있다고 한다면

: "ABC"

평문 : "SAVE PRIVATE RYAN" 

A B C A B C A B C A B C
평문 S A V E   P R I V A T E
암호문 T C Y F B S S K Y B V H

와 같이 된다.

A 부분에서는 1칸을 뛴 문자가 오고, B부분에서는 2칸을 뛴 문자가 오고, C부분에서는 3칸을 뛴 문자가 오는것이다.

* 띄어쓰기 같은 경우는 A 앞이라고 가정하고 띄어쓰기에서 2칸(B)를 만나면 B가 된다. (띄어쓰기) -> A -> B

 

<암호화 소스코드>

def encipher(p, k):
    c = ''
    n = len(k)
    for i in range(len(p)):
        a = ord(p[i])
        if a == 32: a = 64
        b = ord(k[i % n]) - 64
        t = a + b
        if t > 90: t -= 27
        if t == 64: t = 32
        c += chr(t)
    return c

여기서 키마다 몇칸을 뛰울지를 결정하는 코드는 b = ord(k[i % n]) - 64 부분이라고 볼 수 있다.

 

<복호화 소스코드>

def decipher(p, k):
    c = ''
    n = len(k)
    for i in range(len(p)):
        a = ord(p[i])
        if a == 32: a = 91
        b = ord(k[i % n]) - 64
        t = a - b
        if t < 64: t += 27
        if t == 64: t = 32
        c += chr(t)
    return c

<전체 소스코드>

# 비즈네르 암호화 프로그램
def encipher(p, k):
    c = ''
    n = len(k)
    for i in range(len(p)):
        a = ord(p[i])
        if a == 32: a = 64
        b = ord(k[i % n]) - 64
        t = a + b
        if t > 90: t -= 27
        if t == 64: t = 32
        c += chr(t)
    return c

def decipher(p, k):
    c = ''
    n = len(k)
    for i in range(len(p)):
        a = ord(p[i])
        if a == 32: a = 91
        b = ord(k[i % n]) - 64
        t = a - b
        if t < 64: t += 27
        if t == 64: t = 32
        c += chr(t)
    return c

planText = 'SAVE PRIVATE RAYN'
k = 'ABC'
print('평 문 : ', planText)
cipherText = encipher(planText, k)
print('암호문 : ', cipherText)
print('복호문 : ', decipher(cipherText, k))

 

 

* 공부하면서 이해한 대로 올린 글이라 틀린 부분이 있으면 말씀해주세요!

반응형