Stego / app.py
YassineYousfi
fix
79a2092
import stc
import cv2
import random
import numpy as np
import gradio as gr
from PIL import Image
from scipy import signal
title = "Steganography"
description = '''Explore hiding messages in images using content adaptive steganography and STCs (Syndrome Trellis Codes).
http://dde.binghamton.edu/download/syndrome/ .
We use HILL https://ieeexplore.ieee.org/document/7025854 .
Python implementation adapted from Daniel Lerch's https://github.com/daniellerch/pySTC .
To encode:
Drag and drop a PNG file, write a message and enter a key (remember the key), the generated image has the secret message encoded.
To decode:
Drag and drop the stego file that you just generated, enter the key.
Note that this software is supplied "as is," without any services or security guaranties.
'''
def HILL(input_image, operation, message, key):
tmp_name = str(random.randint(100,500))
try:
buffer = input_image
I = cv2.imdecode(np.frombuffer(buffer, np.uint8), 1)
I = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY)
cv2.imwrite('tmp/'+tmp_name+'.png',I)
except Exception as e:
print(e)
raise ValueError('Unable to read image')
if operation == 'decode':
try:
stc.extract('tmp/'+tmp_name+'.png', key, 'tmp/'+tmp_name+'.txt')
return 'tmp/'+tmp_name+'.txt'
except:
raise ValueError('Unable to decode')
else:
H = np.array(
[[-1, 2, -1],
[ 2, -4, 2],
[-1, 2, -1]])
L1 = np.ones((3, 3)).astype('float32')/(3**2)
L2 = np.ones((15, 15)).astype('float32')/(15**2)
costs = signal.convolve2d(I, H, mode='same', boundary='symm')
costs = abs(costs)
costs = signal.convolve2d(costs, L1, mode='same', boundary='symm')
costs = 1/costs
costs = signal.convolve2d(costs, L2, mode='same', boundary='symm')
costs[costs == np.inf] = 1
stc.embed('tmp/'+tmp_name+'.png', costs, message, key, 'tmp/'+tmp_name+'.png')
return 'tmp/'+tmp_name+'.png'
iface = gr.Interface(fn=HILL,
inputs=[gr.components.File(type='binary'), gr.components.Radio(['encode', 'decode']), gr.components.Textbox(), gr.components.Textbox()],
outputs=gr.components.File(),
examples=[['tmp/8825.png', 'encode', 'This is a secret message', 'secret-key'],
['tmp/9390.png', 'encode', 'This is another secret message', 'secret-key-2']],
title=title,
description=description)
iface.launch()