얼마전 Stream Cipher도 배웠고 해서, RC4 를 python으로 한번 구현해 보았다. 코드는 크게 2가지 함수와, 이를 묶어주는 함수 1개로 총 3가지로 이루어져 매우 간단하다. 첫번째 부분은 KSA (Key-scheduling algorithm)이다.
def KSA (key, S):
for i in range(256):
S[i] = i
j = 0
for i in range(256):
j = (j + S[i] + ord(key[(i%16)])) % 256
S[i], S[j] = S[j], S[i]
key는 16 bytes로 만들어 놓았지만, key[(i%16)] 에서 숫자만 바꾸면 어떤 크기든 가능하다.
다음은 PRGA (Pseudorandom generation algorithm)이다.
def PRGA (S, message, ciphertext, path, control):
i = 0
j = 0
count = 0
while count < len(message):
i = (i+1) % 256
j = (j+S[i]) % 256
S[i], S[j] = S[j], S[i]
K = S[(S[i]+S[j])%256]
ciphertext += chr( K ^ ord(message[count]))
count += 1
if control == 'd':
ofp = open("r_"+path[4:], "wb")
elif control == 'e':
ofp = open ("c_"+path[2:], "wb")
else:
print "ERROR: Unknown control"
return 0
ofp.write(ciphertext)
ofp.close()
PRGA는 key를 생성해서 암호화 또는 복호화를 진행하는 핵심부분이다. message와 ciphertext라고 변수 이름을 짓기는 했지만, 사실 message가 암호화된 문장이면 결과는 복호화된 문장이 출력된다.
다음은 원래 메시지와 키의 경로 및 control을 인자로 받는 Enc_Dec 함수다.
def Enc_Dec (otext,keytxt,control = 'e'):
kfp = open (keytxt, "rb")
fp = open (otext, "rb")
S = [0] * 256
ciphertext = ""
KSA(kfp.read(), S)
PRGA (S, fp.read(), ciphertext, otext, control)
fp.close()
kfp.close()
control은 암호화면 'e', 복호화면 'd'를 예상하고 만들었다. Default는 'e'이다.
-------------------------------------------------------------------
만약 이 코드를 C/C++로 작성했으면 이보다 훨씬 길고 복잡해 졌을 것은 확실하다. python의 깔끔함이 마음에 들어서 암호 관련된 코드는 C 대신, python으로 작성을 해야겠다는 마음이다.
댓글 없음:
댓글 쓰기