Skip to content

Commit 45edff6

Browse files
committed
Add hiding and encryption
1 parent a7b7e83 commit 45edff6

File tree

5 files changed

+73
-0
lines changed

5 files changed

+73
-0
lines changed

Python/Image-Steganography/hide.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from PIL import Image
2+
import numpy as np
3+
import sys
4+
from cryptography.fernet import Fernet
5+
6+
7+
if len(sys.argv) < 3:
8+
print("Provide appropriate commandline arguments.")
9+
sys.exit()
10+
11+
12+
def encrypt_message(message):
13+
key = Fernet.generate_key()
14+
encrypted_message = Fernet(key).encrypt(message.encode())
15+
16+
return encrypted_message, key
17+
18+
19+
def hide_info(image, message):
20+
21+
enc_message, key = encrypt_message(message)
22+
image = np.array(image)
23+
24+
max_bytes = image.shape[0] * image.shape[1] * 3//8
25+
26+
if len(enc_message) > max_bytes:
27+
raise ValueError("Insufficient bytes, provide bigger image or shorter message.")
28+
29+
enc_message += "#####".encode()
30+
31+
data_index = 0
32+
bin_enc_message = [ format(i, "08b") for i in enc_message]
33+
34+
data_len = len(bin_enc_message)
35+
36+
for values in image:
37+
for pixel in values:
38+
r, g, b = [format(i, "08b") for i in pixel]
39+
40+
if data_index < data_len:
41+
pixel[0] = int(r[:-1] + bin_enc_message[data_index], 2)
42+
data_index += 1
43+
44+
if data_index < data_len:
45+
pixel[1] = int(g[:-1] + bin_enc_message[data_index], 2)
46+
data_index += 1
47+
48+
if data_index < data_len:
49+
pixel[2] = int(b[:-1] + bin_enc_message[data_index], 2)
50+
data_index += 1
51+
52+
if data_index >= data_len:
53+
break
54+
55+
with open("key", "wb") as f:
56+
f.write(key)
57+
58+
return Image.fromarray(image)
59+
60+
61+
image_path = sys.argv[1]
62+
message_path = sys.argv[2]
63+
64+
source_image = Image.open(image_path, "r")
65+
with open(message_path, "r") as f:
66+
message = f.read()
67+
68+
secret_image = hide_info(source_image, message)
69+
secret_image_path = image_path.split(".")
70+
secret_image_path = secret_image_path[-2]+"_secret."+secret_image_path[-1]
71+
secret_image.save(secret_image_path)

Python/Image-Steganography/info.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello, this file's content will be hidden.

Python/Image-Steganography/key

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VVagxe87pFTfpWsr78zh5s6cyyzXWD4_-YMpJpB-vvI=
72.6 KB
Loading
66.9 KB
Loading

0 commit comments

Comments
 (0)