Расшифровка изображения низкого качества из зашифрованного изображения, даже если я сохраняю 8 бит серой шкалы
Я занимаюсь стеганографией изображений У меня есть 2 изображения одинакового размера, я сохраняю 2-е изображение как шкалу серого на первом изображении. я сохраняю полные 8 бит серого изображения, но на момент извлечения полученное изображение имеет очень низкое качество.. вот мой код
шифрование
for (int i = 0; i < simple.Height; i++)
{
for (int j = 0; j < simple.Width; j++)
{
pixelToHide = secretGreyScale.GetPixel(j, i);
BitsToHide = getBytes(pixelToHide.R);
pixelForHiding = simple.GetPixel(j, i);
AlphaBits = getBytes(pixelForHiding.A);
RedBits = getBytes(pixelForHiding.R);
GreenBits = getBytes(pixelForHiding.G);
BlueBits = getBytes(pixelForHiding.B);
AlphaBits[6] = BitsToHide[0];
AlphaBits[7] = BitsToHide[1];
RedBits[6] = BitsToHide[2];
RedBits[7] = BitsToHide[3];
GreenBits[6] = BitsToHide[4];
GreenBits[7] = BitsToHide[5];
BlueBits[6] = BitsToHide[6];
BlueBits[7] = BitsToHide[7];
newAlpha = getInt(AlphaBits);
newRed = getInt(RedBits);
newGreen = getInt(GreenBits);
newBlue = getInt(BlueBits);
simple.SetPixel(j, i, Color.FromArgb(newAlpha, newRed, newGreen, newBlue));
}
}
Дешифрирование
for (int i = 0; i < EncryptedImage.Height; i++)
{
for (int j = 0; j < EncryptedImage.Width; j++)
{
pixelToDecrypt = EncryptedImage.GetPixel(j, i);
AlphaBits = getBytes(pixelToDecrypt.A);
RedBits = getBytes(pixelToDecrypt.R);
GreenBits = getBytes(pixelToDecrypt.G);
BlueBits = getBytes(pixelToDecrypt.B);
BitsToDecrypt[0] = AlphaBits[6];
BitsToDecrypt[1] = AlphaBits[7];
BitsToDecrypt[2] = RedBits[6];
BitsToDecrypt[3] = RedBits[7];
BitsToDecrypt[4] = GreenBits[6];
BitsToDecrypt[5] = GreenBits[7];
BitsToDecrypt[6] = BlueBits[6];
BitsToDecrypt[7] = BlueBits[7];
newGrey = getInt(BitsToDecrypt);
hiddenImage.SetPixel(j, i, Color.FromArgb(newGrey, newGrey, newGrey));
}
}
getBytes - это функция, которая конвертирует int в биты, а getint делает наоборот. PixelToHide и PixelForHiding - это тип Color. Простое - это изображение, в котором мне нужно скрыть изображение SecretFreyScale.
1 ответ
Немного трудно понять, что происходит в вашем коде, поскольку вы не показываете подфункции, поэтому я попытаюсь ответить с помощью общего подхода -
Просто для заказов: Для шифрования вам нужно уменьшить изображение, которое вы хотите скрыть (псевдокод, предполагающий архитектуру процессора LSB/little-endian):
((secretByte AND 00000011) << 6) OR (publicByte AND 00111111)
(<<
= битовое смещение влево)
Это оставляет вас с изображением 2 бит или 4 цвета в нижней части, в то время как видимое изображение будет находиться в верхних 6 битах.
Это создаст низкокачественное (2-битное) изображение по самой природе метода. Более двух битов могут сделать "скрытое" изображение видимым. Есть компромисс, который нужно сделать.
Теперь, когда вы хотите расшифровать это, вы должны сделать это другим способом, избавиться от битов для публичного изображения (не очень необходимо, так как они будут перенесены сюда, но чтобы было более понятно, что происходит, я буду включите его), а затем уменьшите масштаб до 2 бит:
(imageByte AND 11000000) >> 6
Если вы не масштабируете значение, максимальное значение будет максимум 4 (из 255), что, конечно, будет очень слабым.
Если вы не хотите делать сдвиг битов, вы всегда можете вместо этого делить и умножать, но вам понадобятся битовые маски:
Enc: ((secretByte / 64) AND 11000000) OR (publicByte AND 00111111)
Dec: (imageByte AND 11000000) * 64