-
Notifications
You must be signed in to change notification settings - Fork 0
/
Image Steganography.py
144 lines (116 loc) · 3.67 KB
/
Image Steganography.py
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Python program implementing Image Steganography
# PIL module is used to extract
# pixels of image and modify it
from PIL import Image
# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
# list of binary codes
# of given data
newd = []
for i in data:
newd.append(format(ord(i), '08b'))
return newd
# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
datalist = genData(data)
lendata = len(datalist)
imdata = iter(pix)
for i in range(lendata):
# Extracting 3 pixels at a time
pix = [value for value in imdata.__next__()[:3] +
imdata.__next__()[:3] +
imdata.__next__()[:3]]
# Pixel value should be made
# odd for 1 and even for 0
for j in range(0, 8):
if (datalist[i][j] == '0' and pix[j]% 2 != 0):
pix[j] -= 1
elif (datalist[i][j] == '1' and pix[j] % 2 == 0):
if(pix[j] != 0):
pix[j] -= 1
else:
pix[j] += 1
# pix[j] -= 1
# Eighth pixel of every set tells
# whether to stop ot read further.
# 0 means keep reading; 1 means thec
# message is over.
if (i == lendata - 1):
if (pix[-1] % 2 == 0):
if(pix[-1] != 0):
pix[-1] -= 1
else:
pix[-1] += 1
else:
if (pix[-1] % 2 != 0):
pix[-1] -= 1
pix = tuple(pix)
yield pix[0:3]
yield pix[3:6]
yield pix[6:9]
def encode_enc(newimg, data):
w = newimg.size[0]
(x, y) = (0, 0)
for pixel in modPix(newimg.getdata(), data):
# Putting modified pixels in the new image
newimg.putpixel((x, y), pixel)
if (x == w - 1):
x = 0
y += 1
else:
x += 1
# Encode data into image
def encode():
img = input("\nPlease select the image in which you wish to encrypt this information : ")
image = Image.open(img, 'r')
data = input("\nEnter data to be encoded : ")
if (len(data) == 0):
raise ValueError('\nData is empty')
newimg = image.copy()
encode_enc(newimg, data)
new_img_name = input("\nEnter the name of new image with extension : ")
newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))
# Decode the data in the image
def decode():
img = input("\nPlease select the image from which you wish to decrypt the information: ")
image = Image.open(img, 'r')
data = ''
imgdata = iter(image.getdata())
while (True):
pixels = [value for value in imgdata.__next__()[:3] +
imgdata.__next__()[:3] +
imgdata.__next__()[:3]]
# string of binary data
binstr = ''
for i in pixels[:8]:
if (i % 2 == 0):
binstr += '0'
else:
binstr += '1'
data += chr(int(binstr, 2))
if (pixels[-1] % 2 != 0):
return data
# Main Function
def main():
print ("\n\n\t\t\t ***** STEGANOGRAPHY PROJECT *****")
print ("\t\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("\n\n Image steganograaphy is the art of encrypting messages into image files. \n This project implements the same concept.")
print ("\n\n Please select a valid option.\n")
print (" 1. ENCRYPT - This will hide your image in the picture you provide.")
print (" 2. DECRYPT - This will decode the message you have encrypted in the image you provide.\n\n")
a = int(input("\nPlease choose a valid option (1/2)\n"))
if (a == 1):
encode()
print("\nCompleted !!! Your message was successfully encoded.\n")
print("\n******************** END ********************")
elif (a == 2):
print("\nSuccess !!! Data found...\nDecoded Message : " + decode())
print("\n******************** END ********************")
else:
raise Exception("You did not select a valid option!!! The program will now terminate! Enter correct input")
# Driver Code
if __name__ == '__main__' :
# Calling main function
main()