OpenSSL
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 | from OpenSSL.crypto import load_privatekey, FILETYPE_PEM, sign, load_publickey, verify, X509 from Crypto.Hash import SHA256 as SHA from OpenSSL import crypto from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMessageBox import sys pkey = crypto.PKey() pkey.generate_key(crypto.TYPE_RSA, 1024) #RSA 형식의 키 생성 # 공개키, 개인키 생성 with open("public.pem",'ab+') as f: f.write(crypto.dump_publickey(crypto.FILETYPE_PEM, pkey)) with open("private.pem",'ab+') as f: f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) # 공개키, 개인키 읽어오기 with open("private.pem",'rb+') as f: priv_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read()) with open("public.pem",'rb+') as f: pub_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read()) # 데이터 해시화 content = '_message' #가져와야 하는것 _hash = SHA.new(content.encode('utf-8')).digest() # 데이터 해시화 = 프레임 해쉬화 데이터로 대체할 것 #개인키로 전자서명 _sig = sign(priv_key, _hash, 'sha256') # 개인키로 해시화 되어 있는걸 전자서명 x509 = X509() # 인증서를 사용할 수 있도록 하는 메서드 제공 x509.set_pubkey(pub_key) #비교 대상 cc2 = '_message' t_hash = SHA.new(cc2.encode('utf-8')).digest() #verify(x509, 전자서명, 비교할 해시, 'sha256') try : verify(x509, _sig, t_hash, 'sha256') app = QtWidgets.QApplication(sys.argv) QMessageBox.information(None,'Success!',u"변조되지않았습니다.",QMessageBox.Ok) sys.exit(1) except : app = QtWidgets.QApplication(sys.argv) QMessageBox.critical(None,'Error!',u"변조되었습니다.",QMessageBox.Ok) sys.exit(1) | cs |
|
공개키 개인키
crypto.dump_publickey(crypto.FILETYPE_PEM, pkey)로 ".pem" 파일을 생성하여 이곳에 저장 후 crypto.load_publickey(crypto.FILETYPE_ASN1, pkey)로 불러옴
만약, ".pem" 파일에 저장하지 않고 바로 쓸거면 crypto.load_publickey(crypto.FILETYPE_ASN1, pkey)로 바로 가져오면 OK |
|
전자서명 sign(개인키, 해시화 한 데이터, 'sha256') |
증명
vertify(x509, 해시화한 원 데이터, 비교할 해시 데이터, 'sha256') ※ 증명 시 주의할 점 데이터 변조 시 파일 자체의 에러가 나기에 예외 처리문을 이용하여 원 데이터가 비교할 데이터와 다를 경우 원하는 메시지를 출력하도록 함 위의 코드에서는 PyQt를 사용하여 메시지 박스가 생성되도록 만듦
|
![](http://cfs.tistory.com/www/resource/admin/editor/form_arrow.gif)
'공부 > Python' 카테고리의 다른 글
[DB] INT 형 삽입 (0) | 2020.03.21 |
---|---|
python venv 설치방법 (0) | 2019.11.05 |
[암호] Vigenere (0) | 2019.02.09 |