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