공부 자료/시스템 보안

[시스템 보안] RC4 알고리즘 - Python으로 구현하기

뚜루뚜루세니 2021. 10. 2. 23:36
728x90

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
45
46
47
48
49
50
51
52
53
54
55
def KSA(key): #KSA를 통해 배열S를 구성 = 키스트림 초기화 단계
    key = key.encode()
    j = 0
    S = []
    for i in range(0,256): #S배열에 0부터 255까지의 숫자를 넣음
        S.append(i)
    for i in range(0,256): #입력받은 키값을 이용하여 이 값들을 섞음
        j=(j + S[i] + key[i%len(key)]) %256 
        S[i],S[j] = S[j],S[i]
    return S
 
def encryption(plain,S): #암호화
    i=0
    j=0
    stream_key= [] 
    plain=plain.encode() 
    enc=bytearray() #빈 바이트 배열 객체 생성
 
    #PRGA를 통해 키 스트림을 구성, 평문을 암호화
    for k in range(len(plain)): #for문을 평문 길이 만큼 돌면서 swap 진행
        i=(i+1) % 256
        j = (j+S[i]) % 256
        S[i],S[j]=S[j],S[i]
        stream_key.append(S[(S[i] + S[j])%256])
        enc.append( plain[k] ^ stream_key[k]) 
    return enc
 
def decryption(enc,S): #복호화
    i=0
    j=0
    stream_key =[]  
    dec = bytearray() #빈 바이트 배열 객체 생성
 
    for k in range(len(enc)): #암호화에 사용된 똑같은 키 스트림을 사용, 암호문과 XOR 연산 
        i=(i+1) % 256
        j=(j+S[i]) % 256
        S[i],S[j]=S[j],S[i]
        stream_key.append(S[(S[i] + S[j])%256])
        dec.append(enc[k] ^ stream_key[k]) #평문으로 다시
    return dec
 
#출력형태
plain = input("Plain Text: "
key = input("Key: "
 
stream= KSA(key) 
enc=encryption(plain,stream) 
 
print("Encryption: ",enc) 
dec=decryption(enc,KSA(key)) 
print("Decryption: ",dec) 
 
 
 
 
cs
728x90