파이썬 실습/GUI,윈도우 암호화 프로그램 만들기

파이썬 GUI/윈도우 암호화 프로그램 만들기 - 2.패스워드 입력 및 해시 처리

파기차차 2022. 11. 24. 07:43
728x90
반응형
SMALL
반응형
ㅁ 개요

 

O 프로그램 소개
 

 - 이번 프로그램은 이전글(2022.11.20 - [분류 전체보기] - 파이썬 GUI/윈도우 암호화 프로그램 만들기 - 1.소개편)에 이은 2번째 글로 암호화 하기 위해 입력받은 패스워드를 해시처리하는 방식에 대하여 설명합니다.

(본 블로그의 내용은 유튜브 동영상(파이썬 GUI/윈도우 암호화 프로그램 만들기-2.해시(making GUI/Windows Encryption program byPython 2.hash))에서 더욱 자세히 보실 수 있습니다.)

 

 

 

 

 - 해시는 한번 암호화하면 원래상태 즉, 복호화가 불가능한 단방향 암호화 기법입니다. 이에 대한 설명은 기존 글(

2022.11.17 - [파이썬 실습/암호화프로그램만들기] - 파이썬 암호화 프로그램 만들기 - 2. 단방향 암호화 - 해시(Hash)

)을 참고 부탁드립니다.

 

 

 

O 완성된 프로그램 실행 화면

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

(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 # 대문자로 수정

--------------------------------------------------------------------------------------

 

 

여기까지 이상없이 되셨다면 이제 우리는 다음 단계로 넘어갈 준비가 되었습니다.


 

ㅁ 세부 내용
 
O 완성된 소스

 

 

# -*- 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")

 

 

 

 

O 소스 다운로드 및 실행
 
 - 소스파일 다운로드 후 cmd 또는 파워쉘 등에서 아래와 같이 실행하시기 바랍니다.
('gui_encryption_program4.ui' 파일은 'total1.py' 실행파일과 동일한 위치에 놓으시기 바랍니다.)
 
 
 > python total1.py

 

 


 
 
O 소스 분석

 

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") <-- 텍스트에디트('실행결과' 화면)에 입력한 패스워드의 해시처리된 값을 보여줌


 

O 주요 내용

 

 

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() ) 후 화면에 보여줍니다.

 

 


 

ㅁ 정리
 
O 우리가 배운 내용
 
 - 오늘은 암호화의 내용 중 입력받은 패스워드를 해시처리하는 방법에 대하여 공부해 보았습니다.

 

 
 
 - 오늘 우리가 배운 핵심 내용을 간단히 정리해 보면 아래와 같습니다.
 
 > 1. pad = (lambda s: s+ (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()) <-- AES암호화 알고리즘 적용을 위해 패딩 처리
 > 2. self.key = hashlib.sha256(key_org.encode()).digest() <-- 키가 쉽게 노출되는 것을 막기 위해 해시를 적용
 
 

 

오늘은 여기까지이며, 위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

728x90
반응형
LIST