has12zen commited on
Commit ·
d29aad7
1
Parent(s): 978b0ce
Add application file
Browse files- __pycache__/utils.cpython-39.pyc +0 -0
- app.py +25 -0
- requirements.txt +1 -0
- utils.py +115 -0
__pycache__/utils.cpython-39.pyc
ADDED
|
Binary file (2.26 kB). View file
|
|
|
app.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from utils import *
|
| 3 |
+
|
| 4 |
+
with gr.Blocks() as demo:
|
| 5 |
+
gr.Markdown("# Encrypt the secret message into image.")
|
| 6 |
+
with gr.Tab("Encrypt"):
|
| 7 |
+
with gr.Row():
|
| 8 |
+
with gr.Column():
|
| 9 |
+
encrypt_msg = gr.Textbox(lines=1, label="Encrypt Message")
|
| 10 |
+
encrypt_key = gr.Textbox(lines=1, label="Encrypt Key")
|
| 11 |
+
encrypt_image = gr.Image()
|
| 12 |
+
encrypt_output = gr.Image()
|
| 13 |
+
encrypt_button = gr.Button("Encrypt")
|
| 14 |
+
with gr.Tab("Decrypt"):
|
| 15 |
+
with gr.Row():
|
| 16 |
+
with gr.Column():
|
| 17 |
+
decrypt_key = gr.Textbox(lines=1, label="Decrypt Key")
|
| 18 |
+
decrypt_image = gr.Image()
|
| 19 |
+
decrypt_output = gr.Textbox(lines=1, label="Decrypt Message")
|
| 20 |
+
decrypt_button = gr.Button("Decrypt")
|
| 21 |
+
|
| 22 |
+
encrypt_button.click(encrypt, inputs=[encrypt_msg, encrypt_key, encrypt_image], outputs=[encrypt_output])
|
| 23 |
+
decrypt_button.click(decrypt, inputs=[decrypt_key, decrypt_image], outputs=[decrypt_output])
|
| 24 |
+
|
| 25 |
+
demo.launch();
|
requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pillow
|
utils.py
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from PIL import Image
|
| 2 |
+
|
| 3 |
+
def encrypt(text, secret_key, img):
|
| 4 |
+
image = Image.fromarray(img)
|
| 5 |
+
pixels = list(image.getdata())
|
| 6 |
+
binary_text = ''
|
| 7 |
+
for char in text:
|
| 8 |
+
binary_text+=format(ord(char), '08b')
|
| 9 |
+
binary_secret = ''
|
| 10 |
+
for char in secret_key:
|
| 11 |
+
binary_secret+=format(ord(char), '08b')
|
| 12 |
+
# print(binary_text)
|
| 13 |
+
binary_text = binary_demorf(binary_text, binary_secret)
|
| 14 |
+
binary_text = binary_text + binary_secret
|
| 15 |
+
# print(binary_text)
|
| 16 |
+
i = 0
|
| 17 |
+
print("number of bits we can store (binary_text + binary_secret): ",3*len(pixels))
|
| 18 |
+
new_pixels = []
|
| 19 |
+
for rgb in pixels:
|
| 20 |
+
tcr = []
|
| 21 |
+
for clr in rgb:
|
| 22 |
+
if i < len(binary_text):
|
| 23 |
+
if binary_text[i] == '0':
|
| 24 |
+
if clr % 2 != 0:
|
| 25 |
+
clr -= 1
|
| 26 |
+
else:
|
| 27 |
+
if clr % 2 == 0:
|
| 28 |
+
clr += 1
|
| 29 |
+
i += 1
|
| 30 |
+
tcr += [clr]
|
| 31 |
+
new_pixels += [tuple(tcr)]
|
| 32 |
+
new_image = Image.new(image.mode, image.size)
|
| 33 |
+
new_image.putdata(new_pixels)
|
| 34 |
+
return new_image
|
| 35 |
+
|
| 36 |
+
def decrypt(secret_key, img):
|
| 37 |
+
image = Image.fromarray(img)
|
| 38 |
+
pixels = list(image.getdata())
|
| 39 |
+
binary_secret = ""
|
| 40 |
+
for(char) in secret_key:
|
| 41 |
+
binary_secret += format(ord(char), '08b')
|
| 42 |
+
binary_text = ""
|
| 43 |
+
for rgb in pixels:
|
| 44 |
+
for(clr) in rgb:
|
| 45 |
+
if clr % 2 == 0:
|
| 46 |
+
binary_text += '0'
|
| 47 |
+
else:
|
| 48 |
+
binary_text += '1'
|
| 49 |
+
|
| 50 |
+
# print(binary_secret)
|
| 51 |
+
text_pos = binary_text.split(binary_secret)
|
| 52 |
+
if len(text_pos) == 1:
|
| 53 |
+
return "No text found"
|
| 54 |
+
else :
|
| 55 |
+
bt = text_pos[0];
|
| 56 |
+
# print(bt)
|
| 57 |
+
bt = binary_morf(bt, binary_secret)
|
| 58 |
+
# print(bt)
|
| 59 |
+
text = ""
|
| 60 |
+
for i in range(0, len(bt), 8):
|
| 61 |
+
text += chr(int(bt[i:i+8], 2))
|
| 62 |
+
return text
|
| 63 |
+
|
| 64 |
+
def binary_demorf(binary_text,binary_secret):
|
| 65 |
+
if len(binary_text) < len(binary_secret):
|
| 66 |
+
return binary_text
|
| 67 |
+
text = ""
|
| 68 |
+
cidx =0
|
| 69 |
+
idx = 0
|
| 70 |
+
while idx < len(binary_text):
|
| 71 |
+
ch = binary_text[idx]
|
| 72 |
+
if cidx < len(binary_secret):
|
| 73 |
+
if binary_secret[cidx] == ch:
|
| 74 |
+
if cidx == len(binary_secret)-1:
|
| 75 |
+
cidx = 0
|
| 76 |
+
if ch == '0':
|
| 77 |
+
text += '1'
|
| 78 |
+
else:
|
| 79 |
+
text += '0'
|
| 80 |
+
else:
|
| 81 |
+
text += ch
|
| 82 |
+
cidx += 1
|
| 83 |
+
idx += 1
|
| 84 |
+
else:
|
| 85 |
+
if(binary_secret[0]==ch):
|
| 86 |
+
cidx=1
|
| 87 |
+
else:
|
| 88 |
+
cidx=0
|
| 89 |
+
text += ch
|
| 90 |
+
idx+=1
|
| 91 |
+
else:
|
| 92 |
+
text += ch
|
| 93 |
+
idx+=1
|
| 94 |
+
return text
|
| 95 |
+
|
| 96 |
+
def binary_morf(binary_text,binary_secret):
|
| 97 |
+
if len(binary_text) < len(binary_secret):
|
| 98 |
+
return binary_text
|
| 99 |
+
t = binary_secret[:-1] # secret without the last digit
|
| 100 |
+
l = binary_text.split(t) # split text with that
|
| 101 |
+
# print(l)
|
| 102 |
+
result = ''
|
| 103 |
+
i = 0;
|
| 104 |
+
while i < len(l):
|
| 105 |
+
cr = ""
|
| 106 |
+
if(i!=0):
|
| 107 |
+
cr = l[i][1:]
|
| 108 |
+
else:
|
| 109 |
+
cr = l[i]
|
| 110 |
+
if i != len(l)-1:
|
| 111 |
+
result += cr + binary_secret;
|
| 112 |
+
else:
|
| 113 |
+
result += cr
|
| 114 |
+
i+=1
|
| 115 |
+
return result
|