Stego / app.py
YassineYousfi
add another ex
d7fff3a
raw history blame
No virus
2.55 kB
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))
input_image.seek(0)
buffer = input_image.read()
I = cv2.imdecode(np.frombuffer(buffer, np.uint8), 1)
I = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY)
cv2.imwrite('tmp/'+tmp_name+'.png',I)
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(HILL,
['file', gr.inputs.Radio(['encode', 'decode']), 'text', 'text'],
'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()