C 确定消息是否太长,无法嵌入到图像中

C 确定消息是否太长,无法嵌入到图像中,c,steganography,ppm,C,Steganography,Ppm,我创建了一个程序,通过弄乱文件中每个字节的最后一位,将消息嵌入到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 heig

我创建了一个程序,通过弄乱文件中每个字节的最后一位,将消息嵌入到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;
}
int隐藏消息(常量字符*输入文件名,常量字符*消息,常量字符*输出文件名)
{
无符号字符*数据;
int n;
整数宽度;
内部高度;
int max_颜色;
//n=3*宽*高;
int code=load\u ppm\u图像(输入文件名、数据、n、宽度、高度和最大颜色);
if(代码)
{
//如果图像加载不正确,则返回相应的错误消息
返回码;
}
int len_消息;
整数计数=0;
无符号字符;
//获取要隐藏的消息的长度
len_message=(int)strlen(message);
如果(len_消息>n/3)
{
fprintf(stderr,“消息的长度超过了映像所能支持的长度\n”);
返回4;
}
对于(int j=0;j>1;
计数++;
}
}
//在消息末尾创建空字符(00000000)
对于(int b=0;b<8;b++){
数据[计数]=0xfe&数据[计数];
计数++;
}
//编写一个新的图像文件,其中隐藏消息
int code2=写入ppm图像(输出文件名、数据、n、宽度、高度、最大颜色);
if(代码2)
{
//如果图像加载不正确,则返回相应的错误消息
返回代码2;
}
返回0;
}

所以我检查消息的长度(len_消息)是否比n/3长,这与width*height是一样的。这似乎正确吗?

您当前正在进行的检查是检查消息的字节数是否超过图像的像素数。因为每像素仅使用1位对消息进行编码,所以需要检查消息的位是否比消息的像素多

因此,您需要这样做:

if (len_message*8 > n/3)

您当前正在进行的检查是检查消息的字节数是否大于图像的像素数。因为每像素仅使用1位对消息进行编码,所以需要检查消息的位是否比消息的像素多

因此,您需要这样做:

if (len_message*8 > n/3)

除了@dbush关于检查消息中的位数的评论之外,您似乎没有考虑图像中所有可用的字节。普通(“原始”,P6格式)PPM图像每像素使用三个颜色样本,每个样本8或16位。因此,图像包含至少
3*width*height
字节的颜色数据,并且可能多达
6*width*height

另一方面,隐写术的目的是使隐藏消息的存在难以检测。为了实现这一目标,如果您有一个每个样本16位的PPM,那么您可能希望避免修改样本中更重要的字节。或者,如果您不关心这个问题,那么在这种情况下,您最好使用每个示例的整个低阶字节

此外,PPM文件记录任何样本的最大可能值,不需要与基础类型的最大值相同。您的技术可以将实际最大值更改为大于记录的最大值,如果不更改最大值字段,则不一致可能是文件已被篡改的提示


此外,原始PPM格式允许在一个文件中包含多个相同大小的图像。文件头不表示有多少个,因此您必须查看文件大小才能知道。您可以使用文件中每个图像的字节来隐藏消息。

除了@dbush关于检查消息中的位数的注释外,您似乎没有考虑图像中所有可用的字节。普通(“原始”,P6格式)PPM图像每像素使用三个颜色样本,每个样本8或16位。因此,图像包含至少
3*width*height
字节的颜色数据,并且可能多达
6*width*height

另一方面,隐写术的目的是使隐藏消息的存在难以检测。为了实现这一目标,如果您有一个每个样本16位的PPM,那么您可能希望避免修改样本中更重要的字节。或者,如果您不关心这个问题,那么在这种情况下,您最好使用每个示例的整个低阶字节

此外,PPM文件记录任何样本的最大可能值,不需要与基础类型的最大值相同。您的技术可以将实际最大值更改为大于记录的最大值,如果不更改最大值字段,则不一致可能是文件已被篡改的提示


此外,原始PPM格式允许在一个文件中包含多个相同大小的图像。文件头不表示有多少个,因此您必须查看文件大小才能知道。您可以使用文件中每个图像的字节来隐藏您的消息。

什么使您认为您的支票不正确?字节中有8位
if(len_message>n/3)
检查消息的整个长度是否比le长