Gae Ko's Blog

[Wechall] Training: Crypto - Caesar I 본문

암호/Wechall Crypto

[Wechall] Training: Crypto - Caesar I

Gae Ko 2018. 6. 27. 03:09

[문제]





[풀이]


시저 암호에 관한 문제인거 같다. 처음 들어보는 나는 시저암호가 무엇인지 찾아보았다.  


시저 암호(Ceasar cipher)란 암호학에서 다루는 간단한 치환암호의 일종이다. 암호화하고자 하는 내용을 알파벳별로 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 방식이다. -wiki-


처음엔 뭣도 모르고 손으로 써가면서 찾아보았는데 코드로 돌리면 된다는 말을 듣고 코드를 짜보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## WeChall cryto-Ceasar 1 
 
 
# a : 암호화된 문장
= "NBY KOCWE VLIQH ZIR DOGJM IPYL NBY FUTS XIA IZ WUYMUL UHX SIOL OHCKOY MIFONCIH CM JAYLJMIYYFFG"
 
for j in range(25): # j is 0 ~ 25
        print 'j : %d' % j
        c = '' # result 
        for i in range(len(a)):
                if(a[i] != " "):
                        k = (ord(a[i])+j-65)%26 + 65 # 65 = chr('A')
                        c += chr(k)
                else:
                        c += ' '
        print c
 
cs



위 코드는 암호화된 문장에 대해서 알파벳별로 j만큼 밀어낸 결과의 알파벳으로 출력해준다.

(암호화문이 대문자만 존재하는 경우에 대해서만 생각하였다.) 

변수 a는 암호화된 문장이고 변수 c에는 a의 각 문자열에 대해서 공백이 아닌 문자열만 j만큼 밀어낸 결과를 저장한다. 

변수 k는 변환되는 아스키코드값을 저장하는 역할을 한다. 


위 코드를 돌린 결과는 다음과 같다.



j=6일 때가 평문임을 알 수 있다. 

즉, 평문에서 알파벳을 뒤로 6칸 밀은 알파벳으로 치환했음을 알 수 있었다.



Clear! 


다른 사람들이 짠 코드를 보려고 구글링해보니 시저암호를 복호화하는 함수를 정의하여 사용하는 걸 보고 나도 해보았다. ㅎㅎ 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Decryption Function of Ceasar crypto
 
def ceasar(ciphertext, key):
        plaintext = ''
        for i in ciphertext:
                if(i.islower()): # i is small letter
                        plaintext += chr((ord(i) + key - ord('a')) % 26 + ord('a'))
                elif(i.isupper()): # i is capital letter
                        plaintext += chr((ord(i) + key - ord('A')) % 26 + ord('A'))
                else# i is blank
                        plaintext += ' '
        return plaintext
 
 
# Test
= "NBY KOCWE VLIQH ZIR DOGJM IPYL NBY FUTS XIA IZ WUYMUL UHX SIOL OHCKOY MIFONCIH CM JAYLJMIYYFFG"
print ceasar(a, 6)
 
cs



- ord(i) : 문자 i에 대해 아스키코드 값을 반환 

- chr(n) : 아스키코드 값 n에 대해서 문자를 반환 

- i.islower() : 문자열 i 에 대해서 모두 소문자이면 true 

- i.isupper() : 문자열 i 에 대해서 모두 대문자이면 true 


문자열 https://kimdoky.github.io/python/2017/10/06/library-book-chap1-1.html