Stego / app.py
YassineYousfi
less names
2238157
raw
history blame
2.35 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':
stc.extract('tmp/'+tmp_name+'.png', key, 'tmp/'+tmp_name+'.txt')
return 'tmp/'+tmp_name+'.txt'
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']],
title=title,
description=description)
iface.launch()