μƒˆμ†Œμ‹

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

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

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