import gradio as gr from cryptography.fernet import Fernet from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC import os import base64 import hashlib from pathlib import Path import qr import stegan import json def trans_block(sender,recipient,amount): transaction = [{ 'sender': sender, 'recipient': recipient, 'amount': amount }] json_object = json.dumps(transaction, indent=4) print (json_object) return json_object def create_key(passw): key = passw.encode() h = hashlib.new('sha256') h.update(key) key = h.hexdigest() key = key.encode() #salt = os.urandom(16) salt = key kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=salt, iterations=480000, ) key = base64.urlsafe_b64encode(kdf.derive(key)) return key def encrypt(passw,trans_s=None,trans_r=None,trans_a=None): #key = Fernet.generate_key() key = create_key(passw) fernet = Fernet(key) enc_mes="" enc_file=None if trans_s != None and trans_r != None and trans_a != None and trans_s != "" and trans_r != "" and trans_a != "": trans = trans_block(trans_s,trans_r,trans_a) bytes_j = trans.encode() json_bytes = fernet.encrypt(bytes_j) enc_mes = f'{json_bytes}+ccc+' #enc_qr = qr.make_qr(txt=(enc_mes.strip('"'))) m = hashlib.sha256() bytes_enc_mes = enc_mes.encode() m.update(bytes_enc_mes) out = m.hexdigest() out = out.encode() print(out) qr_link = out enc_qr = stegan.conv_im(qr_link=qr_link,data=enc_mes) return enc_mes,enc_qr,enc_qr def decrypt(passw,enc_in=None): key = create_key(passw) fernet = Fernet(key) dec_im = None mes_dec= None enc_in=enc_in.strip('"') print (f'enc_in :::: {enc_in}') if "+aaa+" in enc_in: mes1=enc_in.split("+aaa+",1)[0] mes1=mes1.strip("b'").strip("'") mes_bytes = bytes(mes1,'utf-8') mes_dec = fernet.decrypt(mes_bytes).decode() if "+bbb+" in enc_in: mes12=enc_in.split("+aaa+",1)[1] mes2=mes12.split("+bbb+",1)[0] mes2=mes2.strip("b'").strip("'") im_bytes = bytes(mes2,'utf-8') print(f'im_bytes::{im_bytes}') mes2 = fernet.decrypt(mes2).decode() #base = bytes(decMessage, 'utf-8') with open(f"finished_im.png", "wb") as fh: #fh.write(base64.decodebytes(im_bytes)) fh.write(base64.decodebytes(bytes(mes2, 'utf-8'))) fh.close dec_im = "finished_im.png" if "+ccc+" in enc_in: mes13=enc_in.split("+bbb+",1)[1] mes3=mes13.split("+ccc+",1)[0] mes3=mes3.strip("b'").strip("'") json_bytes = bytes(mes3,'utf-8') print(f'im_bytes::{json_bytes}') dec_json = fernet.decrypt(json_bytes).decode() if not "+bbb+" in enc_in: if "+ccc+" in enc_in: mes14=enc_in.split("+aaa+",1)[1] mes4=mes14.split("+ccc+",1)[0] mes4=mes4.strip("b'").strip("'") json_bytes = bytes(mes4,'utf-8') print(f'im_bytes::{json_bytes}') dec_json = fernet.decrypt(json_bytes).decode() if not "+aaa+" in enc_in: if "+bbb+" in enc_in: mes2 = enc_in.split("+bbb+",1)[0] mes2=mes2.strip("b'").strip("'") im_bytes = bytes(mes2,'utf-8') print(f'im_bytes2::{im_bytes}') mes2 = fernet.decrypt(mes2).decode() #base = bytes(decMessage, 'utf-8') with open(f"finished_im.png", "wb") as fh: #fh.write(base64.decodebytes(im_bytes)) fh.write(base64.decodebytes(bytes(mes2, 'utf-8'))) fh.close dec_im = "finished_im.png" if "+ccc+" in enc_in: mes13=enc_in.split("+bbb+",1)[1] mes3=mes13.split("+ccc+",1)[0] mes3=mes3.strip("b'").strip("'") json_bytes = bytes(mes3,'utf-8') print(f'im_bytes::{json_bytes}') dec_json = fernet.decrypt(json_bytes).decode() if not "+bbb+" in enc_in: if "+ccc+" in enc_in: mes4=enc_in.split("+ccc+",1)[0] mes14=mes4.strip("b'").strip("'") json_bytes = bytes(mes14,'utf-8') print(f'im_bytes::{json_bytes}') dec_json = fernet.decrypt(json_bytes).decode() return(dec_im, mes_dec, dec_json) def decode_doc(passw,doc=None): key = create_key(passw) fernet = Fernet(key) doc_name = doc.name doc_name = doc_name.split("/",4)[4] #bytes_d = doc.encode() #doc = Path(doc) with open(doc.name, "rb") as file: # read all file data file_data = file.read() dec_doc = fernet.decrypt(file_data) og_name = doc.name og_end = og_name.split(".",1)[1] og_front=og_name.split(".",1)[0] dec_file = doc.name.strip(".ocrpt") #enc_file=f'{doc.name}.ocrpt' with open(dec_file, "wb") as file: file.write(dec_doc) return dec_file def decode_qr(im,passw): with open(f'{im}', "rb") as image_file: bytes_i = base64.b64encode(image_file.read()) decode_qr = stegan.decode(im) dec_im,mes_dec,dec_json = decrypt(passw, enc_in=decode_qr) return(dec_im,mes_dec,dec_json) with gr.Blocks() as app: with gr.Row(): gr.Column() with gr.Column(): with gr.Tab("Encrypt"): pass_in=gr.Textbox(label="Set Password") with gr.Row(): with gr.Column(): send=gr.Textbox(label="Sender") rec=gr.Textbox(label="Recipient") am=gr.Textbox(label="Amount") en_btn = gr.Button("Encrypt") enc_out = gr.Textbox(label="Encrypted Bytes") enc_qr_out = gr.Image(label = "Encrypted QR") with gr.Tab("Decrypt"): pass_out = gr.Textbox(label="Enter Password") dec_qr_im = gr.Image(type="filepath") d_json = gr.JSON(label="Decrypted JSON") dec_qr_txt = gr.Textbox(label="Decrypted Message") dec_qr_im_out =gr.Image(label="Decrytped Image") dec_qr_btn = gr.Button("Decrypt") gr.Column() dec_qr_btn.click(decode_qr,[dec_qr_im,pass_out],[dec_qr_im_out,dec_qr_txt,d_json]) en_btn.click(encrypt,[pass_in,send,rec,am],[enc_out,enc_qr_out,dec_qr_im]) app.launch()