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