LSB图像隐写

 本项目是一个图像加密工具,可以将文本信息嵌入到图像中,实现文本的隐藏和保密传输。通过使用最低有效位(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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值