반응형
비즈네르 암호화란 평문의 각 문자에 대해 서로 다른 변환표를 사용하는 것이다.
여기서 평문의 문자들은 위치에 따라 다른 간격의 밀기 방식으로 치환하여 사용한다
예를들어, 아래와 같은 키와 평문이 있다고 한다면
키 : "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))
* 공부하면서 이해한 대로 올린 글이라 틀린 부분이 있으면 말씀해주세요!
반응형
'algorithm' 카테고리의 다른 글
[프로그래머스 level1] 실패율 - 파이썬 (0) | 2021.06.19 |
---|---|
[python] 선택 정렬 (selection sort) (0) | 2020.11.22 |
[python] RSA (Rivest, Shamir and Adleman) 알고리즘 (0) | 2020.11.06 |
[python] 카이사르 암호화(Caesar cipher) 알고리즘 (1) | 2020.11.04 |
[python] 보이어 무어 알고리즘 (Boyer Moore Algorithm) (0) | 2020.10.27 |