일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- arrange()
- filter()
- samp;e_frac()
- mutate()
- distinct()
- 대칭형 알고리즘
- dplyr
- sample_n()
- select()
- summarize()
- AES
- groupe_by()
- proc contents
- Today
- Total
Gae Ko's Blog
[Wechall] Training: Crypto - Caesar I 본문
[문제]
[풀이]
시저 암호에 관한 문제인거 같다. 처음 들어보는 나는 시저암호가 무엇인지 찾아보았다.
시저 암호(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 : 암호화된 문장 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 a = "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
'암호 > Wechall Crypto' 카테고리의 다른 글
[WeChall] Training: Crypto - Transposition I (Crypto, Training) (0) | 2018.06.27 |
---|