我必须使用MIPS火星模拟器进行隐写术程序。但是我在如何编码图像以及如何将消息(字符串)放入图像时遇到问题。此外,图像必须为BMP格式并以24位编码(红色为8位,红色为8位)蓝色代表8位,绿色代表8位)。 因此,如果有人可以通过向我展示代码或告诉我如何操作来帮助我,我将不胜感激。
更新:这是我设法做到的。现在的问题是如何将字符串转换为二进制并在图像中编码
angular.extend
答案 0 :(得分:0)
。幸运的是,.BMP file format并不复杂。
考虑到您的操作水平很低,我建议(如果安全性不是一个大问题)mask将每个像素的最后一位Shift Logical Right放入数据中。只需跳过数据头直接进入图像数据,然后开始将每种RGB颜色的最低有效位更改为嵌入消息的下一位。请注意,BMP格式中存在一些填充,因此最好保留一个计数器,以了解当前行中已被屏蔽的字节数,以免影响填充0。此方法要求数据大小的比率为8/1。
此外,您可以在MIPS中使用{{3}}循环来确定要嵌入到图像中的目标位。用数字1 and $bitToEmbed, $yourMessageByte, 1
屏蔽每个循环迭代,以确定要嵌入的位,并在8次迭代(每个字节8位)后移至下一个字节。
单个屏蔽操作可能看起来像(当然必须替换实际的寄存器名称):
and $bitToEmbed, $yourMessageByte, 1 #Get Target Bit to embed
and $RGBByte, $RGBByte, 254 #Mask the RGB Byte with 11111110
or $RGBByte, $bitToEmbed, $RGBByte #Embed your target bit.
添加一些迭代以遍历单个完整的消息字节:
#Jump Past Header...
#Create all temporary versions of your image and message...
#Begin data processing:
ITERBYTE:
and $bitToEmbed, $yourMessageByte, 1 #Get Target Bit to embed
and $RGBByte, $RGBByte, 254 #Mask the RGB Byte with 11111110
or $RGBByte, $bitToEmbed, $RGBByte #Embed your target bit.
srl $yourMessageByte, $yourMessageByte, 1 #Bitshift right by one...
addi $counter, $counter, 1 #Increment counter
bne $counter, $BitsInByte, ITERBYTE #continue loop if we have not read the whole byte
此方法的安全性取决于大多数人无法分辨出相同颜色略有不同的阴影之间的区别。 (您能告诉我这段文字是#000000
还是#000001
)吗?
但是,请注意,有一些方法可以检测这种速记技术,因为它不是很复杂。通常,它涉及计算机扫描图像的平均噪声或将现有图像与其修改后的图像进行比较。但是,如果您只需要一些人类无法检测(或可读)的东西,那么这是一个很好的解决方案。