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()