본문 바로가기

Crypto

Caesar 암호 [Crypto]

 

 

 - 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