주소
http://cryptopals.com/sets/1/challenges/5/문제
Implement repeating-key XOR
Here is the opening stanza of an important work of the English language:
Burning 'em, if you ain't quick and nimble I go crazy when I hear a cymbal
Encrypt it, under the key "ICE", using repeating-key XOR.
In repeating-key XOR, you'll sequentially apply each byte of the key; the first byte of plaintext will be XOR'd against I, the next C, the next E, then I again for the 4th byte, and so on.
It should come out to:
0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272 a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f
Encrypt a bunch of stuff using your repeating-key XOR function. Encrypt your mail. Encrypt your password file. Your .sig file. Get a feel for it. I promise, we aren't wasting your time with this.
해석
이번엔 키가 3글자입니다.첫 번째 문장을 핵스로 바꾼 후 "ICE"키로 xor시키면 두 번째에 있는 값이 나옵니다.
for문이 돌때마다 key_index값이 1증가하면서 now_key가 I, C, E로 반복적으로 바뀝니다.
코드
1 2 3 4 5 6 7 8 9 10 | string = """Burning 'em, if you ain't quick and nimble I go crazy when I hear a cymbal""" key = 'ICE' key_index = 0 result = '' for letter in string: now_key = key[key_index%3] key_index+=1 result += chr(ord(letter)^ord(now_key)).encode('hex') print result | cs |
결과
추가
다른곳에도 사용할 수 있도록 키의 글자 수에 맞게 자동으로 암호화 가능한 함수로 바꿔봤습니다.
1 2 3 4 5 6 7 8 | def xor(string, key): key_index = 0 result = '' for letter in string: now_key = key[key_index%len(key)] key_index+=1 result += chr(ord(letter)^ord(now_key)).encode('hex') return result | cs |
'문제풀이 > cryptopals' 카테고리의 다른 글
[파이썬] cryptopals 1-4 문제풀이 (Detect single-character XOR) (0) | 2016.01.15 |
---|---|
[파이썬] cryptopals 1-3 문제풀이 (Single-byte XOR cipher) (0) | 2016.01.15 |
[파이썬] cryptopals 1-2 문제풀이 (Fixed XOR) (1) | 2016.01.15 |
[파이썬] cryptopals 1-1 문제풀이 (Convert hex to base64) (0) | 2016.01.15 |