chat-at / crypt.py
Omnibus's picture
Create crypt.py
c4f06ed
raw
history blame
5.86 kB
import gradio as gr
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.Hash import RIPEMD160, SHA256
from Crypto.Signature import pkcs1_15
import binascii
import base58
import stegan
import stegan2
import qr
import overlay
def calculate_hash(data, hash_function: str = "sha256") -> str:
if type(data) == str:
data = bytearray(data, "utf-8")
if hash_function == "sha256":
h = SHA256.new()
h.update(data)
return h.hexdigest()
if hash_function == "ripemd160":
h = RIPEMD160.new()
h.update(data)
return h.hexdigest()
def generate_keys():
secret_code="SECRET PASSWORD"
key = RSA.generate(2048)
#private_key = key.export_key('PEM')
private_key = key.export_key(passphrase=secret_code, pkcs=8,
protection="scryptAndAES128-CBC")
print(f'private_key:: {private_key}')
file_out_priv = open("private.pem", "wb")
file_out_priv.write(private_key)
file_out_priv.close()
public_key = key.publickey().export_key('PEM')
file_out_pub = open("receiver.pem", "wb")
file_out_pub.write(public_key)
file_out_pub.close()
hash_1 = calculate_hash(public_key, hash_function="sha256")
hash_2 = calculate_hash(hash_1, hash_function="ripemd160")
address = base58.b58encode(hash_2)
address_im=qr.make_qr(txt=address)
add_label = str(address)
add_label = add_label.strip("b").strip("'")
address_im = overlay.textover(address_im, "Wallet",add_label)
address_im.save("address_im.png")
#qr_link="test"
address_im = "address_im.png"
private_key_im = overlay.textover("private_key.png", "Key",add_label)
private_key_im.save("private_key_im.png")
priv_key = stegan.conv_im("private_key_im.png",data=private_key)
pub_key = stegan.conv_im("address_im.png",data=public_key)
return public_key,private_key,address_im,address,priv_key,pub_key
def sign(data,in2):
priv_key = stegan2.decode(in2)
print(f'priv_key:: {priv_key}')
private_key = RSA.import_key(priv_key)
hash_object = SHA256.new(data)
signature = pkcs1_15.new(private_key).sign(hash_object)
signature = binascii.hexlify(signature).decode("utf-8")
data_json = {
"data": data,
"signature": signature
}
return data_json
def validate_signature(public_key: bytes, signature: bytes, transaction_data: bytes):
public_key_object = RSA.import_key(public_key)
transaction_hash = SHA256.new(transaction_data)
pkcs1_15.new(public_key_object).verify(transaction_hash, signature)
def encrypt_text(data,pub_im,priv_im,address):
pub_key = stegan2.decode(pub_im)
#priv_key = stegan2.decode(in2)
#print(f'priv_key:: {priv_key}')
#private_key = RSA.import_key(priv_key)
data = data.encode("utf-8")
#data = sign(data,priv_im)
recipient_key = RSA.import_key(pub_key)
session_key = get_random_bytes(16)
# Encrypt the session key with the public RSA key
cipher_rsa = PKCS1_OAEP.new(recipient_key)
enc_session_key = cipher_rsa.encrypt(session_key)
# Encrypt the data with the AES session key
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
file_out = open("encrypted_data.bin", "wb")
[ file_out.write(x) for x in (enc_session_key, cipher_aes.nonce, tag, ciphertext) ]
file_out.close()
doc_name = "encrypted_data.bin"
with open(doc_name, "rb") as file:
file_data =(file.read())
print (f'file_data::{file_data}')
qr_link="test"
#trans_im1.save("trans_im.png")
hash_1 = calculate_hash(pub_key, hash_function="sha256")
hash_2 = calculate_hash(hash_1, hash_function="ripemd160")
address = base58.b58encode(hash_2)
add_label = str(address)
add_label = add_label.strip("b").strip("'")
trans_im1=qr.make_qr(txt=address, color_b="#ECFD08")
#address_im = "address_im.png"
private_key_im = overlay.textover(trans_im1, "Transaction",add_label)
private_key_im.save("private_key_im.png")
#trans_im1.save("trans_im.png")
enc_qr = stegan.conv_im("private_key_im.png",data=file_data)
file.close()
return str(file_data),enc_qr
def decrypt_text(im,in2):
enc_in = stegan2.decode(im)
secret_code="SECRET PASSWORD"
#private_key = RSA.import_key(open("private.pem").read())
priv_key = stegan2.decode(in2)
print(f'priv_key:: {priv_key}')
private_key = RSA.import_key(priv_key,passphrase=secret_code)
print(f'private_key:: {private_key}')
enc_session_key = enc_in[:private_key.size_in_bytes()]
end1 = private_key.size_in_bytes()+16
nonce = enc_in[private_key.size_in_bytes():end1]
start1=end1+1
end2 = private_key.size_in_bytes()+32
start2=end2+1
tag = enc_in[end1:end2]
ciphertext = enc_in[end2:]
print (f'enc_session_key::{enc_session_key}')
print (f'nonce::{nonce}')
print (f'tag::{tag}')
print (f'ciphertext::{ciphertext}')
# Decrypt the session key with the private RSA key
cipher_rsa = PKCS1_OAEP.new(private_key)
session_key = cipher_rsa.decrypt(enc_session_key)
# Decrypt the data with the AES session key
cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
data = cipher_aes.decrypt_and_verify(ciphertext, tag)
#public_key = private_key.publickey().export_key('PEM')
#data_val = data[0]
#print (data_val)
#signature = data[1]
#print (signature)
#transaction_hash = SHA256.new(data)
#transaction
#print (pkcs1_15.new(public_key).verify(transaction_hash, signature))
return(data.decode("utf-8"))
def test_fn(im1,im2):
return im1,im2,im1
def test_fn2(im1):
return im1