문제풀이/cryptopals

[파이썬] cryptopals 1-5 문제풀이 (Implement repeating-key XOR)

코엽 2016. 1. 15. 00:45

주소

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