카이사르 암호화란 고대 로마의 카이사르가 사용했다고 알려졌다.
평문에 있는 문자가 알파벳의 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))
<결과>
'algorithm' 카테고리의 다른 글
[프로그래머스 level1] 실패율 - 파이썬 (0) | 2021.06.19 |
---|---|
[python] 선택 정렬 (selection sort) (0) | 2020.11.22 |
[python] RSA (Rivest, Shamir and Adleman) 알고리즘 (0) | 2020.11.06 |
[python] 비즈네르(Vigenere) 암호화 알고리즘 (0) | 2020.11.05 |
[python] 보이어 무어 알고리즘 (Boyer Moore Algorithm) (0) | 2020.10.27 |