from Crypto.PublicKey import RSA from Crypto.Cipher import AES, PKCS1_OAEP import cv2 import numpy as np def to_bin(data): if isinstance(data, str): return ''.join([ format(ord(i), "08b") for i in data ]) elif isinstance(data, bytes): return ''.join([ format(i, "08b") for i in data ]) elif isinstance(data, np.ndarray): return [ format(i, "08b") for i in data ] elif isinstance(data, int) or isinstance(data, np.uint8): return format(data, "08b") else: raise TypeError("Type not supported.") def decode(image_name,txt=None): BGRimage = cv2.imread(image_name) image = cv2.cvtColor(BGRimage, cv2.COLOR_BGR2RGB) binary_data = "" for row in image: for pixel in row: r, g, b = to_bin(pixel) binary_data += r[-1] binary_data += g[-1] binary_data += b[-1] all_bytes = [ binary_data[i: i+8] for i in range(0, len(binary_data), 8) ] decoded_data = "" for byte in all_bytes: decoded_data += chr(int(byte, 2)) if decoded_data[-5:] == "=====": break this = decoded_data[:-5].split("#####",1)[0] this = eval(this) return this def decrypt_text(im,in2,seed=None): enc_in = decode(im) if seed != None and seed != "": secret_code=seed else: secret_code = " " priv_key = decode(in2) private_key = RSA.import_key(priv_key,passphrase=secret_code) 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:] cipher_rsa = PKCS1_OAEP.new(private_key) session_key = cipher_rsa.decrypt(enc_session_key) cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce) data = cipher_aes.decrypt_and_verify(ciphertext, tag) return(data.decode("utf-8"))