algorithm

[python] 카이사르 암호화(Caesar cipher) 알고리즘

HANBEEN 2020. 11. 4. 21:48
반응형

카이사르 암호화란 고대 로마의 카이사르가 사용했다고 알려졌다.

평문에 있는 문자가 알파벳의 N번째 문자라면, 이것을 N+K 번째 문자로 교체하는 원리

예를 들어 K = 1 이라고 한다면, A -> B 가 되고, B -> C가 되는 원리

 

예를들어 'APPLE  BANANA' 라는 문장이 있고 k = 1 이라면

암호문은 'BQQMFACBOBOB' 가 될 것이다.

 

* 여기 암호문에서의 A는 빈칸을 의미한다.

이유는 A~Z 중 A앞에 공백부터 시작한다고 생각하면 쉽다.

(빈칸) A B C ... X Y Z

 

<암호화 소스코드>

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

먼저 암호문 함수는 평문 p와, 몇 번을 뛸 지 k 를 매개변수로 받는다

그런다음, 구해야할 암호문을 C로 정의한다.

그리고 나서 평문의 길이만큼 반복문을 돌려준다.

반복문에서는 평문 p 인수의 ord 함수를 이용하여 아스키코드값을 구해준다.

그런 다음 아스키값에 +K 만큼의 값을 더해주고 암호문 문자열 C에 더해준다

여기서 만약 평문에 띄어쓰기 (아스키값 32) 가 나온다면 64 로 바꿔준다 

이유는 아스키값 33~64는 사용하지 않고 우리는 뛰어쓰기(32) 다음 A값(65)로 넘어가기 때문이다.

또한 우리는 Z값(90) 다음 다시 앞으로 돌아가기 때문에 만약 아스키값이 90보다 크다면 - 27을 해주어서

다시 앞 문자로 돌아갈 수 있도록 맞춰준다.

 

 

아스키코드 값

<복호화 소스코드>

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

복호화는 암호화의 반대라고 생각하면 쉽다.

암호화에서는 아스키값에 k 값을 더해줬으니 

복호화에서는 아스키값에 k 값을 빼주면 된다.

나머지 조건문 원리도 같다.

 

<전체적인 소스코드>

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

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

plainText = 'APPLE BANANA'
k = 1
print('평 문 : ', plainText)
cipherText = encipher(plainText, k)
print('암호문 : ', cipherText)
print('복호문 : ', decipher(cipherText, k))

<결과>

 

반응형