将长度为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。
任何帮助或代码片段将不胜感激。
这是您想要的。说明在底部。
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
的含义。
(pixel.B ^ (lsb << 1)
中进行了总结。
我选择在蓝色通道中嵌入信息,但请随意更改。请记住,如果你在alpha通道中进行嵌入,你需要将图像保存为支持透明的格式,例如png。同样,由于你处理的是直接的像素修改,你不能将你的图像保存为有损格式,例如jpeg,因为压缩会修改一些像素,可能会破坏你的信息。