얼마전 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으로 작성을 해야겠다는 마음이다.
댓글 없음:
댓글 쓰기