- Caesar 암호는 주어진 평문에 대하여 알파벳 순서에서 +3을 한 암호화 이다. 예를 들어 'ABC' 라는 평문이 주어지면 'DEF'가 되는 것이다. 주의할 점은 +3을 하고 마지막 부분 'XYZ'는 암호화를 진행하면 'ABC'가 된다. 시저암호에 대한 암호화, 복호화 코드를 파이썬으로 간단히 구현해 본다.
<암호화>
temp = 'abcde'
temp_list = list(temp)
save = []
for x in temp_list:
temp_ord = ord(x)
temp_save = (((temp_ord + 3) - 97) % 26) + 97
save += chr(temp_save)
print('cypher : ', "".join(save))
- 해당 코드의 출력값은 다음과 같다.
- 현재 코드는 소문자만 shift 해준다. 그러나 평소 평문을 사용할 때 대문자도 사용하므로 대문자의 경우도 shift 할 수 있게 만들어 준다. 수정한 코드는 다음과 같다.
temp = 'IloveyouOHS'
temp_list = list(temp)
save = []
for x in temp_list:
temp_ord = ord(x)
if 97 <= temp_ord <= 122:
temp_save = (((temp_ord + 3) - 97) % 26) + 97
elif 65 <= temp_ord <= 90:
temp_save = (((temp_ord + 3) - 65) % 26) + 65
save += chr(temp_save)
print('cypher : ', "".join(save))
- 해당 코드의 출력값은 다음과 같다.
- 평문을 입력할 때 특수문자 또한 입력한다. 예를 들어 공백 ' ' 같은 경우도 처리를 해줘야 한다. 특수문자를 shift 할 수 있지만 Caesar 암호는 알파벳에 한정하여 shift하기 때문에 특수문자는 그대로 사용하게 만든다. 수정한 코드는 다음과 같다.
temp = 'I love you OHS!!!'
temp_list = list(temp)
save = []
for x in temp_list:
temp_ord = ord(x)
if 97 <= temp_ord <= 122:
temp_save = (((temp_ord + 3) - 97) % 26) + 97
elif 65 <= temp_ord <= 90:
temp_save = (((temp_ord + 3) - 65) % 26) + 65
else:
temp_save = temp_ord
save += chr(temp_save)
print('cypher : ', "".join(save))
- 해당 코드의 출력값은 다음과 같다.
<코드 설명>
- 라이브러리 : x
1) 평문 값을 저장하기 위한 변수 'temp'를 사용한다. 해당 변수에 평문을 배열로 만들어주기 위해 'list'함수를 이용한 temp_list 변수를 만들고 +3 shift를 한 암호화된 값을 저장하기 위한 save 변수를 배열로 정의한다.
2) 반복문 'for'을 사용하여 'temp_list'에 저장된 값을 하나씩 'x'에 불러와서 알파벳 한 개씩 +3 shift를 진행한다. 대소문자 구분을 위하여 조건문 'if'를 사용한다. 'temp_ord'는 'ord'함수를 이용하여 문자열을 아스키코드 형태로 바꾼 값을 저장한다. 'temp_ord'에 저장된 값을 이용하여 대소문자 구분을 하고 특수문자는 그대로 출력하게 'if'조건문을 작성한다. 아스키 코드에서 대문자는 65 ~ 90 범위에 있고 소문자는 97 ~ 122 범위에 있다. 특수문자의 경우는 shift 없이 출력하기 때문에 'temp_save' 변수에 그대로 넣어준다. 해당 조건문을 거쳐서 나온 값을 'save' 변수에 넣어준다.
3) 마지막으로 'save' 변수에 저장된 배열을 출력한다. '"".join(save)'를 이용하면 배열의 값을 문자열 형태로 붙여준다.
* 'temp' 변수의 값을 'input()'으로 변경하면 입력값을 받아 출력하는 형태로 사용할 수 있다.
<복호화>
temp = 'I love you OHS!!!'
temp_list = list(temp)
save = []
for x in temp_list:
temp_ord = ord(x)
if 97 <= temp_ord <= 122:
temp_save = (((temp_ord + 3) - 97) % 26) + 97
elif 65 <= temp_ord <= 90:
temp_save = (((temp_ord + 3) - 65) % 26) + 65
else:
temp_save = temp_ord
save += chr(temp_save)
print('cypher : ', "".join(save))
c_temp = "".join(save)
c_list = list(c_temp)
save = [] for x in c_list:
temp_ord = ord(x)
if 97 <= temp_ord <= 122:
temp_save = (((temp_ord - 3) - 97) % 26) + 97
elif 65 <= temp_ord <= 90:
temp_save = (((temp_ord - 3) - 65) % 26) + 65
else:
temp_save = temp_ord
save += chr(temp_save)
print('dec : ', "".join(save))
<코드 설명>
- 앞의 코드에서 -3 한 형태로 출력한 것이다.
'Crypto' 카테고리의 다른 글
Affine 암호 [Crypto] (0) | 2020.02.15 |
---|---|
Pigpen 암호 [Crypto] (0) | 2020.02.15 |
정보보호 역사(근대 암호) [Crypto] (0) | 2020.02.12 |
정보보호 역사 (고대암호) [Crypto] (0) | 2020.02.09 |
'Euclid 호제법'을 이용한 역원 구하기 (1) | 2020.02.07 |