200 lines
6.2 KiB
Python
200 lines
6.2 KiB
Python
import paho.mqtt.client as paho
|
|
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
|
|
import paho.mqtt.publish as pahopub
|
|
#from simplecrypt import encrypt, decrypt
|
|
from cryptography.fernet import Fernet
|
|
from cryptography.hazmat.backends import default_backend
|
|
from cryptography.hazmat.primitives import hashes
|
|
import base64
|
|
from ctypes import *
|
|
import _ctypes
|
|
from textwrap import wrap
|
|
import time
|
|
import csv
|
|
from Crypto.PublicKey import RSA
|
|
from Crypto.Cipher import PKCS1_OAEP as Cipher
|
|
|
|
|
|
# Konfigurasi MQTT server
|
|
broker = "nnag.xyz"
|
|
client = paho.Client()
|
|
port = 1883
|
|
|
|
def fernet_keygen():
|
|
password="urg123"
|
|
pass_byte=password.encode()
|
|
salt=b'salt_'
|
|
kdf = PBKDF2HMAC(
|
|
algorithm=hashes.SHA256(),
|
|
length=32,
|
|
salt=salt,
|
|
iterations=100,
|
|
backend=default_backend()
|
|
)
|
|
key = base64.urlsafe_b64encode(kdf.derive(pass_byte))
|
|
return key
|
|
|
|
def fernet_encrypt(plain):
|
|
time_s = time.perf_counter()
|
|
fernet_key = fernet_keygen()
|
|
send_data = Fernet(fernet_key).encrypt(plain.encode())
|
|
time_e = time.perf_counter()
|
|
end = time_e - time_s
|
|
|
|
print("Fernet Plain Length : ",len(plain))
|
|
print("Fernet Key Length : ",len(fernet_key))
|
|
print("Fernet Encryption Time : ",end)
|
|
print(" ")
|
|
return end, send_data
|
|
|
|
def u_encrypt(arg):
|
|
so_file = 'EES401/URG_encrypt.so'
|
|
u_enc = CDLL(so_file)
|
|
u_enc.main.restype = c_double
|
|
u_enc.main.argtype = c_char_p
|
|
str_temp = "07"
|
|
c_return = u_enc.main(arg.encode('utf-8'), str_temp.encode('utf-8'))
|
|
print("Python Log, C Return : ", c_return)
|
|
# time.sleep(0.01)
|
|
_ctypes.dlclose(u_enc._handle)
|
|
|
|
return c_return
|
|
|
|
|
|
def rsa_encrypt(plain):
|
|
|
|
rsa3072 = open("RSA7680_pub.pem", "r").read()
|
|
start=time.perf_counter()
|
|
rsa_pub = RSA.importKey(rsa3072)
|
|
rsa_pub = Cipher.new(rsa_pub)
|
|
RSA_enc = rsa_pub.encrypt(plain.encode('utf8'))
|
|
# RSA_enc = rsa_pub.encrypt(plain)
|
|
#RSA_enc = rsa_pub.encrypt(plain.encode('utf8'), 32)
|
|
end=time.perf_counter()-start
|
|
cipher = RSA_enc
|
|
# cipher = str(cipher).encode('utf-8')
|
|
# rsa_file_handler(base_name_RSA3, i, cipher)
|
|
print("RSA Encryption Time : ", end)
|
|
print("Cipher ", cipher)
|
|
print("Length ", len(cipher))
|
|
print(" ")
|
|
|
|
return end, cipher
|
|
|
|
|
|
def file_handler(f_name, num):
|
|
# num = str(num).zfill(2)
|
|
# f = open("./cipher/"+f_name+"_"+num+".dat", "rb")
|
|
f = open("/tmp/cipher_07.dat", "rb")
|
|
ret = f.read()
|
|
f.close()
|
|
return ret
|
|
|
|
# def rsa_file_handler(f_name, num, cipher):
|
|
# num = str(num).zfill(2)
|
|
# f = open("./cipher/"+f_name+"_"+num+".dat", "wb")
|
|
# f.write(cipher)
|
|
|
|
#Proses enkripsi
|
|
def payload_process(plain):
|
|
dec_time = u_encrypt(plain)
|
|
# cipher = u_encrypt(plain)
|
|
# time.sleep(0.05)
|
|
cipher = file_handler("cipher_EES401", 7)
|
|
# print("Cipher Length : ", len(plain))
|
|
send_data = base64.b64encode(cipher)
|
|
return send_data, dec_time
|
|
|
|
def payload_fernet(plain):
|
|
dec_time, cipher = fernet_encrypt(plain)
|
|
send_data = base64.b64encode(cipher)
|
|
return send_data, dec_time
|
|
|
|
def payload_RSA(plain):
|
|
dec_time, cipher = rsa_encrypt(plain)
|
|
# cipher = u_encrypt(plain)
|
|
# time.sleep(0.05)
|
|
# cipher = rsa_file_handler("cipher_EES401", 7)
|
|
# print("Cipher Length : ", len(plain))
|
|
send_data = base64.b64encode(cipher)
|
|
return send_data, dec_time
|
|
|
|
def plain_handler(f_name, num):
|
|
num = str(num).zfill(2)
|
|
f = open("./plain/"+f_name+"_"+num+".txt", "r")
|
|
return f.read()
|
|
|
|
|
|
# Add this to test the Blacklist feature
|
|
# blacklist_trigger = base64.b64encode(b"I'm gonna make this program crash!"*10)
|
|
# cipher_arr.append(blacklist_trigger)
|
|
# msg_data = blacklist_trigger
|
|
|
|
# ======================== || START FROM HERE BUDDY || ==================
|
|
def main(msg):
|
|
# plain = input("Enter The Message : ")
|
|
plain = msg
|
|
plain_ori = plain
|
|
# plain = plain_handler("plain", i)
|
|
i = 0
|
|
my_ip = "device01"
|
|
identifier = "&"
|
|
f_name = "cipher_EES401"
|
|
plain_arr = []
|
|
cipher_arr = []
|
|
# plain = input("Enter plain : ")
|
|
# plain = "This message is longer than 4 char"
|
|
# x = 16 - (len(plain)%16)
|
|
# plain = plain+(" "*x)
|
|
# plain_arr = wrap(plain, 16, replace_whitespace=False, drop_whitespace=False)
|
|
# print("Join List Test ", ''.join(plain_arr))
|
|
# client.tls_set()
|
|
# client.username_pw_set(username="aaa", password="pass")
|
|
status = client.connect(broker,port)
|
|
print("Connection status, ", status)
|
|
# input()
|
|
# plain_now = plain_arr[1]
|
|
time_tmp = []
|
|
|
|
# ******************************8
|
|
# for i in range(len(plain_arr)):
|
|
# # print(" ")
|
|
# # print("===== [ Sequence "+str(i)+" ] "+"======================================================")
|
|
# # data_now, dec_time = payload_process(plain_arr[i])
|
|
# # data_now, dec_time = payload_RSA(plain_arr[i])
|
|
# data_now, dec_time = payload_fernet(plain_arr[i])
|
|
# cipher_arr.append(data_now)
|
|
# time_tmp.append(dec_time)
|
|
|
|
# dec_acc = sum(map(float, time_tmp))
|
|
# xxx = (base64.b64decode(cipher_arr[0]))
|
|
# print("cipher len : ",len(xxx))
|
|
# print("base64 cipher len : ",len(data_now))
|
|
|
|
# msg_data = b''.join(cipher_arr)
|
|
# ******************************8
|
|
|
|
# send_data = my_ip+identifier+msg_data.decode('ascii')
|
|
msg_data, dec_time = payload_fernet(plain)
|
|
send_data = msg_data.decode('ascii')
|
|
# print("Python LOG Plain : ", plain)
|
|
# print(" ")
|
|
# print("===== Result ======================================================")
|
|
# print("Python LOG Plain Length : ", len(plain_ori))
|
|
# print("Python LOG Plain with Padding Length : ", len(plain))
|
|
# print("Sending Cipher with length : ", len(send_data))
|
|
# print("Python LOG Plain Array : ", plain_arr)
|
|
# print("Python LOG Cipher Length : ", len(send_data))
|
|
# client.publish("device01/msg", "XXXXX")
|
|
client.loop_start()
|
|
print("Total sent data ", len(send_data));
|
|
# client.connect("nnag.xyz", 1883)
|
|
# pahopub.single("device01/msg", "xxxx")
|
|
client.publish("device01/msg", msg_data)
|
|
# input()
|
|
|
|
return dec_time
|
|
|
|
# test_str = "Test String"
|
|
# client.publish("device01/msg", base64.b64encode(test_str.encode("utf-8")) )
|