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