분류 전체보기 - 해당되는 글 13건
오늘 보안 알고리즘에 약간의 변경을 가하기로 결정되어
RSA와 함께 AES를 섞어 쓰기로 결정 되었다.
때문에 python으로 AES 관련 코드 추가 작업을 진해하였다.

이미 M2Crypto를 쓰고 있으니
따로 암호화 모듈을 추가할 필요 없이 이를 이용했다.
M2Crypto를 보면서 문서화가 좀 거지같다는 생각을 했는데,
이번에도 역시...
그나마 테스트 케이스라도 있어서 다행이었다.
휴~

처음에는 AES 128bit CBC로 할까 했다가
IV가 필요없는 AES 128bit ECB로 결정...

아래 코드는 임의의 128bit 키를 만들어 짧은 평문을 암/복호화 한다.
 

import os
import cStringIO
from M2Crypto import EVP

skey = os.urandom(16)
plaintext = '12345'

# encrypt

aes = EVP.Cipher(alg='aes_128_ecb', key=skey, iv='', op=1)

buf = cStringIO.StringIO()

buf.write(aes.update(plaintext))

buf.write(aes.final())

ciphertext = buf.getvalue()

# decrypt

aes = EVP.Cipher(alg='aes_128_ecb', key=skey, iv='', op=0)

buf = cStringIO.StringIO()

buf.write(aes.update(ciphertext))

buf.write(aes.final())

plaintext = buf.getvalue() 

 
|
최신 버전의 Aptana에는 PyDev가 기본 설치되어 배포되며, 
Django 프로젝트 역시 함께 지원한다.

Aptana에서 Django 프로젝트를 개발하고 싶다면,
아래의 방법을 따르면 된다.

1. File → New → Project
2. [Select Wizard] Pydev → Pydev Django Project → Next
3. [Pydev Django Project] Project Name: mytest, Grammar Version: 2.6 → Next
4. [Reference Page] Next
5. [Django Settings] Finish 

6. Run → Run Configurations
7. Pydev Dajngo → New
8. [Main]
    Name: mytest,
    Project: mytest
    Main Module: ${workspace_loc:mytest/src/mytest/manage.py} 
9. [Arguments]
    Program Arguments:
        runserver
        0.0.0.0:8000
        --noreload 
 10. Apply → Run

위와 같이 하면 디버그 서버가 동작하는 것을 볼 수 있으며,
콘솔창에 디버그 정보가 보여진다.

브라우저에 http://127.0.0.1:8000/ 주소를 치면
Django 프로젝트가 성공적으로 로드 되었음을 확인할 수 있다.
 

'django' 카테고리의 다른 글

database에서 models.py 추출하기  (0) 2011.06.09
django에서 database table 이름 수동으로 지정하기  (0) 2011.06.09
|

지난 주 작업 중 클라이언트로부터 HTTP Request로 RSA Public Key를 받아서
보안 토큰을 암호화한 후 Response에 실어서 보내는 작업이 있었다.
클라이언트는 Crypto++이라는 C++ 라이브러리를 사용하고 있었다.

이 작업을 위해 RSA 2.0과 PyCrypto를 먼저 사용해 보았으나
Crypto++과 결과물이 맞지 않았다. 
같은 RSA 알고리즘을 사용했다면 기대대로 동작을 해야할텐데
이상하다고 생각했으나 일단 작업은 진행을 해야하니까...
(혹시, 필자가 삽질해서 안된거라면 성공 경험이 있으신 분은 커멘트 부탁드립니다.) 
M2Crypto에서 Crypto++에서 생성한 키들을 이용한 암복호화를 검증하여
옳바르게 작업하는 것을 확인 후 사용하였다.

아래 코드는 해당 작업을 위하여
python 콘솔에서 검증 작업한 코드르 정리/재구성 한 것이다.
사용된 패키지 및 함수에 대해서는 레퍼런스 문서를 찾아보길 바란다.

아래 코드에서 pub_key_hex, priv_key_hex는 DER 포맷의 RSA 키 쌍 이다.
HTTP로 전달하기 위해서는 문자열을 사용해야만 했으며,
Base64 인코딩 시 종종 개행문자가 들어가기도 하는데 이 경우 문제의 소지가 있어
16진수 문자열로 변환하여 전달했다.
PEM 형식은 Base64를 쓸 뿐만 아니라 Crypto++에서 직접 지원하지 않기 때문에
DER 포맷을 사용하였다.
(아이러니 하게도 M2Crypto는 PEM 포맷만 직접 지원한다.)

아래 코드는 16진수 문자열로 된 DER 포맷을 PEM 포맷으로 전환하여
키 객체를 만든 후 값을 처리한다.


import base64

import binascii

from M2Crypto import BIO, RSA

plain_text = '12345' 


TEMPLATE = """-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----"""

raw = binascii.a2b_hex(pub_key_hex)

data = TEMPLATE % base64.encodestring(raw).rstrip()

bio = BIO.MemoryBuffer(data)

pub_key = RSA.load_pub_key_bio(bio)

enc = pub_key.public_encrypt(plain_text, RSA.pkcs1_oaep_padding)

enc_text = binascii.b2a_hex(enc_text)


TEMPLATE = """-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----"""

raw = binascii.b2a_hex(priv_key_hex)

data = TEMPLATE % base64.encodestring(raw).rstrip()

priv_key = RSA.load_key_string(data)
enc = binascii.a2b_hex(
enc_text)

plain_text = priv_key.private_decrypt(enc, M2Crypto.RSA.pkcs1_oaep_padding)

 
|

ghilbut's Blog is powered by Daum & tistory