From 46cc100c5eba17c83e1d3ae4f515a6e5acc0a5f3 Mon Sep 17 00:00:00 2001 From: Shankar Jayaprakash <79354504+shankarjp@users.noreply.github.com> Date: Sun, 10 Oct 2021 21:13:16 +0530 Subject: [PATCH] Added Steg_Tool Script (#234) Co-authored-by: Shankar JP --- README.md | 1 + Steg_Tool/README.md | 21 ++++++ Steg_Tool/image.png | Bin 0 -> 41236 bytes Steg_Tool/secret.txt | 1 + Steg_Tool/steg.py | 174 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 Steg_Tool/README.md create mode 100644 Steg_Tool/image.png create mode 100644 Steg_Tool/secret.txt create mode 100644 Steg_Tool/steg.py diff --git a/README.md b/README.md index 85d382c..cd8cad5 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,7 @@ So far, the following projects have been integrated to this repo: |[Plagiarism_detector](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/Plagiarism_detector)|[Akshita Singhal](https://github.com/akshitasinghal4444)| |[csv_to_json](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/csv_to_json)|[MoiZ](https://github.com/TechBoyy6)| |[Battery_notification](https://github.com/hastagABAwesome-Python-Scripts/Battery_notification/)|[Krishna Sharma](https://github.com/krishnasharma1386)| +|[Steg_Tool](https://github.com/hastagABAwesome-Python-Scripts/Steg_Tool/)|[Shankar JP](https://github.com/shankarjp)| ## How to use : diff --git a/Steg_Tool/README.md b/Steg_Tool/README.md new file mode 100644 index 0000000..2d52cb5 --- /dev/null +++ b/Steg_Tool/README.md @@ -0,0 +1,21 @@ +# Steganography Tool + +* Advanced Image Steganography Tool used to hide files inside Images. +* Uses LSB (Least Significant Bit) Algorithm to store file data inside the image +* Works with only .png format + +Commands +``` +python3 steg.py +``` +Input +``` +encode + +decode +``` +Example +``` +encode image.png image_new.png secret.txt +decode image_new.png secret_new.txt +``` \ No newline at end of file diff --git a/Steg_Tool/image.png b/Steg_Tool/image.png new file mode 100644 index 0000000000000000000000000000000000000000..df25ec4e45762ec5ffb4d62c1c4ea9a9db3cd225 GIT binary patch literal 41236 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ΝS%2?pd-%iml2 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�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 64): + raise Exception("Binary Value larger than expected") + else: + while(len(binary_value) < 64): + binary_value = "0" + binary_value + for c in binary_value: + value = list(input_image[current_height, current_width]) + if(int(c) == 1): + value[current_channel] = int(value[current_channel]) | maskone + else: + value[current_channel] = int(value[current_channel]) & maskzero + input_image[current_height, current_width] = tuple(value) + if(current_channel == nbchannels-1): + current_channel = 0 + if(current_width == width-1): + current_width = 0 + if(current_height == height-1): + current_height = 0 + if maskone == 128: + raise Exception("No more space available in image") + else: + maskone = maskonevalues.pop(0) + maskzero = maskzerovalues.pop(0) + else: + current_height += 1 + else: + current_width += 1 + else: + current_channel += 1 + for byte in data: + if(isinstance(byte, int)): + pass + else: + byte = ord(byte) + binv = bin(byte)[2:] + if(len(binv) > 8): + raise Exception("Binary Value larger than expected") + else: + while(len(binv) < 8): + binv = "0" + binv + for c in binv: + val = list(input_image[current_height, current_width]) + if(int(c) == 1): + val[current_channel] = int(val[current_channel]) | maskone + else: + val[current_channel] = int(val[current_channel]) & maskzero + input_image[current_height, current_width] = tuple(val) + if(current_channel == nbchannels-1): + current_channel = 0 + if(current_width == width-1): + current_width = 0 + if(current_height == height-1): + current_height = 0 + if maskone == 128: + raise Exception("No more space available in image") + else: + maskone = maskonevalues.pop(0) + maskzero = maskzerovalues.pop(0) + else: + current_height += 1 + else: + current_width += 1 + else: + current_channel += 1 + cv2.imwrite(output_image_name, input_image) + + +def decode(encoded_image_name, extracted_file_name): + encoded_image = cv2.imread(encoded_image_name) + + height, width, nbchannels = encoded_image.shape + size = width*height + current_width = 0 + current_height = 0 + current_channel = 0 + + maskonevalues = [1, 2, 4, 8, 16, 32, 64, 128] + maskone = maskonevalues.pop(0) + maskzerovalues = [254, 253, 251, 247, 239, 223, 191, 127] + maskzero = maskzerovalues.pop(0) + + bits = "" + for i in range(64): + value = encoded_image[current_height, current_width][current_channel] + value = int(value) & maskone + if(current_channel == nbchannels-1): + current_channel = 0 + if(current_width == width-1): + current_width = 0 + if(current_height == height-1): + current_height = 0 + if(maskone == 128): + raise Exception("No more space available in image") + else: + maskone = maskonevalues.pop(0) + maskzero = maskzerovalues.pop(0) + else: + current_height += 1 + else: + current_width += 1 + else: + current_channel += 1 + if(value > 0): + bits += "1" + else: + bits += "0" + length = int(bits, 2) + output = b"" + for i in range(length): + bits = "" + for i in range(8): + value = encoded_image[current_height, current_width][current_channel] + value = int(value) & maskone + if(current_channel == nbchannels-1): + current_channel = 0 + if(current_width == width-1): + current_width = 0 + if(current_height == height-1): + current_height = 0 + if(maskone == 128): + raise Exception("No more space available in image") + else: + maskone = maskonevalues.pop(0) + maskzero = maskzerovalues.pop(0) + else: + current_height += 1 + else: + current_width += 1 + else: + current_channel += 1 + if(value > 0): + bits += "1" + else: + bits += "0" + output += bytearray([int(bits, 2)]) + f = open(extracted_file_name, "wb") + f.write(output) + f.close() + +if __name__ == "__main__": + input_string = input() + #encode input_image_name output_image_name file_name + #decode encoded_image_name extracted_file_name + input_list = input_string.split() + if input_list[0] == "encode": + encode(input_list[1], input_list[2], input_list[3]) + print(f"{input_list[2]}") + elif input_list[0] == "decode": + decode(input_list[1], input_list[2]) + print(f"{input_list[2]}") + else: + print("Invalid Entry")