用图片隐藏信息

图像如何隐藏信息


我们知道,信息加密的方式多种多样。我要介绍的是用图像对信息进行加密。
此处输入图片的描述
你能相信上面这张图里可能隐藏着信息吗?

首先,我们要了解图片的组成。一张图片,我们可以通过水平和竖直划分为许多小格,称为像素点。而每一个像素点可以用1位(0,1)、4位(0-15)、8位(0-255)、24位二进制数表示。
1位二进制只能表示0或1,即黑白两色。用4位表示则可以表示16种组合,如果把这16种组合看成颜色,就可以组成16色彩色的图像。用8位就有256种组合,可以由浅到深表达256级灰度。一幅图像可以看做像素点的个数乘以像素点的位数。现在的图像大多用24位表示即真彩色,其中8位表示红色,8位表示绿色,8位表示蓝色,即三原色。
假设一副图像只有两种颜色,红与黑,拿出一列像素点:

0 0 0 0 0 146 146 0 0

显然一个146无法隐藏信息,那么我们将它化为二进制:10010010将其从最高位到最低位竖起来写:
1 –高位
0
0
1
0
0
1
0 –低位
对于高位,把1改为0,则代表的十进制146则变成了18,差别非常大,如果反映到颜色上一眼就能看出。而至于低位,把0变为1,十进制变为147,对于颜色的改变微乎其微,肉眼很难分辨。所以,我们可以通过低位的变化隐藏一些信息。
所以这列像素可以按高低位排列:

000001100 —高位位平面
000000000
000001100
000000000
000000000
000001100
000000000 —低位位平面

我们将利用低位位平面将信息隐藏进去。
假设我要隐藏A这个字母,显然无法将A直接插进去。我们这时候可以将A也化为0-1序列。这就要用到ASCII码表。

此处输入图片的描述
其中,A可表示为01000001。接下来我们将把这个序列合并到低位位平面中。
这就需要用到二进制的运算:与,或,异或等。比如:10001111 AND 11111110,结果为10001110。这就把最后一位化为了0。同理,如果想让哪一位变成0,就让11111111中对应位改为0后进行与运算。同样的,如果想把某一位改为1,则将00000000对应位置改为1后进行或运算即可。
所以,操作过程即为:

IF 待隐藏信息的第i位为0 then
第i个像素的值=
第i个像素的值 AND 11111110
ELSE
第i个像素的值=
第i个像素的值 OR 00000001
END IF

这样,我们就把A隐藏在了图片中,而图片本身基本没有变化。所以,我们只要有原图和改变后的图就可以将信息翻译出来了。
那么下次我们看到一幅图的时候,它后面是否隐藏着某些信息呢?

Python可以用于将信息隐藏图片中,这被称为“隐写术”。以下是一种将文本信息隐藏图片中的方法: 1. 打开图片文件并读取其像素值。 2. 将文本信息转换为二进制形式。 3. 将二进制文本信息分配给像素值中的RGB通道。 4. 保存修改后的像素值并将其写入新的图片文件中。 以下是一个简单的Python代码示例: ```python from PIL import Image def hide_text_in_image(image_path, secret_message): # Open the image file image = Image.open(image_path) # Convert the secret message to binary binary_secret_message = ''.join(format(ord(x), '08b') for x in secret_message) # Get the pixel values of the image pixels = list(image.getdata()) # Loop through the pixel values and assign the binary secret message to the RGB channels new_pixels = [] secret_message_index = 0 for pixel in pixels: # If we've assigned all of the secret message, just add the original pixel value if secret_message_index >= len(binary_secret_message): new_pixels.append(pixel) continue # Assign the secret message to the R, G, and B channels r, g, b = pixel new_r = format(r, '08b')[:-2] + binary_secret_message[secret_message_index] new_g = format(g, '08b')[:-2] + binary_secret_message[secret_message_index+1] new_b = format(b, '08b')[:-2] + binary_secret_message[secret_message_index+2] new_pixel = (int(new_r, 2), int(new_g, 2), int(new_b, 2)) new_pixels.append(new_pixel) secret_message_index += 3 # Create a new image with the modified pixel values new_image = Image.new(image.mode, image.size) new_image.putdata(new_pixels) # Save the new image with the secret message hidden in it new_image.save('hidden_message.png') ``` 此代码将在指定的图像文件中隐藏指定的文本消息,并将结果保存到名为“hidden_message.png”的新文件中。要提取隐藏的消息,可以使用类似的方法读取像素值,并提取文本消息的二进制表示形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值