๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Tried. Failed. Logged.
๐Ÿ”’์ •๋ณด๋ณด์•ˆ/์•”ํ˜ธ

์•”ํ˜ธ - SSL/TLS hand shake ์ž‘๋™ ์›๋ฆฌ ํŒŒ์ด์ฌ ๊ตฌํ˜„

by Janger 2025. 4. 10.
728x90

์•ˆ์ „ํ•œ ์„ธ์…˜์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ์œ„ํ•ด์„œ ๋น„๋Œ€์นญ ํ‚ค๋ฅผ ์ด์šฉํ•œ ํ‚ค ๊ตํ™˜์„ ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •์ธ SSL hand shake๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค. 

์œ ํšจํ•œ ID์ธ์ง€ ํ™•์ธ, RSA ํ‚ค๊ตํ™˜, ์„ธ์…˜ ํ‚ค(AES) ๊ตํ™˜์ด ์กด์žฌ๋กœ ํ•œ๋‹ค. 

simple-ssl.py
# simple-ssl.py
# ๊ฐ„๋‹จํ•œ SSL ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„

import rsa, random
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes


class Client:
    def __init__(self):
        self.CertList = [] # ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ์ฆ์„œ ๋ฆฌ์ŠคํŠธ(์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” CA์˜ ์ธ์ฆ์„œ)
        self.CertList.append("www.valid.com") # ์ธ์ฆ์„œ ID
        self.sessionKey = None # ์„ธ์…˜ ํ‚ค

    def generateSessionKey(self):
        # 16๋ฐ”์ดํŠธ์˜ ๋žœ๋ค ํ‚ค ์ƒ์„ฑ
        sessionKey = get_random_bytes(16)
        return sessionKey


class Server:
    def __init__(self):
        self.Certificate = [] # ์„œ๋ฒ„ ์ธ์ฆ์„œ(์ธ์ฆ์„œ ID, ๊ณต๊ฐœํ‚ค)
        (pubkey, privkey) = rsa.newkeys(512)
        self.privkey = privkey
        self.Certificate.append("www.valid.com") # ์ธ์ฆ์„œ ID
        self.Certificate.append(pubkey) # ๊ณต๊ฐœํ‚ค
        self.serverRandom = random.randint(0, 100)
        self.sessionKey = None



if __name__ == '__main__':
    client = Client()
    server = Server()

    # 1. Client Hello
    print("Client Hello →")

    # 2. Server Hello
    print("← Server Hello")
    print("[!] server's Random:", server.serverRandom)
    client.serverRandom = server.serverRandom
    print("[~] Valid Certificate:", server.Certificate[0])
    if server.Certificate[0] in client.CertList:
        print("[O] Certificate is valid")
        print("[!] Server's Public Key:", server.Certificate[1])
    else:
        print("[X] Certificate is invalid. Connection is closed.")
        exit()

    # 3. Client Key Exchange
    print("Client Key Exchange →")
    client.sessionKey = client.generateSessionKey()
    print("[!] Session Key:", client.sessionKey)

    crypt = rsa.encrypt(client.sessionKey, server.Certificate[1])
    print("[!] Encrypted Session Key:", crypt)
    
    server.sessionKey = rsa.decrypt(crypt, server.privkey)
    print("[!] Decrypted Session Key:", server.sessionKey)

    # 4. Data Transfer(Client → Server)
    print("Data Transfer →")
    message = b'Hello Server!'
    print("[!] Message:", message)
    cipher = AES.new(client.sessionKey, AES.MODE_EAX)
    ciphertext, tag = cipher.encrypt_and_digest(message)
    print("[!] Encrypted Message:", ciphertext)

    cipher = AES.new(server.sessionKey, AES.MODE_EAX, cipher.nonce)
    plaintext = cipher.decrypt(ciphertext)
    print("[!] Decrypted Message:", plaintext.decode())

 

728x90