import network
import socket
import machine
import utime
import uasyncio as asyncio
import ucryptolib # Built-in AES encryption library
# Simulated Temperature Sensor (Analog Input on GPIO 34)
sensor_pin = machine.ADC(machine.Pin(34))
sensor_pin.atten(machine.ADC.ATTN_11DB) # Full range (0-3.3V)
# AES Encryption Key (Must be 16, 24, or 32 bytes)
AES_KEY = b"mysecretkey12345" # 16-byte key
AES_IV = b"1234567890abcdef" # 16-byte IV (Initialization Vector)
SSID = "Wokwi-GUEST"
PASSWORD = ""
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8080
# ------------------------------ ENCRYPTION & DECRYPTION ------------------------------ #
def encrypt_data(data):
aes = ucryptolib.aes(AES_KEY, 2, AES_IV) # AES-CBC Mode
data_bytes = data.encode() # Convert string to bytes
pad = 16 - (len(data_bytes) % 16) # PKCS#7 Padding
data_bytes += bytes([pad] * pad) # Append padding
return aes.encrypt(data_bytes)
def decrypt_data(enc_data):
aes = ucryptolib.aes(AES_KEY, 2, AES_IV) # AES-CBC Mode
decrypted = aes.decrypt(enc_data) # Decrypt data
pad = decrypted[-1] # Get last byte (padding value)
return decrypted[:-pad].decode() # Remove padding & return string
# ------------------------------ VICTIM (Client) -------------------------------- #
async def victim_client():
while True:
try:
# Read sensor temperature
raw_value = sensor_pin.read()
real_temp = (raw_value / 4095) * 100 # Convert ADC to temperature
print(f"\n Victim (Client) Read: Temperature={round(real_temp, 2)}°C")
# Encrypt data before sending
encrypted_temp = encrypt_data(f"Temperature={round(real_temp, 2)}")
print(" Encrypted Data Sent:", encrypted_temp)
# Send to attacker before server
await attacker_mitm(encrypted_temp)
except Exception as e:
print(f" Victim Client Error: {e}")
await asyncio.sleep(5) # Simulate delay
# ------------------------------ ATTACKER (MitM - Now Fails to Modify Data) -------------------------------- #
async def attacker_mitm(enc_temp):
try:
print("\n Attacker Intercepted Encrypted Data:", enc_temp)
# Attacker tries to modify the data (Fails due to encryption)
try:
modified_data = enc_temp.replace(b"5", b"9") # Attacker attempts modification
print(" Attacker Tried to Modify Data:", modified_data)
except:
print(" Attacker Failed: Data is Encrypted and Cannot Be Modified")
# Send encrypted (unchanged) data to the server
await secure_server_receive(enc_temp)
except Exception as e:
print(f"Attacker Error: {e}")
# ------------------------------ SERVER (Receives & Decrypts Data) -------------------------------- #
async def secure_server_receive(enc_temp):
try:
print("\n Server Received Encrypted Data:", enc_temp)
# Decrypt data securely
decrypted_temp = decrypt_data(enc_temp)
print(" Server Decrypted Temperature:", decrypted_temp)
except Exception as e:
print(f"Secure Server Error: {e}")
# ------------------------------ MAIN EXECUTION -------------------------------- #
async def main():
await asyncio.gather(
victim_client(), # Victim (Client) Task
)
asyncio.run(main())