diff --git a/common.py b/common.py
index e453dca..ab47270 100644
--- a/common.py
+++ b/common.py
@@ -64,7 +64,8 @@ def bits2bytes(arry_bits):
"""
str_bits = ''.join(map(str, arry_bits))
arry_bytes = [int(str_bits[i:i + 8], 2) for i in range(0, len(str_bits), 8)]
- return np.array(arry_bytes).ravel()
+ return np.array(arry_bytes,dtype=np.uint8).ravel()
+
if __name__ == '__main__':
diff --git a/common.pyc b/common.pyc
index 1daff47..27f6487 100644
Binary files a/common.pyc and b/common.pyc differ
diff --git a/msteg/StegBase.py b/msteg/StegBase.py
index 8a914d9..b920464 100644
--- a/msteg/StegBase.py
+++ b/msteg/StegBase.py
@@ -55,7 +55,7 @@ class StegBase(object):
for i in xrange(4):
raw[i] = raw_size % 256
raw_size /= 256
- self.hid_data = np.array(raw)
+ self.hid_data = np.array(raw, dtype=np.uint8)
if np.size(self.hid_data) * 8 > np.size(self.cov_data):
raise Exception("Cover image is too small to embed data.Cannot fit %d bits in %d DCT coefficients" % (
@@ -71,22 +71,28 @@ class StegBase(object):
try:
cov_data = self._get_cov_data(src_cover)
hid_data = self._get_hid_data(src_hidden)
- cov_data = self._raw_embed(cov_data, hid_data)
+ # print hid_data.dtype,type(hid_data),hid_data.tolist()
+ cov_data, bits_cnt = self._raw_embed(cov_data, hid_data)
+
+ if bits_cnt != np.size(hid_data) * 8:
+ raise Exception("Expected embedded size is %db but actually %db." % (
+ np.size(hid_data) * 8, bits_cnt))
self.cov_jpeg.setCoefBlocks(cov_data)
self.cov_jpeg.Jwrite(tgt_stego)
- size = os.path.getsize(tgt_stego)
+ # size_cov = os.path.getsize(tgt_stego)
+ size_cov = np.size(cov_data) / 8
size_embedded = np.size(hid_data)
- self._display_stats("embedded", size, size_embedded,
+ self._display_stats("embedded", size_cov, size_embedded,
time.time() - self.t0)
except TypeError as e:
raise e
- except Exception:
- raise Exception(
- 'DCT coefficients exhausted. This usually means there are not enough DCT coefficients in the image in which algorithm can actually embed data. You should choose a larger image.')
+ except Exception as expt:
+ print "Exception when embedding!"
+ raise
def _post_extract_actions(self, src_steg, tgt_hidden):
"""
@@ -95,11 +101,13 @@ class StegBase(object):
"""
try:
steg_data = self._get_cov_data(src_steg)
- emb_size = os.path.getsize(src_steg)
+ # emb_size = os.path.getsize(src_steg)
+ emb_size = np.size(steg_data) / 8
+
# recovering file size
header_size = 4 * 8
- size_data = self._raw_extract(steg_data, header_size)
+ size_data, bits_cnt = self._raw_extract(steg_data, header_size)
size_data = bits2bytes(size_data)
size_hd = 0
for i in xrange(4):
@@ -110,15 +118,22 @@ class StegBase(object):
if raw_size > np.size(steg_data):
raise Exception("Supposed secret data too large for stego image.")
- hid_data = self._raw_extract(steg_data, raw_size)
+ hid_data, bits_cnt = self._raw_extract(steg_data, raw_size)
+
+ if bits_cnt != raw_size:
+ raise Exception("Expected embedded size is %db but actually %db." % (
+ raw_size, bits_cnt))
+
hid_data = bits2bytes(hid_data)
+ # print hid_data.dtype,type(hid_data),hid_data.tolist()
hid_data[4:].tofile(tgt_hidden)
self._display_stats("extracted", emb_size,
np.size(hid_data),
time.time() - self.t0)
- except:
- raise Exception('DCT coefficients exhausted.The stego image is probably corrupted.')
+ except Exception as expt:
+ print "Exception when extracting!"
+ raise
def _looks_like_jpeg(self, path):
diff --git a/msteg/StegBase.pyc b/msteg/StegBase.pyc
new file mode 100644
index 0000000..2de9c1f
Binary files /dev/null and b/msteg/StegBase.pyc differ
diff --git a/msteg/steganalysis/ChiSquare.py b/msteg/steganalysis/ChiSquare.py
index 281503a..5bf976c 100644
--- a/msteg/steganalysis/ChiSquare.py
+++ b/msteg/steganalysis/ChiSquare.py
@@ -16,11 +16,12 @@ Better Steganalysis
from collections import defaultdict
import os
-import Image
+from PIL import Image
import numpy
from scipy.stats import chisquare
import matplotlib.pyplot as plt
import itertools as it
+from msteg.StegBase import StegBase
from stegotool.util.plugins import describe_and_annotate
from stegotool.util.plugins import ImagePath, NewFilePath
diff --git a/msteg/steganography/F3.py b/msteg/steganography/F3.py
index 8bdd894..d42c541 100644
--- a/msteg/steganography/F3.py
+++ b/msteg/steganography/F3.py
@@ -12,7 +12,7 @@ is embedded repeatedly in order to make non-ambiguous extraction possible.
import time
import math
import numpy as np
-from StegBase import *
+from msteg.StegBase import StegBase
from common import *
@@ -74,7 +74,7 @@ class F3(StegBase):
i += 1
if i == hid_data.size: break
- return cov_data
+ return cov_data,i
def _raw_extract(self, steg_data, num_bits):
"""
@@ -90,7 +90,7 @@ class F3(StegBase):
hid_data[j] = x & 1
j = j + 1
- return hid_data
+ return hid_data,j
def __str__(self):
return 'F3'
diff --git a/msteg/steganography/F3.pyc b/msteg/steganography/F3.pyc
index 8d7743a..07241ed 100644
Binary files a/msteg/steganography/F3.pyc and b/msteg/steganography/F3.pyc differ
diff --git a/msteg/steganography/F4.py b/msteg/steganography/F4.py
index 103fe7c..3fb0483 100644
--- a/msteg/steganography/F4.py
+++ b/msteg/steganography/F4.py
@@ -9,11 +9,11 @@ which is not included in the original description of F4.
"""
import time
import numpy as np
-from StegBase import *
+from msteg.StegBase import StegBase
from common import *
-class F3(StegBase):
+class F4(StegBase):
""" This module has two methods: embed_raw_data to embed data
with the F3 algorithm and extract_raw_data to extract data
which was embedded previously. """
diff --git a/msteg/steganography/F4.pyc b/msteg/steganography/F4.pyc
new file mode 100644
index 0000000..a4586e4
Binary files /dev/null and b/msteg/steganography/F4.pyc differ
diff --git a/msteg/steganography/F5.pyc b/msteg/steganography/F5.pyc
new file mode 100644
index 0000000..0be458d
Binary files /dev/null and b/msteg/steganography/F5.pyc differ
diff --git a/msteg/steganography/LSB.py b/msteg/steganography/LSB.py
index e52b974..4bb097b 100644
--- a/msteg/steganography/LSB.py
+++ b/msteg/steganography/LSB.py
@@ -10,7 +10,7 @@ bits a parameter named word_size. Thus --- in this context --- word means
import time
import numpy as np
import scipy as sp
-from StegBase import *
+from msteg.StegBase import StegBase
from common import *
@@ -66,7 +66,7 @@ class LSB(StegBase):
if x == 0 or x == 1 or cnt % 64 == 0: continue
m = (hid_data[i] & 1)
- x[...] = (x & 0xfffffffe) | m
+ x[...] = (x & 0xfffffffe) | m # '0xfffe' is enough, for elements are expected to be short integers.
i += 1
if i == hid_data.size: break
diff --git a/msteg/steganography/LSB.pyc b/msteg/steganography/LSB.pyc
new file mode 100644
index 0000000..0c06f26
Binary files /dev/null and b/msteg/steganography/LSB.pyc differ
diff --git a/msteg/steganography/StegBase.pyc b/msteg/steganography/StegBase.pyc
deleted file mode 100644
index 0f4af81..0000000
Binary files a/msteg/steganography/StegBase.pyc and /dev/null differ
diff --git a/test_jpeg.py b/test_jpeg.py
index 57cb6c6..9996435 100644
--- a/test_jpeg.py
+++ b/test_jpeg.py
@@ -186,7 +186,7 @@ if __name__ == '__main__':
ima = jpegObj.Jpeg("res/test3.jpg")
imb = jpegObj.Jpeg("res/steged.jpg")
-
+ print ima.Jgetcompdim(0)
diffblocks(ima, imb)
c1 = ima.getCoefBlocks()
diff --git a/test_steg.py b/test_steg.py
index ebe583c..d7eb5bb 100644
--- a/test_steg.py
+++ b/test_steg.py
@@ -7,7 +7,7 @@ import pylab as plt
import mjpeg
import mjsteg
import jpegObj
-from msteg.steganography import F3
+from msteg.steganography import F3, F4, LSB
from common import *
--
libgit2 0.21.2