File size: 2,075 Bytes
06242ba
6aea31a
 
 
 
 
 
06242ba
 
aeb01c6
600de08
 
 
 
 
 
 
 
 
 
aeb01c6
6aea31a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
600de08
6aea31a
600de08
6aea31a
600de08
6aea31a
 
 
 
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
import gradio as gr
import stc
import numpy as np
import imageio
from scipy import signal
import cv2 
from PIL import Image


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).
               To decode:
               Drap and drop the stego file, enter the key.
               Note that this software is supplied "as is," without any services or guaranties.
               '''

def HILL(input_image, operation, message, key):
    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/file.png',I)

    if operation == 'decode': 
        stc.extract('tmp/file.png', key, 'tmp/output.txt')
        return 'tmp/output.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/file.png', costs, message, key, 'tmp/stego.png')
        return 'tmp/stego.png'

iface = gr.Interface(HILL, 
                    ["file", gr.inputs.Radio(["encode", "decode"]), "text", "text"], 
                    "file", 
                    title=title,
                    description=description)
iface.launch()