dev-resources.site
for different kinds of informations.
Image encryption and decryption using AES algorithm
Published at
5/5/2023
Categories
python
aes
encryption
image
Author
sadiab47
Author
8 person written this
sadiab47
open
I'm creating Image encryption and decryption using AES algorithm. All of my code runs well and image is being selected for upload and encryption process runs but following error appears Screenshot attached
here is my code
from __future__ import division, print_function, unicode_literals
import sys
import random
import argparse
import logging
from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import os
import PIL
from PIL import Image
import math
from Crypto.Cipher import AES
import hashlib
import binascii
import numpy as np
global password
def load_image(name):
return Image.open(name)
# ----------------- Functions for encryption ---------------------#
def prepare_message_image(image, size):
if size != image.size:
image = image.resize(size, Image.ANTIALIAS)
return image
def generate_secret(size, secret_image = None):
width, height = size
new_secret_image = Image.new(mode = "RGB", size = (width * 2, height * 2))
for x in range(0, 2 * width, 2):
for y in range(0, 2 * height, 2):
color1 = np.random.randint(255)
color2 = np.random.randint(255)
color3 = np.random.randint(255)
new_secret_image.putpixel((x, y), (color1,color2,color3))
new_secret_image.putpixel((x+1,y), (255-color1,255-color2,255-color3))
new_secret_image.putpixel((x, y+1), (255-color1,255-color2,255-color3))
new_secret_image.putpixel((x+1,y+1), (color1,color2,color3))
return new_secret_image
def generate_ciphered_image(secret_image, prepared_image):
width, height = prepared_image.size
ciphered_image = Image.new(mode = "RGB", size = (width * 2, height * 2))
for x in range(0, width*2, 2):
for y in range(0, height*2, 2):
sec = secret_image.getpixel((x,y))
msssg = prepared_image.getpixel((int(x/2),int(y/2)))
color1 = (msssg[0]+sec[0])%256
color2 = (msssg[1]+sec[1])%256
color3 = (msssg[2]+sec[2])%256
ciphered_image.putpixel((x, y), (color1,color2,color3))
ciphered_image.putpixel((x+1,y), (255-color1,255-color2,255-color3))
ciphered_image.putpixel((x, y+1), (255-color1,255-color2,255-color3))
ciphered_image.putpixel((x+1,y+1), (color1,color2,color3))
return ciphered_image
def generate_image_back(secret_image, ciphered_image):
width, height = secret_image.size
new_image = Image.new(mode = "RGB", size = (int(width / 2), int(height / 2)))
for x in range(0, width, 2):
for y in range(0, height, 2):
sec = secret_image.getpixel((x,y))
cip = ciphered_image.getpixel((x,y))
color1 = (cip[0]-sec[0])%256
color2 = (cip[1]-sec[1])%256
color3 = (cip[2]-sec[2])%256
new_image.putpixel((int(x/2), int(y/2)), (color1,color2,color3))
return new_image
#------------------------Encryption -------------------#
def level_one_encrypt(Imagename):
message_image = load_image(Imagename)
size = message_image.size
width, height = size
secret_image = generate_secret(size)
secret_image.save("secret.jpeg")
prepared_image = prepare_message_image(message_image, size)
ciphered_image = generate_ciphered_image(secret_image, prepared_image)
ciphered_image.save("2-share_encrypt.jpeg")
# -------------------- Construct Encrypted Image ----------------#
def construct_enc_image(ciphertext, relength, width, height):
asciicipher = binascii.hexlify(ciphertext)
def replace_all(text, dic):
for i, j in dic.iteritems():
text = text.replace(i, j)
return text
reps = {'a':'1', 'b':'2', 'c':'3', 'd':'4', 'e':'5', 'f':'6', 'g':'7', 'h':'8', 'i':'9', 'j':'10', 'k':'11', 'l':'12', 'm':'13', 'n':'14', 'o':'15', 'p':'16', 'q':'17', 'r':'18', 's':'19', 't':'20', 'u':'21', 'v':'22', 'w':'23', 'x':'24', 'y':'25', 'z':'26'}
asciiciphertxt = replace_all(asciicipher, reps)
step = 3
encimageone=[asciiciphertxt[i:i+step] for i in range(0, len(asciiciphertxt), step)]
# if the last pixel RGB value is less than 3-digits, add a digit as 1
if int(encimageone[len(encimageone)-1]) < 100:
encimageone[len(encimageone)-1] += "1"
if len(encimageone) % 3 != 0:
while len(encimageone) % 3 != 0:
encimageone.append("101")
pixelArray = []
for i in range(len(encimageone)//3):
pixelArray.append((int(encimageone[3*i]),int(encimageone[3*i+1]),int(encimageone[3*i+2])))
image = Image.new("RGB", (width, height))
image.putdata(pixelArray)
return image
#------------------------- Visual-encryption -------------------------#
def encrypt(imagename,password):
plaintext = list()
plaintextstr = ""
im = Image.open(imagename)
pix = im.load()
width = im.size[0]
height = im.size[1]
# break up the image into a list, each with pixel values and then append to a string
for y in range(0,height):
for x in range(0,width):
print (pix[x,y])
plaintext.append(pix[x,y])
print(width)
print(height)
# add 100 to each tuple value to make sure each are 3 digits long.
for i in range(0,len(plaintext)):
for j in range(0,3):
aa = int(plaintext[i][j])+100
plaintextstr = plaintextstr + str(aa)
# length save for encrypted image reconstruction
relength = len(plaintext)
# append dimensions of image for reconstruction after decryption
plaintextstr += "h" + str(height) + "h" + "w" + str(width) + "w"
# make sure that plantextstr length is a multiple of 16 for AES. if not, append "n".
while (len(plaintextstr) % 16 != 0):
plaintextstr = plaintextstr + "n"
# encrypt plaintext
obj = AES.new(password, AES.MODE_CBC, 'This is an IV456')
ciphertext = obj.encrypt(plaintextstr)
# write ciphertext to file for analysis
cipher_name = imagename + ".crypt"
g = open(cipher_name, 'w')
g.write(ciphertext)
construct_enc_image(ciphertext,relength,width,height)
print("Visual Encryption done.......")
level_one_encrypt("visual_encrypt.jpeg")
print("2-Share Encryption done.......")
# ---------------------- decryption ---------------------- #
def decrypt(ciphername,password):
secret_image = Image.open("secret.jpeg")
ima = Image.open("2-share_encrypt.jpeg")
new_image = generate_image_back(secret_image, ima)
new_image.save("2-share_decrypt.jpeg")
print("2-share Decryption done....")
cipher = open(ciphername,'r')
ciphertext = cipher.read()
# decrypt ciphertext with password
obj2 = AES.new(password, AES.MODE_CBC, 'This is an IV456')
decrypted = obj2.decrypt(ciphertext)
# parse the decrypted text back into integer string
decrypted = decrypted.replace("n","")
# extract dimensions of images
newwidth = decrypted.split("w")[1]
newheight = decrypted.split("h")[1]
# replace height and width with emptyspace in decrypted plaintext
heightr = "h" + str(newheight) + "h"
widthr = "w" + str(newwidth) + "w"
decrypted = decrypted.replace(heightr,"")
decrypted = decrypted.replace(widthr,"")
# reconstruct the list of RGB tuples from the decrypted plaintext
step = 3
finaltextone=[decrypted[i:i+step] for i in range(0, len(decrypted), step)]
finaltexttwo=[(int(finaltextone[int(i)])-100,int(finaltextone[int(i+1)])-100,int(finaltextone[int(i+2)])-100) for i in range(0, len(finaltextone), step)]
# reconstruct image from list of pixel RGB tuples
newim = Image.new("RGB", (int(newwidth), int(newheight)))
newim.putdata(finaltexttwo)
newim.save("visual_decrypt.jpeg")
print("Visual Decryption done......")
# ---------------------
# GUI stuff starts here
# ---------------------
def pass_alert():
messagebox.showinfo("Password Alert","Please enter a password.")
def enc_success(imagename):
messagebox.showinfo("Success","Encrypted Image: " + imagename)
# image encrypt button event
def image_open():
global file_path_e
enc_pass = passg.get()
if enc_pass == "":
pass_alert()
else:
password = hashlib.sha256(enc_pass.encode('utf-8')).hexdigest()
filename = filedialog.askopenfilename()
file_path_e = os.path.dirname(filename)
encrypt(filename,password)
# image decrypt button event
def cipher_open():
global file_path_d
dec_pass = passg.get()
if dec_pass == "":
pass_alert()
else:
password = hashlib.sha256(dec_pass.encode('utf-8')).hexdigest()
filename = filedialog.askopenfilename()
file_path_d = os.path.dirname(filename)
decrypt(filename,password)
class App:
def __init__(self, master):
global passg
title = "Image Encryption"
author = "Made by Aqsa & Sabooha"
msgtitle = Message(master, text =title)
msgtitle.config(font=('helvetica', 17, 'bold'), width=200)
msgauthor = Message(master, text=author)
msgauthor.config(font=('helvetica',10), width=200)
canvas_width = 200
canvas_height = 50
w = Canvas(master,
width=canvas_width,
height=canvas_height)
msgtitle.pack()
msgauthor.pack()
w.pack()
passlabel = Label(master, text="Enter Encrypt/Decrypt Password:")
passlabel.pack()
passg = Entry(master, show="*", width=20)
passg.pack()
self.encrypt = Button(master,
text="Encrypt", fg="black",
command=image_open, width=25,height=5)
self.encrypt.pack(side=LEFT)
self.decrypt = Button(master,
text="Decrypt", fg="black",
command=cipher_open, width=25,height=5)
self.decrypt.pack(side=RIGHT)
# ------------------ MAIN -------------#
root = Tk()
root.wm_title("Image Encryption")
app = App(root)
root.mainloop()
aes Article's
14 articles in total
De C# a Go: Logrando Compatibilidad en Codificaciรณn AES y Base64
read article
Securing a REST API with JWT Authentication in C# Using AES-Encrypted Keys
read article
Comprehensive Encryption and Security Service in NestJS: Argon2 Hashing, Token Generation, and AES Encryption
read article
Implementing HTTP Request and Response Encryption in ASP.NET Core with Custom Attributes
read article
AES in ECB mode
read article
Encrypt/Decrypt Data between Python 3 and JavaScript (AES algorithm)
read article
AES Decryption in NodeJs
read article
Understanding Wireless Router Encryption: TKIP, AES, and TKIP&AES
read article
Image encryption and decryption using AES algorithm
currently reading
AES/CBC/PKCS5Padding Encryption
read article
Decode data encrypted in Java in shell
read article
Protect your data with WarShield
read article
Serverless Backends with AWS Cloud: Sending tweets and collecting emails
read article
Crypto Notepad
read article
Featured ones: