관리 메뉴

FU11M00N

[ Python ] RC4 알고리즘 본문

Programming/Python

[ Python ] RC4 알고리즘

호IT 2021. 4. 8. 03:47

- RC4

 

스트림 암호 종류 중 하나이다.

주로 4 계층 보안 TLS,SSL , WEB 등 프로토콜에 사용되었다.

하지만 현재 취약점이 발견되어 권장하는 프로토콜은 아니다.

 

알고리즘으로 구현하기 위해 바이트의 개수 256개를 뒤섞고,

256개의 가능한 바이트 중 하나를 골라 해당 값을 키 스트림을 사용하여 평문과 XOR연산으로 암호화한다.

이 후 두 개의 위치만 바꾸어 섞은 후 다시 특정 위치의 바이트를 키스트림으로 반복하여 사용한다.

 

RC4 알고리즘을 짜기위해 www.youtube.com/watch?v=kfdvlaOD1ig&t=172s영상을 참고했다.

 


def msg_enc(msg,s): # 암호문을 XOR 한번 더하여 복호화
    i=0
    j=0
    stream_key= []
    msg=msg.encode()
    enc_value=bytearray()
    
    for k in range(len(msg)):
        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_value.append( msg[k] ^ stream_key[k])
    return enc_value

def msg_dec(enc_value,s):  # 스트림키 생성 및 XOR연산하여 암호문 생성
    i=0
    j=0
    stream_key= []
    dec_value=bytearray()

    for k in range(len(enc_value)):
        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_value.append(enc_value[k] ^ stream_key[k])
    return dec_value

def key_init(key): # 스트림 키 초기화
    key = key.encode()
    j=0
    s= []
    for i in range(0,256):
        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 main():
    print("메세지 입력")
    msg=input()
    print("키 입력")
    key=input()

    s=key_init(key)
    enc_value=msg_enc(msg,s)
    
    print("암호화 값 : ",enc_value)
    dec_value=msg_dec(enc_value,key_init(key))
    print("복호화 값 : ", dec_value)
    


main()

 

Comments