일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- classcard 매칭게임
- 랜섬웨어
- typingworks
- 음원추출
- 모의 랜섬웨어
- pycrypto
- pytube
- Tkinter Label
- 파이썬
- 클래스카드 매크로
- textvariable
- python 예제
- GUI
- AES
- 타이핑웍스
- customtkinter
- classcard
- 셀레니움
- Selenium
- 클래스카드
- Python
- aes 암호화
- aes 복호화
- justify
- 재생목록
- Python GUI
- Tkinter
- 티스토리챌린지
- 자동화
- 오블완
- Today
- Total
파이썬이 제일 쉬워
[Python] Pycrypto로 AES 개날먹 암호화 하기 (+ 패딩(padding) 개쉽게하는 법) 본문
오늘은 매우 간단하게 Pycrypto로 AES 암/복호화를 해볼겁니다.
먼저 pycrypto를 설치해줍시다.
pip install pycrypto
자 이제 틀부터 잡아봅시다.
파일을 AES로 암호화 하려면 일단 필수적으로 두가지가 필요합니다.
암호화할 파일과, 키(Key)죠.
(근데, 우리는 CBC 방식으로 암호화 할거기 때문에 추가적으로 초기화 벡터(iv)가 필요합니다.)
AES 암호화에 대한 자세한 설명은 여기 참조 https://blog.naver.com/sanainfo/221517009223
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
def enc_file(input_file, key):
iv = get_random_bytes(16)
key = pad(key, 32) # key 패딩, AES256(32bytes)
cipher = AES.new(key, AES.MODE_CBC, iv)
with open(input_file, 'rb') as f:
plain = f.read()
padded_plain = pad(plain, AES.block_size)
ciphertext = cipher.encrypt(padded_plain)
with open(input_file + ".aes", 'wb') as f:
f.write(iv)
f.write(ciphertext)
이러면 끝입니다.
쉽죠?
이제 설명을 해보자면
iv = get_random_bytes(16) => 16바이트 짜리 랜덤한 바이트를 생성해서 초기화 벡터로 삼는다.
key = pad(key, 32)
=> key도 패딩해준다 AES256이라 32바이트에 맞춰줌
(AES128은 16bytes, AES192는 24bytes, AES256은 32bytes임)
AES128 할 때는 저기에 밑에 처럼 AES.block_size 써도 됨 얘도 걍 int 16임
패딩 복잡하게 하는 사람들 많은데 걍 이거 쓰면 편합니다
cipher = AES.new(key, AES.MODE_CBC, iv)
=> 새로운 모듈(?)을 하나 만들어준다. key는 암호화에 사용할 키
AES.MODE_CBC는 CBC모드로 암호화 함을 의미하고, iv는 초기화 벡터를 입력해준 것.
with open(input_file, 'rb') as f:
plain = f.read()
=> 파일을 읽어온다 'rb'를 통해 바이트로 읽어와야 함 ㅇㅇ
padded_plain = pad(plain, AES.block_size)
=> block_size로 읽어온 내용을 패딩 해준다 (block_size는 16바이트임)
ciphertext = cipher.encrypt(padded_plain)
=> 패딩된 내용을 암호화한다.
with open(input_file + ".aes", 'wb) as f:
f.write(iv)
f.write(ciphertext)
=> 암호화된 내용을 파일에 저장한다.
# 초기화 벡터가 2번째 키의 역할을 하기도 하는데, 걍 써버려도 되는건가?
운용 방식마다 초기화 벡터를 사용하는 방법이 다르며 초기화 벡터에서 요구되는 성질도 조금씩 다를 수 있지만, 같은 초기화 벡터가 반복되어 사용되어서는 안 된다는 성질을 공통적으로 가진다. 이것은 초기화 벡터가 같은 경우 비슷한 두 개의 평문을 암호화했을 때 앞부분의 블록들이 서로 같게 되는 등 보안 문제가 발생하기 때문이다. (위키피디아)
사실 이걸 쓰는 이유가 초기화 벡터를 추가해서 비슷한 문장 암호화시에 비슷한 결과값이 나오는 걸 방지하는 거라 크게 문제는 안됨. key만 유출안되게 관리 잘하면됨 ㅇㅇ.
사실상 이걸로 "모든 파일"을 암호화 할 수 있다.
근데.... 이렇게 하면 귀찮죠? 간단한 GUI도 끼워넣어 봅시당.간단한 GUI에 디자인은 필요없기 때문에 tkinter 쓸겁니다. (진짜 사용하는건 customtkinter로 이쁘게 만듦)
전체 코드
쟈쟈쟌~
복호화는 담시간에 합시당
'Python' 카테고리의 다른 글
[Python/Pycrypto] Pycrypto로 유사 랜섬웨어 간단하게 만들기 (1) | 2024.06.15 |
---|---|
[Python] Pycrypto로 AES 개날먹 복호화하기 (1) | 2024.06.13 |
[Python/Customtkinter] 너무나도 쉬운 Customtkinter Label(CTkLabel) 부셔먹기 (1) | 2024.06.12 |
[Python] 개쉽고 간지나는 customtkinter 써보기 (1) | 2024.06.12 |
[Python] Pytube, Tkinter로 유튜브 동영상 다운로드 하기 #3 (재생목록, GUI) (0) | 2023.10.31 |