Commit 6cbb3879dd61c0533550959f17558fdd998e4a79
1 parent
45a82355
Exists in
master
F4 updated.
Showing
13 changed files
with
178 additions
and
98 deletions
Show diff stats
jpegObj/__init__.py
@@ -30,6 +30,8 @@ colorCode = { | @@ -30,6 +30,8 @@ colorCode = { | ||
30 | "YCCK": 5 | 30 | "YCCK": 5 |
31 | } | 31 | } |
32 | 32 | ||
33 | +colorParam = ['Y', 'Cb', 'Cr'] | ||
34 | + | ||
33 | # The JPEG class | 35 | # The JPEG class |
34 | # ============== | 36 | # ============== |
35 | 37 | ||
@@ -69,28 +71,35 @@ class Jpeg(Jsteg): | @@ -69,28 +71,35 @@ class Jpeg(Jsteg): | ||
69 | # 1D Signal Representations | 71 | # 1D Signal Representations |
70 | # ------------------------- | 72 | # ------------------------- |
71 | 73 | ||
72 | - def rawsignal(self, mask=base.acMaskBlock): | 74 | + def rawsignal(self, mask=base.acMaskBlock, channel="All"): |
73 | """ | 75 | """ |
74 | Return a 1D array of AC coefficients. | 76 | Return a 1D array of AC coefficients. |
75 | (Most applications should use getsignal() rather than rawsignal().) | 77 | (Most applications should use getsignal() rather than rawsignal().) |
76 | """ | 78 | """ |
77 | R = [] | 79 | R = [] |
78 | - for X in self.coef_arrays: | 80 | + if channel == "All": |
81 | + for X in self.coef_arrays: | ||
82 | + (h, w) = X.shape | ||
83 | + A = base.acMask(h, w, mask) | ||
84 | + R = np.hstack([R, X[A]]) | ||
85 | + else: | ||
86 | + cID = self.getCompID(channel) | ||
87 | + X = self.coef_arrays[cID] | ||
79 | (h, w) = X.shape | 88 | (h, w) = X.shape |
80 | A = base.acMask(h, w, mask) | 89 | A = base.acMask(h, w, mask) |
81 | R = np.hstack([R, X[A]]) | 90 | R = np.hstack([R, X[A]]) |
82 | return R | 91 | return R |
83 | 92 | ||
84 | - def getsignal(self, mask=base.acMaskBlock): | 93 | + def getsignal(self, mask=base.acMaskBlock, channel="All"): |
85 | """Return a 1D array of AC coefficients in random order.""" | 94 | """Return a 1D array of AC coefficients in random order.""" |
86 | - R = self.rawsignal(mask) | 95 | + R = self.rawsignal(mask, channel) |
87 | if self.key == None: | 96 | if self.key == None: |
88 | return R | 97 | return R |
89 | else: | 98 | else: |
90 | rnd.seed(self.key) | 99 | rnd.seed(self.key) |
91 | return R[rnd.permutation(len(R))] | 100 | return R[rnd.permutation(len(R))] |
92 | 101 | ||
93 | - def setsignal(self, R0, mask=base.acMaskBlock): | 102 | + def setsignal(self, R0, mask=base.acMaskBlock, channel="All"): |
94 | """Reinserts AC coefficients from getitem in the correct positions.""" | 103 | """Reinserts AC coefficients from getitem in the correct positions.""" |
95 | if self.key != None: | 104 | if self.key != None: |
96 | rnd.seed(self.key) | 105 | rnd.seed(self.key) |
@@ -100,13 +109,40 @@ class Jpeg(Jsteg): | @@ -100,13 +109,40 @@ class Jpeg(Jsteg): | ||
100 | R[P] = R0 | 109 | R[P] = R0 |
101 | else: | 110 | else: |
102 | R = R0 | 111 | R = R0 |
103 | - for X in self.coef_arrays: | 112 | + if channel == "All": |
113 | + for cID in range(3): | ||
114 | + X = self.coef_arrays[cID] | ||
115 | + s = X.size * 63 / 64 | ||
116 | + (h, w) = X.shape | ||
117 | + X[base.acMask(h, w, mask)] = R[fst:(fst + s)] | ||
118 | + fst += s | ||
119 | + | ||
120 | + # Jset | ||
121 | + blocks = self.getCoefBlocks(channel=colorParam[cID]) | ||
122 | + xmax, ymax = self.Jgetcompdim(cID) | ||
123 | + for y in range(ymax): | ||
124 | + for x in range(xmax): | ||
125 | + block = blocks[y, x] | ||
126 | + self.Jsetblock(x, y, cID, bytearray(block.astype(np.int16))) | ||
127 | + | ||
128 | + else: | ||
129 | + cID = self.getCompID(channel) | ||
130 | + X = self.coef_arrays[cID] | ||
104 | s = X.size * 63 / 64 | 131 | s = X.size * 63 / 64 |
105 | (h, w) = X.shape | 132 | (h, w) = X.shape |
106 | X[base.acMask(h, w, mask)] = R[fst:(fst + s)] | 133 | X[base.acMask(h, w, mask)] = R[fst:(fst + s)] |
107 | fst += s | 134 | fst += s |
135 | + | ||
136 | + # Jset | ||
137 | + blocks = self.getCoefBlocks(channel) | ||
138 | + xmax, ymax = self.Jgetcompdim(cID) | ||
139 | + for y in range(ymax): | ||
140 | + for x in range(xmax): | ||
141 | + block = blocks[y, x] | ||
142 | + self.Jsetblock(x, y, cID, bytearray(block.astype(np.int16))) | ||
143 | + | ||
108 | assert len(R) == fst | 144 | assert len(R) == fst |
109 | - return; | 145 | + |
110 | 146 | ||
111 | # Histogram and Image Statistics | 147 | # Histogram and Image Statistics |
112 | # ------------------------------ | 148 | # ------------------------------ |
@@ -247,12 +283,12 @@ class Jpeg(Jsteg): | @@ -247,12 +283,12 @@ class Jpeg(Jsteg): | ||
247 | assert blocks.shape[-2:] == (8, 8), "block is expected of size (8,8)" | 283 | assert blocks.shape[-2:] == (8, 8), "block is expected of size (8,8)" |
248 | cID = self.getCompID(channel) | 284 | cID = self.getCompID(channel) |
249 | 285 | ||
250 | - vmax,hmax = blocks.shape[:2] | 286 | + vmax, hmax = blocks.shape[:2] |
251 | for i in range(vmax): | 287 | for i in range(vmax): |
252 | for j in range(hmax): | 288 | for j in range(hmax): |
253 | v, h = i * 8, j * 8 | 289 | v, h = i * 8, j * 8 |
254 | - self.coef_arrays[cID][v:v + 8, h:h + 8] = blocks[i,j] | ||
255 | - self.Jsetblock(j, i, cID, bytearray(blocks[i,j].astype(np.int16))) | 290 | + self.coef_arrays[cID][v:v + 8, h:h + 8] = blocks[i, j] |
291 | + self.Jsetblock(j, i, cID, bytearray(blocks[i, j].astype(np.int16))) | ||
256 | 292 | ||
257 | # Decompression | 293 | # Decompression |
258 | # ------------- | 294 | # ------------- |
jpegObj/__init__.pyc
No preview for this file type
msteg/StegBase.py
1 | -""" | ||
2 | -This module implements a common base class of the steganographic | ||
3 | -algorithms which embed data into JPEG files. | ||
4 | -In order to run plugins inheriting from this class | ||
5 | -you must build the rw_dct.so library which interfaces with libjpeg. | ||
6 | -To do so, just run | ||
7 | -% python setup.py build | ||
8 | -in stegotool/util and copy the rw_dct.so | ||
9 | -library (which can be found somewhere in the build-directory to | ||
10 | -stegotool/util. | ||
11 | - | ||
12 | -""" | 1 | +__author__ = 'chunk' |
2 | + | ||
3 | + | ||
13 | import numpy as np | 4 | import numpy as np |
14 | import time | 5 | import time |
15 | import os | 6 | import os |
@@ -21,6 +12,7 @@ import mjsteg | @@ -21,6 +12,7 @@ import mjsteg | ||
21 | import jpegObj | 12 | import jpegObj |
22 | from common import * | 13 | from common import * |
23 | 14 | ||
15 | +sample_key = [46812L, 20559L, 31360L, 16681L, 27536L, 39553L, 5427L, 63029L, 56572L, 36476L, 25695L, 61908L, 63014L, 5908L, 59816L, 56765L] | ||
24 | 16 | ||
25 | class StegBase(object): | 17 | class StegBase(object): |
26 | """ | 18 | """ |
@@ -36,12 +28,14 @@ class StegBase(object): | @@ -36,12 +28,14 @@ class StegBase(object): | ||
36 | self.cov_jpeg = None | 28 | self.cov_jpeg = None |
37 | self.cov_data = None | 29 | self.cov_data = None |
38 | self.hid_data = None | 30 | self.hid_data = None |
31 | + self.key = None | ||
39 | 32 | ||
40 | def _get_cov_data(self, img_path): | 33 | def _get_cov_data(self, img_path): |
41 | """ | 34 | """ |
42 | Returns DCT coefficients of the cover image. | 35 | Returns DCT coefficients of the cover image. |
43 | """ | 36 | """ |
44 | self.cov_jpeg = jpegObj.Jpeg(img_path) | 37 | self.cov_jpeg = jpegObj.Jpeg(img_path) |
38 | + self.key = self.cov_jpeg.getkey() | ||
45 | self.cov_data = self.cov_jpeg.getCoefBlocks() | 39 | self.cov_data = self.cov_jpeg.getCoefBlocks() |
46 | return self.cov_data | 40 | return self.cov_data |
47 | 41 | ||
@@ -150,7 +144,7 @@ class StegBase(object): | @@ -150,7 +144,7 @@ class StegBase(object): | ||
150 | float(emb_size) / cov_size)) | 144 | float(emb_size) / cov_size)) |
151 | 145 | ||
152 | # dummy functions to please pylint | 146 | # dummy functions to please pylint |
153 | - def _raw_embed(self, cov_data, hid_data, status_begin=0): | 147 | + def _raw_embed(self, cov_data, hid_data): |
154 | pass | 148 | pass |
155 | 149 | ||
156 | def _raw_extract(self, steg_data, num_bits): | 150 | def _raw_extract(self, steg_data, num_bits): |
msteg/StegBase.pyc
No preview for this file type
msteg/steganography/F3.py
1 | -""" | ||
2 | -<p>This module implements the F3 steganography algorithm invented by | ||
3 | -Andreas Westfeld.</p> | ||
4 | - | ||
5 | -It embeds a secret message in JPEG DCT coefficients. | ||
6 | -It differs from simpler algorithms such as JSteg by subtracting the | ||
7 | -absolute DCT value if the currently embedded bit and the LSB of the DCT | ||
8 | -value are not equal. DCT coefficients with value 0 are ignored.<br /> | ||
9 | -If a DCT coefficient is equal to 1 or -1 the current bit | ||
10 | -is embedded repeatedly in order to make non-ambiguous extraction possible. | ||
11 | -""" | 1 | +__author__ = 'chunk' |
2 | + | ||
3 | + | ||
12 | import time | 4 | import time |
13 | import math | 5 | import math |
14 | import numpy as np | 6 | import numpy as np |
@@ -42,7 +34,7 @@ class F3(StegBase): | @@ -42,7 +34,7 @@ class F3(StegBase): | ||
42 | lossy compression. | 34 | lossy compression. |
43 | """ | 35 | """ |
44 | self.t0 = time.time() | 36 | self.t0 = time.time() |
45 | - StegBase._post_embed_actions(self, src_cover, src_hidden, tgt_stego) | 37 | + self._post_embed_actions(src_cover, src_hidden, tgt_stego) |
46 | 38 | ||
47 | def extract_raw_data(self, src_steg, tgt_hidden): | 39 | def extract_raw_data(self, src_steg, tgt_hidden): |
48 | """ This method extracts secret data from a stego image. It is | 40 | """ This method extracts secret data from a stego image. It is |
@@ -53,9 +45,9 @@ class F3(StegBase): | @@ -53,9 +45,9 @@ class F3(StegBase): | ||
53 | tgt_hidden - A pathname denoting where the extracted data should be saved to. | 45 | tgt_hidden - A pathname denoting where the extracted data should be saved to. |
54 | """ | 46 | """ |
55 | self.t0 = time.time() | 47 | self.t0 = time.time() |
56 | - StegBase._post_extract_actions(self, src_steg, tgt_hidden) | 48 | + self._post_extract_actions(src_steg, tgt_hidden) |
57 | 49 | ||
58 | - def _raw_embed(self, cov_data, hid_data, status_begin=0): | 50 | + def _raw_embed(self, cov_data, hid_data): |
59 | """ | 51 | """ |
60 | cov_data - 4-D numpy.int32 array | 52 | cov_data - 4-D numpy.int32 array |
61 | hid_data - 1-D numpy.uint8 array | 53 | hid_data - 1-D numpy.uint8 array |
msteg/steganography/F3.pyc
No preview for this file type
msteg/steganography/F4.py
1 | -""" | ||
2 | -<p>This module implements a slight variant of the F4 steganography algorithm | ||
3 | -invented by Andreas Westfeld. It embeds a secret message in JPEG | ||
4 | -DCT coefficients.</p> | ||
5 | -It differs from F3 in that even negative and odd positive DCT | ||
6 | -coefficients represent a 1 and odd negative and even positive | ||
7 | -DCT coefficients represent a 0. It also supports permutative strattling | ||
8 | -which is not included in the original description of F4. | ||
9 | -""" | 1 | +__author__ = 'chunk' |
2 | + | ||
10 | import time | 3 | import time |
11 | import numpy as np | 4 | import numpy as np |
12 | -from msteg.StegBase import StegBase | 5 | +import numpy.random as rnd |
6 | +from msteg.StegBase import * | ||
7 | +import mjsteg | ||
8 | +import jpegObj | ||
13 | from common import * | 9 | from common import * |
14 | 10 | ||
15 | 11 | ||
@@ -18,51 +14,105 @@ class F4(StegBase): | @@ -18,51 +14,105 @@ class F4(StegBase): | ||
18 | with the F3 algorithm and <i>extract_raw_data</i> to extract data | 14 | with the F3 algorithm and <i>extract_raw_data</i> to extract data |
19 | which was embedded previously. """ | 15 | which was embedded previously. """ |
20 | 16 | ||
21 | - def __init__(self): | 17 | + def __init__(self, key=sample_key): |
22 | """ | 18 | """ |
23 | Constructor of the F3 class. | 19 | Constructor of the F3 class. |
24 | """ | 20 | """ |
25 | StegBase.__init__(self) | 21 | StegBase.__init__(self) |
22 | + self.key = key | ||
26 | 23 | ||
27 | - def embed_raw_data(self, src_cover, src_hidden, tgt_stego): | ||
28 | - """ This method embeds arbitrary data into a cover image. | ||
29 | - The cover image must be a JPEG. | 24 | + def _get_cov_data(self, img_path): |
25 | + """ | ||
26 | + Returns DCT coefficients of the cover image. | ||
27 | + """ | ||
28 | + self.cov_jpeg = jpegObj.Jpeg(img_path, key=self.key) | ||
30 | 29 | ||
31 | - src_cover - A valid pathname to an image file which serves as cover image | ||
32 | - (the image which the secret image is embedded into). | 30 | + cov_data = self.cov_jpeg.getsignal(channel='Y') |
31 | + self.cov_data = np.array(cov_data, dtype=np.int16) | ||
32 | + return self.cov_data | ||
33 | 33 | ||
34 | - src_hidden - A valid pathname to an arbitrary file that is supposed to be | ||
35 | - embedded into the cover image. | 34 | + def embed_raw_data(self, src_cover, src_hidden, tgt_stego): |
36 | 35 | ||
37 | - tgt_stego - Target pathname of the resulting stego image. You should save to a | ||
38 | - PNG or another lossless format, because many LSBs don't survive | ||
39 | - lossy compression. | ||
40 | - """ | ||
41 | self.t0 = time.time() | 36 | self.t0 = time.time() |
42 | - StegBase._post_embed_actions(self, src_cover, src_hidden, tgt_stego) | ||
43 | 37 | ||
44 | - def extract_raw_data(self, src_steg, tgt_hidden): | ||
45 | - """ This method extracts secret data from a stego image. It is | ||
46 | - (obviously) the inverse operation of embed_raw_data. | 38 | + try: |
39 | + cov_data = self._get_cov_data(src_cover) | ||
40 | + hid_data = self._get_hid_data(src_hidden) | ||
41 | + # print hid_data.dtype,type(hid_data),hid_data.tolist() | ||
47 | 42 | ||
48 | - src_stego - A valid pathname to an image file which serves as stego image. | 43 | + cov_data, bits_cnt = self._raw_embed(cov_data, hid_data) |
44 | + | ||
45 | + if bits_cnt != np.size(hid_data) * 8: | ||
46 | + raise Exception("Expected embedded size is %db but actually %db." % ( | ||
47 | + np.size(hid_data) * 8, bits_cnt)) | ||
48 | + | ||
49 | + self.cov_jpeg.setsignal(cov_data, channel='Y') | ||
50 | + self.cov_jpeg.Jwrite(tgt_stego) | ||
51 | + | ||
52 | + # size_cov = os.path.getsize(tgt_stego) | ||
53 | + size_cov = np.size(cov_data) / 8 | ||
54 | + size_embedded = np.size(hid_data) | ||
55 | + | ||
56 | + self._display_stats("embedded", size_cov, size_embedded, | ||
57 | + time.time() - self.t0) | ||
58 | + | ||
59 | + except TypeError as e: | ||
60 | + raise e | ||
61 | + except Exception as expt: | ||
62 | + print "Exception when embedding!" | ||
63 | + raise | ||
64 | + | ||
65 | + def extract_raw_data(self, src_steg, tgt_hidden): | ||
49 | 66 | ||
50 | - tgt_hidden - A pathname denoting where the extracted data should be saved to. | ||
51 | - """ | ||
52 | self.t0 = time.time() | 67 | self.t0 = time.time() |
53 | - StegBase._post_extract_actions(self, src_steg, tgt_hidden) | ||
54 | 68 | ||
55 | - def _raw_embed(self, cov_data, hid_data, status_begin=0): | 69 | + try: |
70 | + steg_data = self._get_cov_data(src_steg) | ||
71 | + # emb_size = os.path.getsize(src_steg) | ||
72 | + emb_size = np.size(steg_data) / 8 | ||
73 | + | ||
74 | + | ||
75 | + # recovering file size | ||
76 | + header_size = 4 * 8 | ||
77 | + size_data, bits_cnt = self._raw_extract(steg_data, header_size) | ||
78 | + size_data = bits2bytes(size_data) | ||
79 | + print size_data | ||
80 | + | ||
81 | + size_hd = 0 | ||
82 | + for i in xrange(4): | ||
83 | + size_hd += size_data[i] * 256 ** i | ||
84 | + | ||
85 | + raw_size = size_hd * 8 | ||
86 | + | ||
87 | + if raw_size > np.size(steg_data): | ||
88 | + raise Exception("Supposed secret data too large for stego image.") | ||
89 | + | ||
90 | + hid_data, bits_cnt = self._raw_extract(steg_data, raw_size) | ||
91 | + | ||
92 | + if bits_cnt != raw_size: | ||
93 | + raise Exception("Expected embedded size is %db but actually %db." % ( | ||
94 | + raw_size, bits_cnt)) | ||
95 | + | ||
96 | + hid_data = bits2bytes(hid_data) | ||
97 | + # print hid_data.dtype,type(hid_data),hid_data.tolist() | ||
98 | + hid_data[4:].tofile(tgt_hidden) | ||
99 | + | ||
100 | + self._display_stats("extracted", emb_size, | ||
101 | + np.size(hid_data), | ||
102 | + time.time() - self.t0) | ||
103 | + except Exception as expt: | ||
104 | + print "Exception when extracting!" | ||
105 | + raise | ||
106 | + | ||
107 | + def _raw_embed(self, cov_data, hid_data): | ||
56 | """ | 108 | """ |
57 | - cov_data - 4-D numpy.int32 array | 109 | + cov_data - 1-D numpy.int16 array (permunated) |
58 | hid_data - 1-D numpy.uint8 array | 110 | hid_data - 1-D numpy.uint8 array |
59 | """ | 111 | """ |
60 | hid_data = bytes2bits(hid_data) | 112 | hid_data = bytes2bits(hid_data) |
61 | i = 0 | 113 | i = 0 |
62 | - cnt = -1 | ||
63 | for x in np.nditer(cov_data, op_flags=['readwrite']): | 114 | for x in np.nditer(cov_data, op_flags=['readwrite']): |
64 | - cnt = cnt + 1 | ||
65 | - if x == 0 or cnt % 64 == 0: continue | 115 | + if x == 0: continue |
66 | 116 | ||
67 | m = (hid_data[i] & 1) | 117 | m = (hid_data[i] & 1) |
68 | if x > 0 and x & 1 != m: | 118 | if x > 0 and x & 1 != m: |
@@ -72,19 +122,17 @@ class F4(StegBase): | @@ -72,19 +122,17 @@ class F4(StegBase): | ||
72 | if x == 0: continue | 122 | if x == 0: continue |
73 | i += 1 | 123 | i += 1 |
74 | if i == hid_data.size: break | 124 | if i == hid_data.size: break |
75 | - | ||
76 | - return cov_data | 125 | + return cov_data, i |
77 | 126 | ||
78 | def _raw_extract(self, steg_data, num_bits): | 127 | def _raw_extract(self, steg_data, num_bits): |
79 | """ | 128 | """ |
80 | Just a small helper function to extract hidden data. | 129 | Just a small helper function to extract hidden data. |
130 | + steg_data - 1-D numpy.int16 array (permunated) | ||
81 | """ | 131 | """ |
82 | hid_data = np.zeros(num_bits, np.uint8) | 132 | hid_data = np.zeros(num_bits, np.uint8) |
83 | j = 0 | 133 | j = 0 |
84 | - cnt = -1 | ||
85 | - for x in np.nditer(steg_data): | ||
86 | - cnt = cnt + 1 | ||
87 | - if x == 0 or cnt % 64 == 0: continue | 134 | + for x in steg_data: |
135 | + if x == 0: continue | ||
88 | if j >= num_bits: break | 136 | if j >= num_bits: break |
89 | if x > 0: | 137 | if x > 0: |
90 | hid_data[j] = x & 1 | 138 | hid_data[j] = x & 1 |
@@ -93,7 +141,7 @@ class F4(StegBase): | @@ -93,7 +141,7 @@ class F4(StegBase): | ||
93 | 141 | ||
94 | j = j + 1 | 142 | j = j + 1 |
95 | 143 | ||
96 | - return hid_data | 144 | + return hid_data, j |
97 | 145 | ||
98 | def __str__(self): | 146 | def __str__(self): |
99 | return "F4'" | 147 | return "F4'" |
msteg/steganography/F4.pyc
No preview for this file type
msteg/steganography/LSB.py
1 | -""" | ||
2 | -<p>This plugin implements two variants of a well-known steganographic | ||
3 | -procedure commonly referred to as LSB algorithm.</p> | ||
4 | -The general idea is to | ||
5 | -overwrite some portion (usually the k least significant bits) of each byte | ||
6 | -in the cover image. The below methods specify the number of overwritten | ||
7 | -bits a parameter named word_size. Thus --- in this context --- word means | ||
8 | -\"a group of bits of a fixed size\". | ||
9 | -""" | 1 | +__author__ = 'chunk' |
2 | + | ||
3 | + | ||
10 | import time | 4 | import time |
11 | import numpy as np | 5 | import numpy as np |
12 | import scipy as sp | 6 | import scipy as sp |
@@ -53,7 +47,7 @@ class LSB(StegBase): | @@ -53,7 +47,7 @@ class LSB(StegBase): | ||
53 | self.t0 = time.time() | 47 | self.t0 = time.time() |
54 | StegBase._post_extract_actions(self, src_steg, tgt_hidden) | 48 | StegBase._post_extract_actions(self, src_steg, tgt_hidden) |
55 | 49 | ||
56 | - def _raw_embed(self, cov_data, hid_data, status_begin=0): | 50 | + def _raw_embed(self, cov_data, hid_data): |
57 | """ | 51 | """ |
58 | cov_data - 4-D numpy.int32 array | 52 | cov_data - 4-D numpy.int32 array |
59 | hid_data - 1-D numpy.uint8 array | 53 | hid_data - 1-D numpy.uint8 array |
msteg/steganography/LSB.pyc
No preview for this file type
res/steged.jpg
test_jpeg.py
@@ -3,6 +3,7 @@ __author__ = 'chunk' | @@ -3,6 +3,7 @@ __author__ = 'chunk' | ||
3 | import numpy as np | 3 | import numpy as np |
4 | import mjsteg | 4 | import mjsteg |
5 | import jpegObj | 5 | import jpegObj |
6 | +from jpegObj import base | ||
6 | from common import * | 7 | from common import * |
7 | 8 | ||
8 | timer = Timer() | 9 | timer = Timer() |
@@ -16,6 +17,7 @@ sample = [[7, 12, 14, -12, 1, 0, -1, 0], | @@ -16,6 +17,7 @@ sample = [[7, 12, 14, -12, 1, 0, -1, 0], | ||
16 | [0, 0, 0, 0, 0, 0, 0, 0], | 17 | [0, 0, 0, 0, 0, 0, 0, 0], |
17 | [0, 0, 0, 0, 0, 0, 0, 0]] | 18 | [0, 0, 0, 0, 0, 0, 0, 0]] |
18 | 19 | ||
20 | +sample_key = [46812L, 20559L, 31360L, 16681L, 27536L, 39553L, 5427L, 63029L, 56572L, 36476L, 25695L, 61908L, 63014L, 5908L, 59816L, 56765L] | ||
19 | 21 | ||
20 | def diffblock(c1, c2): | 22 | def diffblock(c1, c2): |
21 | diff = False | 23 | diff = False |
@@ -184,16 +186,28 @@ if __name__ == '__main__': | @@ -184,16 +186,28 @@ if __name__ == '__main__': | ||
184 | 186 | ||
185 | # test_bitbyte() | 187 | # test_bitbyte() |
186 | 188 | ||
187 | - ima = jpegObj.Jpeg("res/test3.jpg") | ||
188 | - imb = jpegObj.Jpeg("res/steged.jpg") | 189 | + ima = jpegObj.Jpeg("res/test3.jpg",key=sample_key) |
190 | + imb = jpegObj.Jpeg("res/new.jpg",key=sample_key) | ||
191 | + imc = jpegObj.Jpeg("res/steged.jpg",key=sample_key) | ||
189 | print ima.Jgetcompdim(0) | 192 | print ima.Jgetcompdim(0) |
190 | - diffblocks(ima, imb) | ||
191 | - | ||
192 | - c1 = ima.getCoefBlocks() | ||
193 | - c2 = imb.getCoefBlocks() | ||
194 | - | ||
195 | - print c1[0],c2[0] | 193 | + print ima.getkey(),imb.getkey() |
194 | + diffblocks(imb, ima) | ||
196 | 195 | ||
196 | + # c1 = ima.getCoefBlocks() | ||
197 | + # c2 = imb.getCoefBlocks() | ||
198 | + # | ||
199 | + # # print c1[0],c2[0] | ||
200 | + # s1 = imb.getsignal(channel='Y') | ||
201 | + # s2 = ima.getsignal(channel='Y') | ||
202 | + # imb.setsignal(s2,channel='Y') | ||
203 | + # imb.Jwrite('res/new.jpg') | ||
204 | + | ||
205 | + | ||
206 | + # print base.acMask(8,16) | ||
207 | + # mmask = base.acMaskBlock | ||
208 | + # print mmask | ||
209 | + # sample = np.array(sample)[mmask] | ||
210 | + # print np.hstack([[],sample]) | ||
197 | pass | 211 | pass |
198 | 212 | ||
199 | 213 |
test_steg.py
@@ -22,10 +22,12 @@ sample = [[7, 12, 14, -12, 1, 0, -1, 0], | @@ -22,10 +22,12 @@ sample = [[7, 12, 14, -12, 1, 0, -1, 0], | ||
22 | [0, 0, 0, 0, 0, 0, 0, 0], | 22 | [0, 0, 0, 0, 0, 0, 0, 0], |
23 | [0, 0, 0, 0, 0, 0, 0, 0]] | 23 | [0, 0, 0, 0, 0, 0, 0, 0]] |
24 | 24 | ||
25 | +sample_key = [46812L, 20559L, 31360L, 16681L, 27536L, 39553L, 5427L, 63029L, 56572L, 36476L, 25695L, 61908L, 63014L, 5908L, 59816L, 56765L] | ||
26 | + | ||
25 | txtsample = [116, 104, 105, 115, 32, 105, 115, 32, 116, 111, 32, 98, 101, 32, 101, 109, 98, 101, 100, 101, 100, 46, 10] | 27 | txtsample = [116, 104, 105, 115, 32, 105, 115, 32, 116, 111, 32, 98, 101, 32, 101, 109, 98, 101, 100, 101, 100, 46, 10] |
26 | 28 | ||
27 | if __name__ == '__main__': | 29 | if __name__ == '__main__': |
28 | - f3test = F3.F3() | 30 | + f3test = F4.F4() |
29 | f3test.embed_raw_data("res/test3.jpg", "res/embeded", "res/steged.jpg") | 31 | f3test.embed_raw_data("res/test3.jpg", "res/embeded", "res/steged.jpg") |
30 | f3test.extract_raw_data("res/steged.jpg", "res/extracted") | 32 | f3test.extract_raw_data("res/steged.jpg", "res/extracted") |
31 | 33 |