RC4는 Rivest Cipher 4의 약자로, 꽤 오래된 스트림 암호이다.
WEP의 암호화 방식으로 사용되었으나, 현재는 취약점이 드러나 WEP는 사용되지 않고 있다.
이 암호의 작동방식을 아주 간략하게 설명하면,
1. Seed를 통해 랜덤 값 생성
2. 랜덤 값과 원본 텍스트를 XOR
이 끝이다.
복호화는 저 과정을 한번 더 반복하면 된다.
별로 어려운 암호도 아니지만, 이런 걸 구현해보는 것은 또 처음이다 보니 인덱싱 문제로 살짝 고생했다.
작성해본 파이썬 코드는 다음과 같다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | def KSA(seed): S = [] key = [] j = 0 for i in range(0, 256): S.append(i) key.append(ord(seed[i % len(seed)])) for i in range(0, 256): j = (j + S[i] + key[i]) % 256 S[i], S[j] = S[j], S[i] return key, S def PRGA(key, S): i, j = 0, 0 xorKey = [] for k in range(0, 256): i = (i+1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] xorKey.append(S[(S[i] + S[j]) % 256]) return xorKey def XOR(xorKey, target): ret = [] for i in range(len(target)): ret.append(xorKey[i] ^ ord(target[i])) ret = ''.join(map(chr, ret)) return ret def RC4(text, seed): key, S = KSA(seed) xorKey = PRGA(key, S) return XOR(xorKey, text) seed = "\x01\x02\x03\x04\x05" text = "Hello World" print "[*] Original Text : " + text enc = RC4(text, seed) print "[*] Encoded Text (Hex) : " + enc.encode('hex') dec = RC4(enc, seed) print "[*] Decoded Text (Hex) : " + dec.encode('hex') print "[*] Decoded Text : " + dec | cs |
'Knowledge' 카테고리의 다른 글
[BigData] Spark 공부 (0) | 2016.10.19 |
---|---|
Visual Studio 2008에서 libcurl 사용하기 (0) | 2016.09.05 |
스트림 암호 (Stream Cipher) (0) | 2016.07.18 |
사설망-외부망 통신에 대한 공부 (0) | 2016.07.02 |
Greedy Algorithm + 회의실 배정 (0) | 2016.06.21 |