μƒˆμ†Œμ‹

Languages/Python

[μ•”ν˜Έ ν”„λ‘œν† μ½œ] 디지털 μ„œλͺ…| μ „μžμ„œλͺ…을 μœ„ν•œ μ•”λ³΅ν˜Έν™” | κ³΅κ°œν‚€ μ‚¬μš©μ„ μœ„ν•œ μ•”λ³΅ν˜Έν™”

  • -
λ°˜μ‘ν˜•

디지털 μ„œλͺ…

β€’ λ©”μ‹œμ§€μ˜ μΆœμ²˜μ™€ λ©”μ‹œμ§€ λ‚΄μš©μ— λŒ€ν•œ ν™•μ‹  을 μœ„ν•΄ λ©”μ‹œμ§€ 전체λ₯Ό μ•”ν˜Έν™”ν•˜λ©΄ λœλ‹€

β€’ μ΄λ ‡κ²Œ ν•˜λ©΄ λ©”λͺ¨λ¦¬κ°€ 많이 λ“ λ‹€

β€’ λ¬Έμ„œμ˜ κΈ°λŠ₯을 λŒ€μ‹ ν•˜λŠ” μž‘μ€ λΉ„νŠΈλΈ”λ‘μ„ μ•”ν˜Έν™”ν•˜λŠ” 방법이 ν•„μš”

β€’ μž‘μ€ λΉ„νŠΈλΈ”λ‘μ„ 인증자(authenticator)라 κ³  ν•œλ‹€

 

인증자

β€’ μΈμ¦μžλŠ” λ³€κ²½ 없이 λ¬Έμ„œλ§Œ λ³€κ²½ν•˜λŠ” 것이 λΆˆκ°€λŠ₯

β€’ 인증자λ₯Ό μ†‘μ‹ μžμ˜ κ°œμΈν‚€λ‘œ μ•”ν˜Έν™”ν–ˆλ‹€ λ©΄ 좜처, λ‚΄μš©, μˆœμ„œ ν™•μΈν•΄μ£ΌλŠ” μ„œλͺ…이닀

β€’ SHA-1 같은 μ•ˆμ „ ν•΄μ‹œμ½”λ“œκ°€ 이런 μ—­ν• 

β€’ λ©”μ‹œμ§€μ˜ 무결성은 보μž₯ν•˜μ§€λ§Œ 기밀성은 보μž₯ λͺ»ν•œλ‹€

 

디지털 μ„œλͺ…μ˜ 2가지 방법 

1. λ©”μ‹œμ§€μ— μ„œλͺ…

2. λ©”μ‹œμ§€ ν•΄μ‹œκ°’μ— μ„œλͺ…

 

κ³΅κ°œν‚€μ— μ˜ν•œ μ•”ν˜Έν™”(κ³΅κ°œν‚€ μ•”ν˜Έ)

κ°œμΈν‚€μ— μ˜ν•œ μ•”ν˜Έν™”(λ””μ§€ν„Έμ„œλͺ…)

 

 

μ΅œλŒ€ 86κΈ€μžκΉŒμ§€ κ°€λŠ₯,고정은 128λΉ„νŠΈμ΄λ‹€. (ν‚€ 길이가 1024 μ΄λ―€λ‘œ 128 κ³ μ •λΉ„νŠΈμΈ 것, 2048의 경우 256 λΉ„νŠΈμ΄λ‹€.)

2048 의 경우 214κΈ€μžκΉŒμ§€ κ°€λŠ₯ν•˜λ‹€.

 

μ†ŒμŠ€μ½”λ“œ

import base64 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP #μ•”ν˜Έν™”λ₯Ό μœ„ν•΄ μ‚¬μš©(퍼블릭킀 μ‹œμŠ€ν…œ) # ============================================================================= # key 생성 및 μ €μž₯ # ============================================================================= def make_key(): pr_key = RSA.generate(2048) #1024길이의 ν‚€ 생성. pu_key = pr_key.public_key() pr_file = open('pr.key','wb') pr_file.write(pr_key.export_key('PEM')) pr_file.close() pu_file = open('pu.key','wb') pu_file.write(pu_key.export_key('PEM')) pu_file.close() #make_key() #μœ„ ν•¨μˆ˜λ₯Ό λ¨Όμ € μ‹€ν–‰μ‹œμΌœμ„œ, key νŒŒμΌμ„ μ–»κ³ , 이 ν›„ 메인을 μ‹€ν–‰μ‹œμΌœμ€€λ‹€. # ============================================================================= # 메세지 μ•”ν˜Έν™” # ============================================================================= def encrypt_msg(msg,key): tool = PKCS1_OAEP.new(key) msg_enc = tool.encrypt(msg) return msg_enc # ============================================================================= # 메세지 λ³΅ν˜Έν™” # ============================================================================= def decrypt_msg(msg,key): tool= PKCS1_OAEP.new(key) msg_dec = tool.decrypt(msg) return msg_dec # ============================================================================= # νŒŒμΌμ—μ„œ ν‚€ κ°€μ Έμ˜€κΈ° # ============================================================================= def get_key(path): fr = open(path,'rb') key = RSA.importKey(fr.read()) return key # ============================================================================= # 메인 ν•¨μˆ˜ # ============================================================================= def main(): #msg = 'i'*86 #μ΅œλŒ€ 86κΈ€μžκΉŒμ§€ μ•”ν˜Έν™” 됨. μ•”ν˜Έν™” ν•˜λ©΄ 무쑰건 128λΉ„νŠΈ. msg = 'hi my name is haeun' pu_key = get_key('pu.key') msg_enc = encrypt_msg(msg.encode(), pu_key) print("원문",msg) print("μ•”ν˜Έν™” 길이",len(msg_enc)) print("μ•”ν˜Έν™”",msg_enc) pr_key = get_key('pr.key') msg_dec = decrypt_msg(msg_enc, pr_key) print("λ³΅ν˜Έν™”",msg_dec) main()

 

κ²°κ³Ό κ°’

 

κ³΅κ°œν‚€ λΉ„λ°€ν‚€λ₯Ό λ°›κ³  평문을 μ•”ν˜Έν™”, λ³΅ν˜Έν™” ν•˜λŠ” 과정을 μ‹€μŠ΅ν•΄λ³Έλ‹€κ³  ν•˜λ©΄!

 

1. μ„œλ‘œ κ³΅κ°œν‚€κ΅ν™˜ (A,Bκ°€ ν‚€λ₯Ό μ„œλ‘œ κ³΅κ°œν•œλ‹€ -> κ³΅κ°œν‚€)

 

2. 보내고 싢은 메세지 μ•”ν˜Έν™” -> μƒλŒ€μ˜ κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™” (Aκ°€ Bμ—κ²Œ λ³΄λ‚΄λŠ” 경우 AλŠ” B의 κ³΅κ°œν‚€λ₯Ό μ΄μš©ν•΄μ„œ μ•”ν˜Έν™” ν•œν›„, base64둜 인코딩 ν•΄μ€€λ‹€)

 

3. μƒλŒ€λŠ” μžμ‹ μ˜ κ°œμΈν‚€λ‘œ 메세지λ₯Ό ν’€μ–΄λ³Έλ‹€.(메세지λ₯Ό 받은 BλŠ” Aμ—κ²Œ 받은 μ•”ν˜Έλ¬Έμ„ λ¨Όμ € base64decodingν•˜κ³  -> 이후 λ‚΄μš©μ„ λ³΅ν˜Έν™” ν•œλ‹€)

 

import base64 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP #μ•”ν˜Έν™”λ₯Ό μœ„ν•΄ μ‚¬μš©(퍼블릭킀 μ‹œμŠ€ν…œ) # ============================================================================= # key 생성 및 μ €μž₯ # ============================================================================= def make_key(): pr_key = RSA.generate(2048) #1024길이의 ν‚€ 생성. pu_key = pr_key.public_key() pr_file = open('pr.key','wb') pr_file.write(pr_key.export_key('PEM')) pr_file.close() pu_file = open('pu.key','wb') pu_file.write(pu_key.export_key('PEM')) pu_file.close() #make_key() #μœ„ ν•¨μˆ˜λ₯Ό λ¨Όμ € μ‹€ν–‰μ‹œμΌœμ„œ, key νŒŒμΌμ„ μ–»κ³ , 이 ν›„ 메인을 μ‹€ν–‰μ‹œμΌœμ€€λ‹€. # ============================================================================= # 메세지 μ•”ν˜Έν™” # ============================================================================= def encrypt_msg(msg,key): tool = PKCS1_OAEP.new(key) msg_enc = tool.encrypt(msg) return msg_enc # ============================================================================= # 메세지 λ³΅ν˜Έν™” # ============================================================================= def decrypt_msg(msg,key): tool= PKCS1_OAEP.new(key) msg_dec = tool.decrypt(msg) return msg_dec # ============================================================================= # νŒŒμΌμ—μ„œ ν‚€ κ°€μ Έμ˜€κΈ° # ============================================================================= def get_key(path): fr = open(path,'rb') key = RSA.importKey(fr.read()) return key # ============================================================================= # 파일 μ•”ν˜Έν™” # ============================================================================= def encrypt_file(file_name,key): pass # ============================================================================= # 파일 λ³΅ν˜Έν™” # ============================================================================= def decrypt_file(file_name,key): pass # ============================================================================= # 메인 ν•¨μˆ˜ # ============================================================================= def main(): #msg = 'i'*86 #μ΅œλŒ€ 86κΈ€μžκΉŒμ§€ μ•”ν˜Έν™” 됨. μ•”ν˜Έν™” ν•˜λ©΄ 무쑰건 128λΉ„νŠΈ. # msg = 'κΉ€λ„ν˜„ 바보 멍청이 γ…‹γ…‹' # pu_key = get_key('pu.key') # msg_enc = encrypt_msg(msg.encode(), pu_key) # print("원문",msg) # print("μ•”ν˜Έν™” 길이",len(msg_enc)) # print("μ•”ν˜Έν™”",msg_enc) txt = 'TsdbYuJbSTA+4U0IUU5DvQnX/Sb6vP27lefWG0aGjRtQCuwHpmZE+VebfYfyKJliqZH147nYifKG1snIJuZ0c0XLOvXVmHkryWN5FiGcrZqtAEmoXDKUx/m5kCeWteuGmoQGEonn/LVqmexRqg1cBzOx219ibd8Nxa5uQV+u5JN/VRyQFA6Zf/A8Wvk+IxH7ANiK99lrrff9Q94BGPMB8BE6Oj3cAcxEirPfHf4o8SIApKv6l9DnFOFRdZUF0k2ctwNpfDM21wRC5LEFnOsg2pDVPh789ErCjMY/N4+yOg7mfMPVJDOFrdrJ0ToZ3CiN5d5CpEr+Ckn7T3Yp8f3z6g==' txt = base64.b64decode(txt) #msg_enc_txt = base64.b64encode(msg_enc) print(txt) pr_key = get_key('pr.key') msg_dec = decrypt_msg(txt, pr_key) print("λ³΅ν˜Έν™”",msg_dec.decode()) main()

μ•”ν˜Έν™”+ base64 encoding 된 메세지

 

λ³΅ν˜Έν™” + base64decoding 된 메세지

 

 

 

μƒμ„±λ˜λŠ” ν‚€λŠ” λ‹€μŒκ³Ό 같이 ν‘œμ‹œλœλ‹€.

ν•˜λ‚˜λ‘œ 합쳐놓은 것이고

29라인을 κΈ°μ€€μœΌλ‘œ μœ„λŠ” pr_key, μ•„λž˜λŠ” pu_key 이닀.

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.