[์ํธ ํ๋กํ ์ฝ] ์ ์์๋ช ๊ตฌํํ๊ธฐ
- -
์์ค์ฝ๋์ ๋ํ ์ค๋ช ์ ์ฃผ์์ฒ๋ฆฌ ํด๋์์ต๋๋ค.
๊ฐ๋ฐ๋๊ตฌ : "anaconda -> spyder"
์ธ์ด : "python"
์ ์์๋ช ๊ตฌํ์ฝ๋ - myRSA.py
# -*- coding: utf-8 -*-
"""
Created on Thu May 13 13:12:25 2021
@author: hk
"""
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import tools
# =============================================================================
# Key ์์ฑ ๋ฐ ๋ก๋ฉ
# =============================================================================
def make_key(pr_path, pu_path, size_bit = 1024):
pr_key = RSA.generate(size_bit)
pu_key = pr_key.public_key()
fw = open(pr_path,'wb')
fw.write(pr_key.exportKey('PEM'))#base64๋ก ์ธ์ฝ๋ฉ๋ ๊ฒ์ ๋ฃ๊ธฐ
fw.close()
fw = open(pu_path,'wb')
fw.write(pu_key.exportKey('PEM'))
fw.close()
#make_key('pr1.key', 'pu1.key') #ํค ์์ฑํ๊ธฐ
def get_key(key_path):
fr = open(key_path,'rb')
key = RSA.importKey(fr.read())
return key
#ํค ์ฝ์ด์ค๊ธฐ
#pr_key = get_key('pr1.key')
#pu_key = get_key('pu1.key')
#print(pr_key)
#print(pu_key)
# =============================================================================
# ๋ฉ์์ง ์๋ณตํธํ
# =============================================================================
def encrypt_msg(msg,key):
ch = PKCS1_OAEP.new(key) # ํค๋ฅผ ์ฃผ์ด์ฃผ๋ฉด ์ํธ ํ๊ธฐ๊ฐ ๊ฐ๋ฅ
msg_en = ch.encrypt(msg)
return msg_en
def decrypt_msg(msg,key):
ch = PKCS1_OAEP.new(key)
msg_de = ch.decrypt(msg)
return msg_de
def test1():
msg = 'i love you!'
pu_key = get_key('pu1.key')
msg_en = encrypt_msg(msg.encode(), pu_key)
print("์ํธํ : ",msg_en,"\n๊ธธ์ด : ",len(msg_en))
pr_key = get_key('pr1.key')
msg_de = decrypt_msg(msg_en, pr_key)
print("๋ณตํธํ : ",msg_de)
#test1()
# =============================================================================
# ํ์ผ ์๋ณตํธํ
# =============================================================================
def encrypt_file(file_name, key):
save_name = file_name +'.enc'
fr = open(file_name,'rb') #์ฝ์ด์ค๋ ๊ฒ
fw = open(save_name, 'wb')#์ํธํ ๋๊ฑธ ์ฐ๋ ๊ฒ
BSIZE = 86 # 1024bit key์ ๊ฒฝ์ฐ ์ต๋ ์์.
data = fr.read(BSIZE)
while data:
data_en = encrypt_msg(data, key) #๋ฐ์ดํฐ ์ํธํ
fw.write(data_en)
data = fr.read(BSIZE)
return True #ํ์ด์ฌ์ ํธ๋ฃจ๋ฅผ ๋๋ฌธ์๋ก!
def decrypt_file(file_name, key):
save_file = file_name + '.txt' #์ด๊ธฐ ์ฌ์ฐ๋ผ๊ณ ํ์ฅ์ ๋ฐ๊ฟ์ค ๊ฒ.
fr = open(file_name,'rb')
fw = open(save_file,'wb')
BSIZE = 128 #๋ค์ด์ค๋ ๊ฐ์ ๋ฌด๊ดํ๊ฒ ์ถ๋ ฅ์ 128์ด๊ธฐ ๋๋ฌธ์.
data = fr.read(BSIZE)
while data:
data_dec = decrypt_msg(data, key)
fw.write(data_dec)
data = fr.read(BSIZE)
return True
def test2():
# file_name = '5-1.py'
# pu_key = get_key('pu1.key')
# encrypt_file(file_name, pu_key)
# pr_key = get_key('pr1.key')
# file_name = '5-1.py.enc'
# decrypt_file(file_name, pr_key)
# =============================================================================
# hash ๊ฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆํ๊ธฐ
# =============================================================================
hash1 = tools.get_hash_file('5-1.py')
hash2 = tools.get_hash_file('5-1.py.enc.txt')
if hash1 == hash2:
print('๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์๋ฃ --same')
else:
print('๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ์คํจ --fail ')
#๊ณต๊ฐํค ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ๋ฉ์ธ์ง/ํ์ผ ์๋ณตํธํ
#test2()
์คํ์ํค๋ฉด ์๋์ ๊ฐ์ด ํค๊ฐ ์์ฑ๋๋ค.
tools.py
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 11 17:10:52 2021
@author: clccclcc
"""
# =============================================================================
# >> conda install pycryptodome
# =============================================================================
# =============================================================================
#
# hash ์ base64์ ๋ํ์ฌ ์ดํด ๋ฐ ์ฌ์ฉ binary_to_text
#
# =============================================================================
# =============================================================================
# Hash tools
# =============================================================================
# from Cryptodome.Hash import SHA256
from Crypto.Hash import SHA256
import base64
def get_hash(msg):
sha = SHA256.new()
# sha = Hash.SHA256.new()
sha.update(msg)
hv = sha.digest()
return hv
def get_hash_file(file_name):
fh = open(file_name,'rb')
# sha = Hash.SHA256.new()
sha = SHA256.new()
data=fh.read(1024*2)
while data:
sha.update(data)
data = fh.read(1024*2)
hv = sha.digest()
return hv
def main():
msg='i love you'
hv = get_hash(msg.encode())
print(hv)
hv_enc64= base64.b64encode(hv)
print('b64_en:',hv_enc64)
hv_dec64 = base64.b64decode(hv_enc64)
print('b64_de:',hv_dec64)
file_name='tools.py'
hv = get_hash_file(file_name)
print(hv)
# main()
์ ์์๋ช ๋ถ๋ถ!
# -*- coding: utf-8 -*-
"""
Created on Thu May 13 14:06:06 2021
@author: hk
"""
#์ ์์๋ช
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 #์๊ทธ๋์ฒ ๋ชจ๋
from Crypto.Hash import SHA256
import myRSA as mytool
def make_sign_msg(key,msg):
hash_obj = SHA256.new(msg)
signer = PKCS1_v1_5.new(key) #์๋ช
์ ๊ฐ์ธํค(๊ฒ์ฆ ์ public key)
ans = signer.sign(hash_obj) #์ฌ์ธํ ๊ฐ, ๋ฉ์ธ์ง ํด์ ๊ฐ ๋ฃ๊ธฐ.
return ans
# =============================================================================
# ์ ์์๋ช
๊ฒ์ฆ ๋ก์ง
# =============================================================================
def verify_sign(key,msg,sign): #์ ์์๋ช
๊ฒ์ฆ
hash_obj = SHA256.new(msg)
verifyer = PKCS1_v1_5.new(key) #๋ณดํต base64 ์ธ์ฝ๋ฉ
if verifyer.verify(hash_obj, sign): #์ด๋ ๊ฒ ๋ฒ ๋ฆฌํ์ด ํด์ค
return True
else:
return False
# =============================================================================
# ์ ์์๋ช
# =============================================================================
def test1():
msg = 'i love you'
pr_key = mytool.get_key('pr1.key')
sign = make_sign_msg(pr_key, msg.encode())
print("์ ์์๋ช
: ",sign,"\n๊ธธ์ด : ",len(sign))
# msg1 = 'i hate you'
# sign1 = make_sign_msg(pr_key, msg1.encode())
# print("\n๋ค๋ฅธ msg ์๋ช
: ",sign1)
pu_key = mytool.get_key('pu1.key')
if verify_sign(pu_key, msg.encode(), sign):
print('verify')
else:
print('not verify')
#test1()
def test2():
msg = 'i love you'
pr_key = mytool.get_key('pr1.key')
sign = make_sign_msg(pr_key, msg.encode())
sign_txt = base64.b64encode(sign) #base64๋ก ์ธ์ฝ๋ฉ
print(sign_txt) #base64๋ก ์ ์์๋ช
๋์ด์์. ex) ๊ณต์ธ ์ธ์ฆ์
#test2()
# =============================================================================
# ๋ฌด๊ฒฐ์ฑ ๋ถ์ธ๋ฐฉ์ง ๊ฐ๋ฅ(mac์ ๋ถ์ธ๋ฐฉ์ง ์๋จ)
# =============================================================================
def test3():
msg = 'i love you'
#์ ์์๋ช
: ๋ฌด๊ฒฐ์ฑ, ๋ถ์ธ๋ฐฉ์ง ๊ฐ๋ฅ, mac์ ๋ถ์ธ๋ฐฉ์ง ๋ถ๊ฐ๋ฅ
#์ test2ํจ์์์ ๋์จ base64 encoding๊ฐ
sign_txt ='cZ27zUkhciRWoe1x17JqsIqUpTyg5/ZlI2vHu/1IBaKVOM3Oeaw/qdxlSH7DHoohf8y5qIr7UnRVl6CIeMZEatqazwNn7Cke2rFIjtBJ1xO5kEsbl8SVhMuV2tucS5jF3g1T6n5+cjlulO6XXwZ7ZkYkjhboX5S45ZNIfKLZsKk='
sign = base64.b64decode(sign_txt) #์ธ์ฝ๋ฉ๋ ๊ฒ์ ๋ฐ์ด๋๋ฆฌ๋ก ๋์ฝ๋ฉํด์ค๋ค.
pu_key = mytool.get_key('pu1.key')#๊ฒ์ฆ์ ์ํจ.
if verify_sign(pu_key, msg.encode(), sign):
print('verify')
else:
print('not verify!')#msg ๊ฐ์ด ๋ณ์กฐ๋๋ค๋ฉด ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง๋ค.
#test3()
# =============================================================================
# ํ์ผ์ ์ ์์๋ช
๊ตฌํ๊ธฐ
# =============================================================================
def make_sign_file(key,file_name):
save_file = file_name + '.txt' #์ด๊ธฐ ์ฌ์ฐ๋ผ๊ณ ํ์ฅ์ ๋ฐ๊ฟ์ค ๊ฒ.
fr = open(file_name,'rb')
data = fr.read()
print("๊ธธ์ด : ",len(data))
hash_obj = SHA256.new(data)
signer = PKCS1_v1_5.new(key) #์๋ช
์ ๊ฐ์ธํค(๊ฒ์ฆ ์ public key)
ans = signer.sign(hash_obj) #์ฌ์ธํ ๊ฐ, ๋ฉ์ธ์ง ํด์ ๊ฐ ๋ฃ๊ธฐ.
return ans
def verify_sign_file(key,file_name,sign):
fr = open(file_name,'rb')
data = fr.read()
hash_obj = SHA256.new(data)
verifyer = PKCS1_v1_5.new(key) #์๋ช
์ ๊ฐ์ธํค(๊ฒ์ฆ ์ public key)
if verifyer.verify(hash_obj, sign):
return True
else:
return False
def test4():
# key = mytool.get_key('pr1.key')
# sign = make_sign_file(key,'5-1.py')
# sign_txt = base64.b64encode(sign)
# print(sign)
# print(sign_txt)
sign_txt = 'I06/ItATOoGLqkzry9FHBgJu7PP1jbT4x47ORA3fljcaOLMubJgEZrPxX4EhIm1EeF6kqParMQpSeMBXfuvymupiF6uuJiFrCZchRNyQYwEA8cu08Ijdcw/4masEHfkSPHjp/iNz5oJseJBUpu9Kv8tzUptwWIozpfdwvZi2LbU='
sign = base64.b64decode(sign_txt)
pu_key = mytool.get_key('pu1.key')
if verify_sign_file(pu_key, '5-1.py', sign):
print('verify!')
else:
print('not verify!')
test4()
anaconda ํ๊ฒฝ
->conda env list
ํ์ฌ๊น๋ฆฐ ๋์ปค๋ฅผ ์๋ ค์ค
->conda list
ํ์ฌ ๋์ ๋์ปค์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค
->conda create -n my1 python=3.8 anaconda
๋ค์ ์๋์ฝ๋ค๋ฅผ ์์จ์ฃผ๋ฉด ๊ฐ์ํ๊ฒฝ์ spyder์ ๊ฐ์ ์ธํฐํ์ด์ค(์ฃผํผํฐ ๋ฑ) ๊ฐ ํจ๊ป ๊น๋ฆฌ์ง ์๋๋ค.
์ค์น๋จ.
์์ฑ๋๋ฉด my1 ์ผ๋ก ์ ์ํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊น๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์์.
1. conda install [ํจํค์ง ์ด๋ฆ]
2. pip install [ํจํค์ง ์ด๋ฆ]
2๊ฐ์ง๋ ์ฐจ์ด๊ฐ ์๋๋ฐ, ์ฝ๋ค ์ธ์คํจ์ ์ค์น ์ฅ์๋ฅผ ์๋์ฝ๋ค์์ ์ด์ํ๋ค. ๊ฑฐ๊ธฐ์ ๋ฑ๋ก๋๊ฒ ์์ผ๋ฉด ์ฐพ์๋ณด๊ณ ๋ค์ด๋ก๋ ํ๋ ๊ฒ์ด๋ค.(๊ธฐ๋ณธ ์ ์ฅ์)์ pip๋ python์ธ์ด ์์ฒด๊ฐ ์ ๊ณตํ๋ ์ฑ ์คํ ๋ฆฌ์ง ์ฌ๊ธฐ์ ๊ฐ์ง๊ณ ์์ ๊น๋๊ฒ์. ๋ด๋ถ์ ์ผ๋ก conda ์์ ๋ก๊ฒจ์์ ๊น๋ ๊ฒ์.
๊ฒฐ์ ์ ์ฐจ์ด :
conda install : a๋ฅผ ๊น๋ b๊ฐ ํ์ํ๋ค๋ฉด a๋ฅผ ๊น๋ b๊น์ง ๊น์์ค.(์ข ์ ๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ ๊ณตํด์ค)
pip install : a ๋ฅผ ๊น๋ b๊ฐ ํ์ํ๋ค๋ฉด a ๋ง ๊น์์ค (์ข ์ ๊ด๊ณ x)
์คํ์ด๋์ crypto ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด
1. pip install pycryptodome -> ๊น์์ค๋ค.
2. python -m Crypto.SelfTest -> ์ค์ค๋ก ํ ์คํธ ํด๋ณด๋ ๊ฒ
'Languages > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
[flask] Do it ์ ํ ํฌ ํ๋ผ์คํฌ _ 1. ํ๊ฒฝ ๊ตฌ์ฑ ๋ฐ ์๋ฒ ์คํ 2022.04.13
-
[์ํธํ๋กํ ์ฝ] Diffie-Hellman ํค ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ ๊ตฌํ 2021.05.20
-
[์ํธ ํ๋กํ ์ฝ] ๋์งํธ ์๋ช | ์ ์์๋ช ์ ์ํ ์๋ณตํธํ | ๊ณต๊ฐํค ์ฌ์ฉ์ ์ํ ์๋ณตํธํ 2021.05.06
-
[์ํธ ํ๋กํ ์ฝ] ๊ณต๊ฐํค ์ํธ 2021.04.15
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค