RC4 Stream Cipher

Knowledge 2016. 7. 19. 10:22



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(0256):
        S.append(i)
        key.append(ord(seed[i % len(seed)]))
 
    for i in range(0256):
        j = (j + S[i] + key[i]) % 256
        S[i], S[j] = S[j], S[i]
    return key, S
 
def PRGA(key, S):
    i, j = 00
    xorKey = []
    for k in range(0256):
        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
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,