将长度为n的密文与图像的第二个LSB进行交互

本文关键字:第二个 LSB 交互 图像 密文 | 更新日期: 2023-09-27 17:49:30

我有一个长度为n的密文,我想将这个密文的每一位与图像中字节的第二个LSB进行异或,并将结果放在图像中相同字节的LSB中。

我想继续这个操作,直到密文结束。

我读取图像到一个字节数组如下:

     string cipherText = "some cipher text";
     string address = this.picBoxOriginalImg.ImageLocation;
     byte[] array = File.ReadAllBytes(address);
     //this line gives me the list of all bits separated by a comma(just for visualization of the results for myself)
     this.txtBoxTestByte.Text = string.Join(",", array.Select(b => Convert.ToString(b,2).ToUpper()));

但是从这里开始,我无法想出一个解决方案来XOR cipherText的位与我的图像字节的第二个LSB,并将结果替换为相同字节的LSB。

任何帮助或代码片段将不胜感激。

将长度为n的密文与图像的第二个LSB进行交互

这是您想要的。说明在底部。

static Bitmap Embed(string fname, string message)
{
    Bitmap img = new Bitmap(fname);
    byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(message);
    int nbytes = msgBytes.Length;
    int ibit = 7;
    int ibyte = 0;
    byte currentByte = msgBytes[ibyte];
    for (int i = 0; i < img.Height; i++)
    {
        for (int j = 0; j < img.Width; j++)
        {
            Color pixel = img.GetPixel(i, j);
            int lsb = (msgBytes[ibyte] >> ibit) & 1;
            Color newpixel = Color.FromArgb(pixel.A, pixel.R, pixel.G, pixel.B ^ (lsb << 1));
            img.SetPixel(i, j, newpixel);
            ibit--;
            if (ibit == -1)
            {
                ibit = 7;
                ibyte++;
                if (ibyte == nbytes)
                {
                    return img;
                }
                currentByte = msgBytes[ibyte];
            }
        }
    }
    return img;
}

ibyte - ibit组合迭代您的字节,对于每个字节,它从最高有效位提取到最低有效位。

位提取使用按位的SHIFT和and操作完成。简单地说,右移将感兴趣的位移到最不重要的位置,而and操作掩盖了其他所有位。剩下的是0或1,这取决于你感兴趣的位的值。这就是int lsb = msgBytes[ibyte] >> ibit) & 1的含义。

同样,对于嵌入,左移将您的位移到第二个lsb位置,因此您要么得到00000000,要么得到00000010。用0对某个数进行XORing会返回相同的数,所以你不必担心其他7位的值是什么。你可以在上面用一个像素进行异或。所有这些都在(pixel.B ^ (lsb << 1)中进行了总结。

我选择在蓝色通道中嵌入信息,但请随意更改。请记住,如果你在alpha通道中进行嵌入,你需要将图像保存为支持透明的格式,例如png。同样,由于你处理的是直接的像素修改,你不能将你的图像保存为有损格式,例如jpeg,因为压缩会修改一些像素,可能会破坏你的信息。