File size: 2,551 Bytes
6aea31a 3fb4dd7 6aea31a 3fb4dd7 06242ba aeb01c6 600de08 3fb4dd7 600de08 3fb4dd7 600de08 aeb01c6 6aea31a 2238157 6aea31a 3fb4dd7 6aea31a f731703 6aea31a 600de08 6aea31a 600de08 6aea31a 600de08 6aea31a 3fb4dd7 6aea31a aeb01c6 9649f08 d7fff3a aeb01c6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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() |