本项目是一个图像加密工具,可以将文本信息嵌入到图像中,实现文本的隐藏和保密传输。通过使用最低有效位(LSB)算法,将文本的ASCII码转换为二进制,并将二进制数据嵌入到图像的像素中。
加密
#图像加密
import cv2
def DECtoBIN(DEC:int): #十进制转二进制
m=''
while DEC>0:
m+=str(DEC%2)
DEC=DEC//2
BIN= (m[::-1])
return BIN
def BINtoDEC(BIN:int): #二进制转十进制
BIN=str(BIN)
DEC=0
for i in range(len(BIN)):
DEC+=eval(BIN[i]) * pow(2,len(BIN)-i-1)
return DEC
def createImage(path:str): #创建图像
global image
image = cv2.imread(path)
return image
def textEncryption(path,image): #获取文本并将文本转换为ascii码,为了方便转换,采取每9位即3个像素储存一个字符的ascii码
f = open(path,'rt')
getText = f.read()
f.close()
textlen = len(getText)
pixel = 3*textlen #计算图片能否储存待加密文本
line = image.shape[0]
row = image.shape[1]
if line * row < pixel:
print("文本过长,无法在此图片中加密,请缩短文本:")
return False
else:
global ascii
ascii = []
for i in getText: #读取每一个字符
Dascii = ord(i)
Bascii = bin(Dascii)
while (len(Bascii) < 9): #不够9位的加0补齐
ls = list(Bascii)
ls.insert(2,'0')
Bascii=''.join(ls)
ascii += [Bascii]
return len(ascii)
def LSBprocess(i,j,byte,num,length): #加密算法
bgr = image[i,j]
for color in range(3): #color每3次一循环,对应每个像素的rgb3个通道
if byte == 0:
num +=1
if num >=length: #num为已储存字符,大于字符长度length后,退出函数
return -1,-1
dec = bgr[color]
bin = DECtoBIN(dec)
if byte ==0 or byte == 1:
byte = (byte+1)%9
else:
if bin[-1] == '0': #如果像素最后一位是0,则直接加字符的ascii码
bin = int(bin) + eval(ascii[num][byte])
else: ##如果像素最后一位是1,则先-1再加字符的ascii码
bin = int(bin) + eval(ascii[num][byte]) - 1
byte = (byte+1)%9
image[i,j,color] = BINtoDEC(bin)
return byte,num
def imageEncode(length): #每次执行时判断falg,若已加密完,则flag=0,退出函数
byte = 0
num = -1
flag = 1
for i in range(image.shape[0]):
if flag:
for j in range(image.shape[1]):
if flag:
byte,num = LSBprocess(i,j,byte,num,length)
if byte==-1 and num==-1:
flag = 0
output_path = 'encrypted_image.png' # 设置导出路径和文件名
cv2.imwrite(output_path, image) # 将加密后的图像保存到文件
print("加密后的图像已成功导出为:", output_path)
image = createImage('encode_image.png') #创建对象
length = textEncryption("encode_text.txt",image) #读取文本
imageEncode(length)
图片路径为encode_image.png,加密的文本路径为encode_text.txt,加密后的文件为encrypted_image.png
解密
import cv2
def DECtoBIN(DEC:int): #十进制转二进制
m=''
while DEC>0:
m+=str(DEC%2)
DEC=DEC//2
BIN= (m[::-1])
return BIN
def BINtoDEC(BIN:int): #二进制转十进制
BIN=str(BIN)
DEC=0
for i in range(len(BIN)):
DEC+=eval(BIN[i]) * pow(2,len(BIN)-i-1)
return DEC
def imageDecode(image): #解密函数
global decodeText #储存解密后的字符
decodeText = []
binchar=''
byte = 0
num = -1
for i in range(image.shape[0]): #遍历图片的每一个像素
for j in range(image.shape[1]):
bgr = image[i,j]
for color in range(3): #color为每个像素的rgb三个通道
dec = bgr[color]
bin = DECtoBIN(dec) #转换为二进制
if byte ==0: #每9位为一个字符
if num != -1: #num统计读取的字符长度
decodeText.append(binchar)
binchar=''
num +=1
byte = (byte+1)%9 #byte每9次一循环
elif byte ==1:
byte = (byte+1)%9
else:
binchar += bin[-1]
byte = (byte+1)%9
decodeText.append(binchar)
f = open('message.txt','wt') #向文件写入解密后的文本
for char in decodeText:
char = chr(int(char,base = 2))
f.write(char)
f.close()
print("解密成功")
image = cv2.imread('encrypted_image.png') #打开图片
imageDecode(image)