我创建了一个程序,通过弄乱文件中每个字节的最后一位来在PPM文件中嵌入一条消息。我现在遇到的问题是我不知道我是否正在检查消息是否太长或不正确。这是我到目前为止所得到的:
int hide_message(const char *input_file_name, const char *message, const char *output_file_name)
{
unsigned char * data;
int n;
int width;
int height;
int max_color;
//n = 3 * width * height;
int code = load_ppm_image(input_file_name, &data, &n, &width, &height, &max_color);
if (code)
{
// return the appropriate error message if the image doesn't load correctly
return code;
}
int len_message;
int count = 0;
unsigned char letter;
// get the length of the message to be hidden
len_message = (int)strlen(message);
if (len_message > n/3)
{
fprintf(stderr, "The message is longer than the image can support\n");
return 4;
}
for(int j = 0; j < len_message; j++)
{
letter = message[j];
int mask = 0x80;
// loop through each byte
for(int k = 0; k < 8; k++)
{
if((letter & mask) == 0)
{
//set right most bit to 0
data[count] = 0xfe & data[count];
}
else
{
//set right most bit to 1
data[count] = 0x01 | data[count];
}
// shift the mask
mask = mask>>1 ;
count++;
}
}
// create the null character at the end of the message (00000000)
for(int b = 0; b < 8; b++){
data[count] = 0xfe & data[count];
count++;
}
// write a new image file with the message hidden in it
int code2 = write_ppm_image(output_file_name, data, n, width, height, max_color);
if (code2)
{
// return the appropriate error message if the image doesn't load correctly
return code2;
}
return 0;
}
所以我正在检查消息的长度(len_message)是否比n / 3长,这与width * height相同。这看起来是否正确?
答案 0 :(得分:3)
您当前正在进行的检查是检查消息是否包含比图像具有像素更多的字节。因为您只使用每像素1位来对消息进行编码,所以您需要检查消息是否包含比消息包含像素更多的位。
所以你需要这样做:
if (len_message*8 > n/3)
答案 1 :(得分:1)
除了@dbush关于检查邮件中位数的注释之外,您似乎没有考虑图像中可用的所有字节。正常(“原始”,P6格式)PPM图像每个像素使用三个颜色样本,每个样本8或16位。因此,图像包含至少3 * width * height
个字节的颜色数据,可能多达6 * width * height
。
另一方面,隐身医疗的目的是使隐藏信息的存在难以检测。为了实现该目标,如果每个样本有一个16位的PPM,那么您可能希望避免修改样本中更重要的字节。或者如果您不关心这一点,那么在这种情况下您也可以使用每个样本的整个低位字节。
此外,PPM文件记录任何样本的最大可能值,该值不必与基础类型的最大值相同。您的技术可能会将实际最大值更改为大于记录的最大值,如果不这样做,则更改最大值字段,然后不一致可能是文件被篡改的提示
此外,原始PPM格式提供了在一个文件中具有相同大小的多个图像的可能性。文件头不表示有多少,所以你必须查看要告诉的文件大小。您可以使用文件中每个图像的字节来隐藏您的消息。