|
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() |