pixel-chat-decode / de_crypt.py
Omnibus's picture
Update de_crypt.py
5c1c2cf
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"))