- 이번 프로그램은 이전글(2022.11.20 - [분류 전체보기] - 파이썬 GUI/윈도우 암호화 프로그램 만들기 - 1.소개편)에 이은 2번째 글로 암호화 하기 위해 입력받은 패스워드를 해시처리하는 방식에 대하여 설명합니다.
(본 블로그의 내용은 유튜브 동영상(파이썬 GUI/윈도우 암호화 프로그램 만들기-2.해시(making GUI/Windows Encryption program byPython 2.hash))에서 더욱 자세히 보실 수 있습니다.)
- 해시는 한번 암호화하면 원래상태 즉, 복호화가 불가능한 단방향 암호화 기법입니다. 이에 대한 설명은 기존 글(
2022.11.17 - [파이썬 실습/암호화프로그램만들기] - 파이썬 암호화 프로그램 만들기 - 2. 단방향 암호화 - 해시(Hash)
)을 참고 부탁드립니다.
(1) 프로그램을 실행시킨 후 (1) 패스워드 입력, (2) 암호화 버튼을 누르면 입력한 패스워드('pagichacha')가 해시처리되어
결과가 화면에 나타납니다.
O 시작전 준비 사항
- 프로그램을 실행하기 위해서는 아래 모듈들이 필요합니다. 아래와 같이 임포트 해줍니다.
import hashlib
from Crypto.Cipher import AES # 대칭키를 사용하기 위한 모듈 임포트
***에러 발생시 조치 사항(에러가 없는 경우 안보셔도 됩니다.)
--------------------------------------------------------------------------------------
만일 아래와 같이 에러 발생 시
ModuleNotFoundError: No module named 'Crypto'
pip install pycrypto <-- 현재 이 모듈은 더 이상 안전하지 않아 설치 되지 않음
pip install pycryptodome <-- 이 모듈을 설치
위의 모듈 설치 후에도 계속 동일한 에러 발생 시
ModuleNotFoundError: No module named 'Crypto'
아래 부분을 에서 와 같이 수정
from Crypto.cipher import PKCS1_OAEP # 소문자를
이렇게 수정
from Crypto.Cipher import PKCS1_OAEP # 대문자로 수정
--------------------------------------------------------------------------------------
여기까지 이상없이 되셨다면 이제 우리는 다음 단계로 넘어갈 준비가 되었습니다.
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtGui import *
import hashlib
from Crypto.Cipher import AES # 대칭키를 사용하기 위한 모듈 임포트
form_class = uic.loadUiType("gui_encryption_program4.ui")[0]
class MyWindow(QMainWindow, form_class):
def __init__(self):
global pad, unpad
super().__init__()
BS = 16 # blocksize를 16바이트로 고정시켜야 함(AES의 특징)
# AES에서는 블럭사이즈가 128bit 즉 16byte로 고정되어 있어야 하므로 문자열을 encrypt()함수 인자로 전달시
# 입력 받은 데이터의 길이가 블럭사이즈의 배수가 아닐때 아래와 같이 패딩을 해주어야 한다.
# 패딩: 데이터의 길이가 블럭사이즈의 배수가 아닐때 마지막 블록값을 추가해 블록사이즈의 배수로 맞추어 주는 행위
pad = (lambda s: s+ (BS - len(s) % BS) * chr(BS - len(s) % BS).encode())
unpad = (lambda s: s[:-ord(s[len(s)-1:])])
self.setFixedSize(700,700)
self.setWindowIcon(QIcon("pagichacha.png"))
self.setupUi(self)
self.pushButton_3.clicked.connect(self.test)
def test(self):
key = self.make_key()
print(key)
##################################################################################
# 1. 키(패스워드) 생성 + 해시 처리
##################################################################################
def make_key(self):
global key
self.textEdit.clear()
key_org = self.lineEdit_4.text()
self.textEdit.append("1. 원본 키(key) : "+key_org)
self.key = hashlib.sha256(key_org.encode()).digest()
print("AES Key(Key 문장 암호화) : ", self.key)
self.textEdit.append("2. Key에 해시 적용 후 결과 : "+str(self.key)+"\n")
return self.key
app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
> python total1.py
1.from Crypto.Cipher import AES <-- 대칭키를 사용하기 위한 모듈 임포트
2.BS = 16 <-- blocksize를 16바이트로 고정시켜야 함(AES의 특징)
3.pad = (lambda s: s+ (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()) <-- 패딩 처리
# AES에서는 블럭사이즈가 128bit 즉 16byte로 고정되어 있어야 하므로 문자열을 encrypt()함수 인자로 전달시
# 입력 받은 데이터의 길이가 블럭사이즈의 배수가 아닐때 아래와 같이 패딩을 해주어야 한다.
# 패딩: 데이터의 길이가 블럭사이즈의 배수가 아닐때 마지막 블록값을 추가해 블록사이즈의 배수로 맞추어 주는 행위
4.unpad = (lambda s: s[:-ord(s[len(s)-1:])]) <-- 패딩처리된 부분은 원래대로 처리
5.self.setupUi(self) <-- 위에서 만든 UI를 클래스에 반영
6.self.pushButton_3.clicked.connect(self.test) <-- 'pushButton_3'(암호화) 버튼이 클릭되면 test함수 호출
7.key = self.make_key() <--make_key()함수의 리턴값을 key변수에 저장
8.self.textEdit.clear() <-- 텍스트에디트('실행결과' 화면)를 클리어(빈 화면으로)
9.key_org = self.lineEdit_4.text() <-- lineEdit_4의 입력값(패스워드(키)입력 값)을 key_org변수에 할당
10.self.textEdit.append("1. 원본 키(key) : "+key_org) <-- 텍스트에디트('실행결과' 화면)에 입력한 패스워드를 보여줌
11.self.key = hashlib.sha256(key_org.encode()).digest() <-- 키가 쉽게 노출되는 것을 막기 위해 키를 어렵게 처리하는 과정으로 보통 해시를 적용
12.self.textEdit.append("2. Key에 해시 적용 후 결과 : "+str(self.key)+"\n") <-- 텍스트에디트('실행결과' 화면)에 입력한 패스워드의 해시처리된 값을 보여줌
1. AES 대칭키 알고리즘 적용을 위해 블록 사이즈를 16(BS = 16)으로 맞추어 주고, 패딩처리하는 코드 부분을 추가합니다.
푸쉬버튼(pushButton_3)을 클릭하면 테스트함수(test())가 호출 되고 테스트함수는 make_key() 함수를 호출하여 key를 리턴 받습니다.
2. make_key()함수는 입력받은 패스워드(key_org = self.lineEdit_4.text() )를 해시 처리(hashlib.sha256(key_org.encode()).digest() ) 후 화면에 보여줍니다.
> 2. self.key = hashlib.sha256(key_org.encode()).digest() <-- 키가 쉽게 노출되는 것을 막기 위해 해시를 적용
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.
감사합니다.
'파이썬 실습 > GUI,윈도우 암호화 프로그램 만들기' 카테고리의 다른 글
파이썬 GUI/윈도우 암호화 프로그램 만들기 - 3.암호화 처리 부분 (2) | 2022.11.24 |
---|---|
파이썬 GUI/윈도우 암호화 프로그램 만들기 - 1.소개편 (0) | 2022.11.20 |