期末要做的题目,利用真彩色BMP图片携带保密信息,有人能给点提示吗?
题目是这样的
题目:利用真彩色BMP图片携带保密信息
功能:在不破坏图片视觉效果的前提下,在图片中插入保密信息。
基本要求:
1.程序类型为控制台应用程序。
2.设计简单的菜单,能够进行系统功能选择。
3.不破坏原图片的视觉效果。
4.嵌入保密信息到图片中。
5.从图片中读取保密信息。
功能扩充:
1.自行扩充。
提示:
真彩色BMP图片是一种位图,如实的记载了图片中的每一个点的颜色信息,每一个点的颜色由红(R)、绿(G)、蓝(B)三色混合合成。真彩色模式下每个颜色分量的取值范围是0到255,值越大,此分量的颜色越深,值越小,此分量的颜色越浅。由于人眼对颜色的深浅程度不是很敏感,因此可以把颜色分量的最低位用来保存保密信息中的一个二进制位。
我在百度上搜不到相关的资料,没有一点头绪,有人能给点提示吗?
我的思路是这样的
假设要加密的文件的二进制信息是:
101011010010111010001100 共24个数据要加密
BMP图的数据的结构是这样的
第一个像素 红(00000001)绿(00000010)蓝(00000011)
第二个像素 红(00000001)绿(00000010)蓝(00000011)
第三个像素 红(00000100)绿(00000101)蓝(00000110)
第四个像素 红(00000111)绿(00001000)蓝(00001001)
第五个像素 红(00001010)绿(00001011)蓝(00001100)
第六个像素 红(00001101)绿(00001110)蓝(00001111)
第七个像素 红(00010000)绿(00010001)蓝(00010010)
第八个像素 红(00010011)绿(00010100)蓝(00010101)
这8个像素有24个(24Byte)(192bit)数据单元构成
根据题目中"人眼对颜色的深浅程度不是很敏感",因此可以把这24个数据的最后一位,与要加密的数据对比,如果相同,则进行下一位;如果不同,则更改对应像素数据单元中的最后一个数据位为相反的值.
因此,更改后的图片的数据是这样的
第一个像素 红(00000001)绿(00000010)蓝(00000011)
第二个像素 红(00000000)绿(00000011)蓝(00000011)
第三个像素 红(00000100)绿(00000101)蓝(00000110)
第四个像素 红(00000110)绿(00001001)蓝(00001000)
第五个像素 红(00001011)绿(00001011)蓝(00001101)
第六个像素 红(00001100)绿(00001111)蓝(00001110)
第七个像素 红(00010000)绿(00010000)蓝(00010011)
第八个像素 红(00010011)绿(00010100)蓝(00010100)
解密时,以二进制方式打开BMP图片,读取第8,16,24,32....192位的数据,将其写入到新创建的一个文件中,就完成了数据的解密.
上面是大致的思路,但是,我对各种语句,关键字的用法几乎都不了解,所以没法写出程序
伪代码:
open file as binary(要加密的文件.txt)
获取文件长度函数(要加密的文件.txt)
得到长度为filelong=8
定义一个长度为fiellong的数组
for(i=1;i小于=filelong;i++)
{
数组[i]=读取要加密的文件二进制数据();
}
以二进制打开要处理的BMP图片文件;
判断图片文件的长度是否小于filelong*8
如果小于,则显示bmp文件容量不够,请更换...等内容,退出或执行其它步骤
如果大于则继续;
复制要处理的BMP图片文件到临时文件夹(防止原图被覆盖)
for(j=8;j小于fiellong*8;j=j+8)
{
databmp=读取BMP文件数据(j);
if(databmp不等于数组(j/8))
{
要写入的数据=数组(j/8);
写入文件函数(参数为:文件名,文件数据的位数,要写入的数据);
}
}
更改文件名为"已加密.bmp"
将复制到临时文件夹的BMP复制回原处
大家看看思路对吗?代码我是一点都不会,只有一点一点的搞了