Commit 45a82355190e35bda63d33c396ec0223d4215363
1 parent
eb820443
Exists in
master
staged.
Showing
15 changed files
with
40 additions
and
23 deletions
Show diff stats
common.py
| @@ -64,7 +64,8 @@ def bits2bytes(arry_bits): | @@ -64,7 +64,8 @@ def bits2bytes(arry_bits): | ||
| 64 | """ | 64 | """ |
| 65 | str_bits = ''.join(map(str, arry_bits)) | 65 | str_bits = ''.join(map(str, arry_bits)) |
| 66 | arry_bytes = [int(str_bits[i:i + 8], 2) for i in range(0, len(str_bits), 8)] | 66 | arry_bytes = [int(str_bits[i:i + 8], 2) for i in range(0, len(str_bits), 8)] |
| 67 | - return np.array(arry_bytes).ravel() | 67 | + return np.array(arry_bytes,dtype=np.uint8).ravel() |
| 68 | + | ||
| 68 | 69 | ||
| 69 | 70 | ||
| 70 | if __name__ == '__main__': | 71 | if __name__ == '__main__': |
common.pyc
No preview for this file type
msteg/StegBase.py
| @@ -55,7 +55,7 @@ class StegBase(object): | @@ -55,7 +55,7 @@ class StegBase(object): | ||
| 55 | for i in xrange(4): | 55 | for i in xrange(4): |
| 56 | raw[i] = raw_size % 256 | 56 | raw[i] = raw_size % 256 |
| 57 | raw_size /= 256 | 57 | raw_size /= 256 |
| 58 | - self.hid_data = np.array(raw) | 58 | + self.hid_data = np.array(raw, dtype=np.uint8) |
| 59 | 59 | ||
| 60 | if np.size(self.hid_data) * 8 > np.size(self.cov_data): | 60 | if np.size(self.hid_data) * 8 > np.size(self.cov_data): |
| 61 | raise Exception("Cover image is too small to embed data.Cannot fit %d bits in %d DCT coefficients" % ( | 61 | 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): | @@ -71,22 +71,28 @@ class StegBase(object): | ||
| 71 | try: | 71 | try: |
| 72 | cov_data = self._get_cov_data(src_cover) | 72 | cov_data = self._get_cov_data(src_cover) |
| 73 | hid_data = self._get_hid_data(src_hidden) | 73 | hid_data = self._get_hid_data(src_hidden) |
| 74 | - cov_data = self._raw_embed(cov_data, hid_data) | 74 | + # print hid_data.dtype,type(hid_data),hid_data.tolist() |
| 75 | + cov_data, bits_cnt = self._raw_embed(cov_data, hid_data) | ||
| 76 | + | ||
| 77 | + if bits_cnt != np.size(hid_data) * 8: | ||
| 78 | + raise Exception("Expected embedded size is %db but actually %db." % ( | ||
| 79 | + np.size(hid_data) * 8, bits_cnt)) | ||
| 75 | 80 | ||
| 76 | self.cov_jpeg.setCoefBlocks(cov_data) | 81 | self.cov_jpeg.setCoefBlocks(cov_data) |
| 77 | self.cov_jpeg.Jwrite(tgt_stego) | 82 | self.cov_jpeg.Jwrite(tgt_stego) |
| 78 | 83 | ||
| 79 | - size = os.path.getsize(tgt_stego) | 84 | + # size_cov = os.path.getsize(tgt_stego) |
| 85 | + size_cov = np.size(cov_data) / 8 | ||
| 80 | size_embedded = np.size(hid_data) | 86 | size_embedded = np.size(hid_data) |
| 81 | 87 | ||
| 82 | - self._display_stats("embedded", size, size_embedded, | 88 | + self._display_stats("embedded", size_cov, size_embedded, |
| 83 | time.time() - self.t0) | 89 | time.time() - self.t0) |
| 84 | 90 | ||
| 85 | except TypeError as e: | 91 | except TypeError as e: |
| 86 | raise e | 92 | raise e |
| 87 | - except Exception: | ||
| 88 | - raise Exception( | ||
| 89 | - '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.') | 93 | + except Exception as expt: |
| 94 | + print "Exception when embedding!" | ||
| 95 | + raise | ||
| 90 | 96 | ||
| 91 | def _post_extract_actions(self, src_steg, tgt_hidden): | 97 | def _post_extract_actions(self, src_steg, tgt_hidden): |
| 92 | """ | 98 | """ |
| @@ -95,11 +101,13 @@ class StegBase(object): | @@ -95,11 +101,13 @@ class StegBase(object): | ||
| 95 | """ | 101 | """ |
| 96 | try: | 102 | try: |
| 97 | steg_data = self._get_cov_data(src_steg) | 103 | steg_data = self._get_cov_data(src_steg) |
| 98 | - emb_size = os.path.getsize(src_steg) | 104 | + # emb_size = os.path.getsize(src_steg) |
| 105 | + emb_size = np.size(steg_data) / 8 | ||
| 106 | + | ||
| 99 | 107 | ||
| 100 | # recovering file size | 108 | # recovering file size |
| 101 | header_size = 4 * 8 | 109 | header_size = 4 * 8 |
| 102 | - size_data = self._raw_extract(steg_data, header_size) | 110 | + size_data, bits_cnt = self._raw_extract(steg_data, header_size) |
| 103 | size_data = bits2bytes(size_data) | 111 | size_data = bits2bytes(size_data) |
| 104 | size_hd = 0 | 112 | size_hd = 0 |
| 105 | for i in xrange(4): | 113 | for i in xrange(4): |
| @@ -110,15 +118,22 @@ class StegBase(object): | @@ -110,15 +118,22 @@ class StegBase(object): | ||
| 110 | if raw_size > np.size(steg_data): | 118 | if raw_size > np.size(steg_data): |
| 111 | raise Exception("Supposed secret data too large for stego image.") | 119 | raise Exception("Supposed secret data too large for stego image.") |
| 112 | 120 | ||
| 113 | - hid_data = self._raw_extract(steg_data, raw_size) | 121 | + hid_data, bits_cnt = self._raw_extract(steg_data, raw_size) |
| 122 | + | ||
| 123 | + if bits_cnt != raw_size: | ||
| 124 | + raise Exception("Expected embedded size is %db but actually %db." % ( | ||
| 125 | + raw_size, bits_cnt)) | ||
| 126 | + | ||
| 114 | hid_data = bits2bytes(hid_data) | 127 | hid_data = bits2bytes(hid_data) |
| 128 | + # print hid_data.dtype,type(hid_data),hid_data.tolist() | ||
| 115 | hid_data[4:].tofile(tgt_hidden) | 129 | hid_data[4:].tofile(tgt_hidden) |
| 116 | 130 | ||
| 117 | self._display_stats("extracted", emb_size, | 131 | self._display_stats("extracted", emb_size, |
| 118 | np.size(hid_data), | 132 | np.size(hid_data), |
| 119 | time.time() - self.t0) | 133 | time.time() - self.t0) |
| 120 | - except: | ||
| 121 | - raise Exception('DCT coefficients exhausted.The stego image is probably corrupted.') | 134 | + except Exception as expt: |
| 135 | + print "Exception when extracting!" | ||
| 136 | + raise | ||
| 122 | 137 | ||
| 123 | 138 | ||
| 124 | def _looks_like_jpeg(self, path): | 139 | def _looks_like_jpeg(self, path): |
No preview for this file type
msteg/steganalysis/ChiSquare.py
| @@ -16,11 +16,12 @@ Better Steganalysis | @@ -16,11 +16,12 @@ Better Steganalysis | ||
| 16 | from collections import defaultdict | 16 | from collections import defaultdict |
| 17 | import os | 17 | import os |
| 18 | 18 | ||
| 19 | -import Image | 19 | +from PIL import Image |
| 20 | import numpy | 20 | import numpy |
| 21 | from scipy.stats import chisquare | 21 | from scipy.stats import chisquare |
| 22 | import matplotlib.pyplot as plt | 22 | import matplotlib.pyplot as plt |
| 23 | import itertools as it | 23 | import itertools as it |
| 24 | +from msteg.StegBase import StegBase | ||
| 24 | 25 | ||
| 25 | from stegotool.util.plugins import describe_and_annotate | 26 | from stegotool.util.plugins import describe_and_annotate |
| 26 | from stegotool.util.plugins import ImagePath, NewFilePath | 27 | from stegotool.util.plugins import ImagePath, NewFilePath |
msteg/steganography/F3.py
| @@ -12,7 +12,7 @@ is embedded repeatedly in order to make non-ambiguous extraction possible. | @@ -12,7 +12,7 @@ is embedded repeatedly in order to make non-ambiguous extraction possible. | ||
| 12 | import time | 12 | import time |
| 13 | import math | 13 | import math |
| 14 | import numpy as np | 14 | import numpy as np |
| 15 | -from StegBase import * | 15 | +from msteg.StegBase import StegBase |
| 16 | from common import * | 16 | from common import * |
| 17 | 17 | ||
| 18 | 18 | ||
| @@ -74,7 +74,7 @@ class F3(StegBase): | @@ -74,7 +74,7 @@ class F3(StegBase): | ||
| 74 | i += 1 | 74 | i += 1 |
| 75 | if i == hid_data.size: break | 75 | if i == hid_data.size: break |
| 76 | 76 | ||
| 77 | - return cov_data | 77 | + return cov_data,i |
| 78 | 78 | ||
| 79 | def _raw_extract(self, steg_data, num_bits): | 79 | def _raw_extract(self, steg_data, num_bits): |
| 80 | """ | 80 | """ |
| @@ -90,7 +90,7 @@ class F3(StegBase): | @@ -90,7 +90,7 @@ class F3(StegBase): | ||
| 90 | hid_data[j] = x & 1 | 90 | hid_data[j] = x & 1 |
| 91 | j = j + 1 | 91 | j = j + 1 |
| 92 | 92 | ||
| 93 | - return hid_data | 93 | + return hid_data,j |
| 94 | 94 | ||
| 95 | def __str__(self): | 95 | def __str__(self): |
| 96 | return 'F3' | 96 | return 'F3' |
msteg/steganography/F3.pyc
No preview for this file type
msteg/steganography/F4.py
| @@ -9,11 +9,11 @@ which is not included in the original description of F4. | @@ -9,11 +9,11 @@ which is not included in the original description of F4. | ||
| 9 | """ | 9 | """ |
| 10 | import time | 10 | import time |
| 11 | import numpy as np | 11 | import numpy as np |
| 12 | -from StegBase import * | 12 | +from msteg.StegBase import StegBase |
| 13 | from common import * | 13 | from common import * |
| 14 | 14 | ||
| 15 | 15 | ||
| 16 | -class F3(StegBase): | 16 | +class F4(StegBase): |
| 17 | """ This module has two methods: <i>embed_raw_data</i> to embed data | 17 | """ This module has two methods: <i>embed_raw_data</i> to embed data |
| 18 | with the F3 algorithm and <i>extract_raw_data</i> to extract data | 18 | with the F3 algorithm and <i>extract_raw_data</i> to extract data |
| 19 | which was embedded previously. """ | 19 | which was embedded previously. """ |
No preview for this file type
No preview for this file type
msteg/steganography/LSB.py
| @@ -10,7 +10,7 @@ bits a parameter named word_size. Thus --- in this context --- word means | @@ -10,7 +10,7 @@ bits a parameter named word_size. Thus --- in this context --- word means | ||
| 10 | import time | 10 | import time |
| 11 | import numpy as np | 11 | import numpy as np |
| 12 | import scipy as sp | 12 | import scipy as sp |
| 13 | -from StegBase import * | 13 | +from msteg.StegBase import StegBase |
| 14 | from common import * | 14 | from common import * |
| 15 | 15 | ||
| 16 | 16 | ||
| @@ -66,7 +66,7 @@ class LSB(StegBase): | @@ -66,7 +66,7 @@ class LSB(StegBase): | ||
| 66 | if x == 0 or x == 1 or cnt % 64 == 0: continue | 66 | if x == 0 or x == 1 or cnt % 64 == 0: continue |
| 67 | 67 | ||
| 68 | m = (hid_data[i] & 1) | 68 | m = (hid_data[i] & 1) |
| 69 | - x[...] = (x & 0xfffffffe) | m | 69 | + x[...] = (x & 0xfffffffe) | m # '0xfffe' is enough, for elements are expected to be short integers. |
| 70 | i += 1 | 70 | i += 1 |
| 71 | if i == hid_data.size: break | 71 | if i == hid_data.size: break |
| 72 | 72 |
No preview for this file type
msteg/steganography/StegBase.pyc
No preview for this file type
test_jpeg.py
| @@ -186,7 +186,7 @@ if __name__ == '__main__': | @@ -186,7 +186,7 @@ if __name__ == '__main__': | ||
| 186 | 186 | ||
| 187 | ima = jpegObj.Jpeg("res/test3.jpg") | 187 | ima = jpegObj.Jpeg("res/test3.jpg") |
| 188 | imb = jpegObj.Jpeg("res/steged.jpg") | 188 | imb = jpegObj.Jpeg("res/steged.jpg") |
| 189 | - | 189 | + print ima.Jgetcompdim(0) |
| 190 | diffblocks(ima, imb) | 190 | diffblocks(ima, imb) |
| 191 | 191 | ||
| 192 | c1 = ima.getCoefBlocks() | 192 | c1 = ima.getCoefBlocks() |
test_steg.py
| @@ -7,7 +7,7 @@ import pylab as plt | @@ -7,7 +7,7 @@ import pylab as plt | ||
| 7 | import mjpeg | 7 | import mjpeg |
| 8 | import mjsteg | 8 | import mjsteg |
| 9 | import jpegObj | 9 | import jpegObj |
| 10 | -from msteg.steganography import F3 | 10 | +from msteg.steganography import F3, F4, LSB |
| 11 | from common import * | 11 | from common import * |
| 12 | 12 | ||
| 13 | 13 |