问题描述
因此,我正在尝试运行该程序,该程序以前像2周前一样运行正常,现在,它表明用户界面在选择图像并使用加密功能后没有响应。上次我让它运行一两个小时,并且程序创建了一个加密的图像,但是我没有等那么长时间等待它产生输出。就像我说的那样,它是在两周前不到10秒的时间运行的,但是现在已经不复存在了,因为我是Python编程的新手,所以我一直无法弄清楚实际的问题是什么。
from Tkinter import *
from tkFileDialog import *
import tkMessageBox
import os
import PIL
import math
from PIL import Image
from Crypto.Cipher import AES
import hashlib
import binascii
import base64
global password # make pass global var
# encryption method
# -----------------
def encrypt(imagename,password):
# initialize variables
plaintext = list()
plaintextstr = ""
# load the image
im = Image.open(imagename) # open target image
pix = im.load()
# print im.size # print size of image (width,height)
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):
# print("Row: %d") %y # print row number
for x in range(0,width):
# print pix[x,y] # print each pixel RGB tuple
plaintext.append(pix[x,y])
# add 100 to each tuple value to make sure each are 3 digits long. being able to do this is really just a PoC
# that you'll be able to use a raw application of RSA to encrypt,rather than PyCrypto if you wanted.
for i in range(0,len(plaintext)):
for j in range(0,3):
plaintextstr = plaintextstr + "%d" % (int(plaintext[i][j]) + 100)
# 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". not safe in theory
# and i should probably replace this with an initialization vector IV = 16 * '\x00' at some point. In practice
# this IV buffer should be random.
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')
base64_ciphertext = base64.b64encode(ciphertext)
g.write(base64_ciphertext)
# -----------------
# construct encrypted image (not currently using since Tkinter isn't very nice)
# -----------------
def construct_enc_image():
# hexlify the ciphertext
asciicipher = binascii.hexlify(ciphertext)
# replace function
def replace_all(text,dic):
for i,j in dic.iteritems():
text = text.replace(i,j)
return text
# use replace function to replace ascii cipher characters with numbers
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)
# construct encrypted image
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 a 1
if int(encimageone[len(encimageone) - 1]) < 100:
encimageone[len(encimageone) - 1] += "1"
# check to see if we can divide the string into partitions of 3 digits. if not,fill in with some garbage RGB values
if len(encimageone) % 3 != 0:
while (len(encimageone) % 3 != 0):
encimageone.append("101")
encimagetwo = [(int(encimageone[int(i)]),int(encimageone[int(i + 1)]),int(encimageone[int(i + 2)])) for i in
range(0,len(encimageone),step)]
# make sizes of images equal
while (int(relength) != len(encimagetwo)):
encimagetwo.pop()
# encrypted image
encim = Image.new("RGB",(int(width),int(height)))
encim.putdata(encimagetwo)
encim.show()
# alert success and path to image
enc_success(cipher_name)
construct_enc_image()
# decryption method
# -----------------
def decrypt(ciphername,password):
# reach ciphertext into memory
cipher = open(ciphername,'r')
ciphertext = cipher.read()
denc = base64.b64decode(ciphertext)
# decrypt ciphertext with password
obj2 = AES.new(password,'This is an IV456')
decrypted = obj2.decrypt(denc)
# 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.show()
# ---------------------
# GUI stuff starts here
# ---------------------
# empty password aler
def pass_alert():
tkMessageBox.showinfo("Password Alert","Please enter a Valid password.")
def enc_success(imagename):
tkMessageBox.showinfo("Success","Encrypted Image: " + imagename)
# image encrypt button event
def image_open():
# useless for Now,may need later
global file_path_e
# check to see if password entry is null. if yes,alert
enc_pass = passg.get()
if enc_pass == "":
pass_alert()
else:
password = hashlib.sha256(enc_pass).digest()
filename = askopenfilename()
file_path_e = os.path.dirname(filename)
# encrypt the image
encrypt(filename,password)
# image decrypt button event
def cipher_open():
# useless for Now,may need later
global file_path_d
# check to see if password entry is null. if yes,alert
dec_pass = passg.get()
if dec_pass == "":
pass_alert()
else:
password = hashlib.sha256(dec_pass).digest()
filename = askopenfilename()
file_path_d = os.path.dirname(filename)
# decrypt the ciphertext
decrypt(filename,password)
# main gui app starts here
class App:
def __init__(self,master):
# make passg global to use in functions
global passg
# setup frontend titles etc blah blah
title = " Image Encryptor"
author = ""
msgtitle = Message(master,text=title,fg="red")
msgtitle.config(font=("Times","24","bold italic"),width=200)
msgauthor = Message(master,text=author)
msgauthor.config(font=("helvetica","15","bold"),width=200)
# draw canvas
canvas_width = 350
canvas_height = 100
w = Canvas(master,width=canvas_width,height=canvas_height)
# pack the GUI,this is basic,we shold use a grid system
msgtitle.pack()
msgauthor.pack()
w.pack()
# password field here above buttons
passlabel = Label(master,text="Enter Encryption/Decryption Password:",font=30)
passlabel.pack()
passg = Entry(master,show="*",width=50)
passg.pack()
# add both encrypt/decrypt buttons here which trigger file browsers
self.encrypt = Button(master,text="Encrypt",fg="red",font=20,command=image_open,width=20,height=2)
self.encrypt.pack(side=LEFT)
self.decrypt = Button(master,text="Decrypt",fg="blue",command=cipher_open,height=2)
self.decrypt.pack(side=RIGHT)
root = Tk()
root.wm_title("Image Encryptor")
app = App(root)
root.mainloop()
它使用旧的python软件包。请告诉我问题出在哪里,谢谢。代码中有注释,以便更好地理解。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)