페이지

Post List

2012년 7월 25일 수요일

[cryptography] RC4 - programming in python

 요즘 차근차근 python을 배우고 있다. 처음에는 C/C++이면 금방 작성할 것 같은 코드도 힘겹게 구글링 해가면서 작성해야 해서 힘들었지만, 조금 익숙해지고 나니 슬슬 python의 장점이 보이는 것 같다. 특히 깔끔하고 가독성 좋은 점이 마음에 든다 :)

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

댓글 없음:

댓글 쓰기