블로그 이미지
자유로운설탕

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2017. 2. 23. 21:33 프로그래밍

  이번 시간에는 3교시때 얘기한 암복호화 하는 샘플을 찾아서 이용해 보려고 한다.

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

[들어가면서]

  3교시 때 아래까지 얘기를 했었다. 그림의 회색 부분을 위한 코드 샘플을 찾는 중이다. 

 

  "2 번째로, aes256으로 암, 복호화 하기 위한 모듈을 찾아보자. 구글에서 'python 3 aes256' 로 찾으면 처음에 스택오버플로우 글이 나오고, 두번째로 우리나라 분이 정리한 문서가 하나 나온다.

http://blog.dokenzy.com/archives/1997"

 

 

 

 

[암호화 모듈 설치]

  해당 샘플을 이용하기 위해 pycrypto 모듈을 아래와 같이 일단 pip 로 설치하려고 해본다. cmd 창에 아래 명령어로 pycrypto 를 설치한다.  

c:\Python\code>pip install pycrypto

 

  그런데 아래와 같은 에러가 발생한다. 아마도 pycrypto 가 더 이상 유지 보수가 안되거나 해서, 파이썬 공식 저장소에 pycypto 가 빌드된 파일이 없어서 빌드를 하려다가, 빌드에 쓸 적절한 컴파일러가 컴퓨터 내에 없어서 에러가 나는 것 같다. 

 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

 

  에러에 표시된 해당 페이지로 가면, 아래와 같이 Visual C++ 2015 Build Tools 링크가 나온다.

 

 

  막상 설치하려니 궁금한게 하나 생긴다. 에러에서는 Visual C++ 14.0 버전을 설치하라고 하는데, 2015 버전이 14.0 이 맞을까? 구글에서 'visual studio 2015 version number' 찾아 아래 위키의 내용을 보면 14.0 이 2015가 맞는다고 한다. 그럼 고민 하지 말고, 링크를 클릭해서, Visual C++ Build Tool 을 다운 받아 설치 한다.

https://en.wikipedia.org/wiki/Microsoft_Visual_Studio

 

  설치가 잘 완료된 후 다시 pip 설치 명령을 돌리면 아래와 같이 정상적으로 설치된다.

c:\Python\code>pip install pycrypto
Collecting pycrypto
  Using cached pycrypto-2.6.1.tar.gz
Installing collected packages: pycrypto
  Running setup.py install for pycrypto ... done
Successfully installed pycrypto-2.6.1

 

 

  이쯤 와서 정리해 보면 파이썬에서 모듈을 설치하는 방법은 3가지쯤 있어 보이는데, 첫번째는 pip 를 이용해서 패키지 이름을 지정해 공식적인 저장소에서 다운 받아 가져오는 것, 2번째는 다른 사람들이 빌드해 설치본으로 만들어 놓은 exe 형태의 인스톨 버전을 웹에서 다운받아 설치하는 방법, 세번째는 pip 명령어 뒤에 github 같은 웹경로나 로컬 경로를 지정해 wheel 이라는 확장자의 파일을 이용해 설치한다. wheel이 뭔지 궁금해 구글을 찾아보니 zip 파일의 확장자를 wheel 이라고 바꾸어 저장하는 것으로 아마 그 안엔 이미 컴파일된 모듈이 들어 있어 파이썬이 다운 받아 단지 압축을 풀어 모듈 폴더로 복사 함으로써 모듈이 설치되는 원리 같다. 설치 장소는 c:\Python\Lib\site-packages\ 안이다. 아래 링크의 글을 참고...

https://pypi.python.org/pypi/wheel

 

  ※ 뭔가 환경이 바뀌었는진 모르겠는데, 처음 pycrypto 를 설치 했을때는 비슷한 종류의 에러긴 한지만, 명확히 뭐를 설치하라고는 안나오고, "Unable to find vcvarsall.bat..." 요런 식으로만 나와서 구글에서 'python3 install crypto Unable to find vcvarsall.bat' 게 찾아서, 아래 페이지로 가서 wheel 파일을 설치해 해결했었다. 근데 컴파일러 설치가 정석인 것은 같다.

http://stackoverflow.com/questions/32800336/pycrypto-on-python-3-5

 

[64비트]

pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win_amd64.whl pycrypto
[32비트]

pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win32.whl pycrypto 

 

 

 

[암호화 소스 실행]

  그럼 아래 블로그의 소스를 가져와 보자. 테스트 결과 실행이 잘 되니 내용은 바꿀 필요는 없고, 주석만 조금 제거하고 설명을 추가하도록 하겠다. http://blog.dokenzy.com/archives/1997

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#-*- coding: utf-8 -*-
 
# Python 3.4
# author: http://blog.dokenzy.com/
# date: 2015. 4. 8
 
import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
 
# 아마 특정한 블록 사이즈를 채우기 위해서 입력된 값을 임의의 값으로 패딩(채워주기) 하는 코드 인 듯...
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()
unpad = lambda s: s[:-ord(s[len(s)-1:])]
 
# 초기화 코드 인듯
def iv():
    """
    The initialization vector to use for encryption or decryption.
    It is ignored for MODE_ECB and MODE_CTR.
    """
    return chr(0* 16
 
# 2교시때 설명했 듯이 클래스는 구조를 잘 잡아주는 껍데기 이다.
class AESCipher(object):
    """
    https://github.com/dlitz/pycrypto
    """
 
    def __init__(self, key):
        self.key = key
        #self.key = hashlib.sha256(key.encode()).digest()
 
    # 메시지를 암호화 하는 함수 
    def encrypt(self, message):
        """
        It is assumed that you use Python 3.0+
        , so plaintext's type must be str type(== unicode).
        """
        message = message.encode()
        raw = pad(message)
        cipher = AES.new(self.key, AES.MODE_CBC, iv())
        enc = cipher.encrypt(raw)
        return base64.b64encode(enc).decode('utf-8')
    
    # 메시지를 복호화 하는 함수
    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_CBC, iv())
        dec = cipher.decrypt(enc)
        return unpad(dec).decode('utf-8')
 
# 암호화 키 
key = 'abcdefghijklmnopqrstuvwxyz123456'
 
# 테스트 용 문자열
message = '한글을 테스트 합니다.'
 
# 테스트 용 문자열이 암호화 됬을 때 만들어 지는 값
_enc = 'gOXlygE+qxS+69zN5qC6eKJvMiEoDQtdoJb3zjT8f/E='
 
# 테스트용 문자열을 암호화 하고, 미리 암호화 된 값을 복호화 하기  
enc = AESCipher(key).encrypt(message)
dec = AESCipher(key).decrypt(_enc)
 
# 암호화 복호화 한 값이 서로 같음을 비교해 증명 true, true 가 나오면 같다고 증명된다.
print(_enc == enc)
print(message == dec)
cs

 

  그럼 위의 파일을 aes_example_in_python.py 로 저장하고 실행 한다. 저장하고 실행하는 방법이 기억이 안나면 2교시 때 자세히 설명한 부분을 다시 보고 오면 된다.

c:\Python\code>python aes_example_in_python.py
ImportError: No module named 'winrandom'

 

 

  실행을 했는데 또 다른 에러가 난다. 에러를 찾아보기 위해 구글에서 'python 3.5 winrandom' 이라고 찾아본다.  
https://stackoverflow.com/questions/24804829/another-one-about-pycrypto-and-paramiko

 

  아래와 같이 설치된 파일에서 nt.py 파일을 찾아서, 아래 문장을 수정해 저장하라고 그런다.
Problem is solved by editing string in crypto\Random\OSRNG\nt.py:

import winrandom -> from . import winrandom

 

  아래 파일을 열어서 내용을 수정해 준다. import winrandom 이 들어간 내용을 수정해 준다. 

  c:\Python\Lib\site-packages\Crypto\Random\OSRNG\nt.py

 

  다시 실행해 본다. 그럼 아래와 같이 True, True 라고 정상적으로 실행되어 결과가 나온다.

c:\Python\code>python aes_example_in_python.py
True
True

 

 

  ※ 수정한 문장에서 . 이 궁금하면 아래 링크들을 본다. 아마도 pycryto 가 2.x 대 버전만 공식적으로 지원 해서 3.x 대와 문법이 안맞아 그런거 같다고는 하는데 확실하진 않다. (2014년 6월이 최종 업데이트 날짜다)

  http://stackoverflow.com/questions/7279810/what-does-a-in-an-import-statement-in-python-mean

  https://wikidocs.net/1418

 

  ※ 새로운 암호화 모듈을 찾아보기 위해 구글에서 'python 3.6 pycrpto' 를 찾아보니, pycryptodome 이라는 모듈이 대체 되었다고 한다. 실제 프로젝트를 할때는 이와 같이 최신으로 유지보수 되는 많이 쓰는 라이브러리를 쓰는게 맞을 듯 싶다.

http://stackoverflow.com/questions/41813030/problems-with-installation-pycrypto-in-python-3-6

https://dzone.com/articles/an-intro-to-encryption-in-python-3

 

 

  그럼 5교시를 마치고, 6교시때는 4교시때 사용했던 MSSQL 와 함께, 5교시때의 암호화를 같이 머지해서, 만들려 그랬던 기능을 만들어 보도록 한다.

 

 

[추가]

파이썬 3.7의 경우는 본문에 있는 한글 에러 문제가 해결되어, pip install pycryptodome 으로 설치해 사용하면 됩니다^^

 

위의 3.5용 소스는 밑에 댓글 달아주신 것 같이 pycryptodome 사용하면 에러가 나서 아래 코드를 참조하세요. 

https://github.com/bjpublic/python_study/blob/master/%EC%98%88%EC%A0%9C%20%EC%86%8C%EC%8A%A4%20%EC%BD%94%EB%93%9C/05%EA%B5%90%EC%8B%9C/pycrypto_aes256_sample.py

 

 

1
2017.2.24 by 자유로운설탕
cs
posted by 자유로운설탕