본문 바로가기

notes

python pycrypto 사용하기

@마크다운


파이썬에서 pycrypto라는 암호화 모듈을 사용할 수 있는데

실제 파이썬3 이상의 환경에서 사용시 동작을 하지 않는경우가 발생한다.

이유는 pycrypto라는 모듈이 파이썬2를 기준으로 만들어 졌기 때문이다.

물론 위의 문제를 해결할수 있도록 `easy install`을 사용하거나 기타등등의 방법이 있지만

너무 불편하다.

#  

예를들어 AWS같은 클라우드 서비스를 사용할때 `requirement`를 `easy install` 때문에 별도로 작성해야한다던가 하는 귀찮음이 있다.

그래서 본 글에서는`pycrypto`를 사용하지 않고 `pycryptodome`을 사용했다.

기존의 pycrypto를 파이썬3에 맞게 이식한 모듈인거 같다.


```

pip install pycryptodome

```

[pycryptodome 공식문서](https://pycryptodome.readthedocs.io/en/latest/)

```

class MyCrypto:
    @staticmethod
    def encodeAES(data):
        key = base.SECRET_KEY[0:16].encode()
        cipher = AES.new(key, AES.MODE_EAX)
        nonce = cipher.nonce
        ciphertext, tag = cipher.encrypt_and_digest(data.encode())
        return ciphertext, tag, nonce

    @staticmethod
    def decodeAES(ciphertext, tag, nonce):
        key = base.SECRET_KEY[0:16].encode()
        cipher = AES.new(key, AES.MODE_EAX, nonce)
        decoded = cipher.decrypt_and_verify(ciphertext, tag)
        return decoded

    @staticmethod
    def encodeBase64(key1, key2):
        encode_key = base64.encodestring(key2 + b' | ' + key1)
        return encode_key

    @staticmethod
    def decodeBase64(key):
        decode_key = base64.decodestring(key)
        decode_key_split = decode_key.split(b' | ')
        return decode_key_split

```

위의 코드는 본인이 사용하는 코드이다.

AES를 사용하였다 [AES 위키피디아](https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B8%89_%EC%95%94%ED%98%B8%ED%99%94_%ED%91%9C%EC%A4%80)

`pycryptodome`은 AES로 암호화를 하게 되면

`암호화 된 문자열`,`MAC` 두가지 값을 리턴하게 되고

추가적으로 `nonce`라는 값을 리턴해줘야 한다.

즉 암호화된 문자열과 키가2개, 총 3개가 리턴이 된다.

이 암호화를 쓰게 된 이유는 데이터베이스에 특정값을 보여주고 싶지 않아서 사용하려고 했던건데 매번 바뀌는(nonce,tag)값들이 존재하니 무언가 상황이 아주 애매해졌다.

그래서 암호화를 했을때 나오는 키값을 다시 base64로 인코딩하여 데이터베이스에 저장을했고 특정값을 복호화할때 base64로 암호화된 키 문자열을 복호화를 진행하고

다시 AES로 복호화를 하는 과정으로 만들었다.

물론 이 과정이 별로 만족스럽지 않고 암호화된 문자열과 키값이 같은 데이터베이스안에 들어가 있다는게 껄끄러웠지만 마땅한 해결책을 아직 찾기 못하였다.