Давайте рассмотрим пример кода на C# для шифрования текстовых данных в изображение и последующей дешифрации. Этот процесс называется стеганографией, и он позволяет скрывать данные внутри изображения.
Этот пример будет очень простым и базируется на изменении младших битов (LSB) пикселей изображения для хранения каждого бита исходного текста.
Для начала нам нужно будет добавить библиотеку `System.Drawing` в наш проект для работы с изображениями:
```csharp
using System;
using System.Drawing; // нужно добавить ссылку на System.Drawing в проекте
using System.Text;
class SteganographyExample
{
// Встраивание текста в изображение
public static Bitmap EmbedText(string text, Bitmap bmp)
{
State state = State.Hiding;
int charIndex = 0;
int charValue = 0;
long pixelElementIndex = 0;
int zeros = 0;
int R = 0, G = 0, B = 0;
for (int i = 0; i < bmp.Height; i++)
{
for (int j = 0; j < bmp.Width; j++)
{
Color pixel = bmp.GetPixel(j, i);
R = pixel.R - pixel.R % 2;
G = pixel.G - pixel.G % 2;
B = pixel.B - pixel.B % 2;
for (int n = 0; n < 3; n++)
{
if (pixelElementIndex % 8 == 0)
{
if (state == State.Filling_With_Zeros && zeros == 8)
{
if ((pixelElementIndex - 1) % 3 < 2)
{
bmp.SetPixel(j, i, Color.FromArgb(R, G, B));
}
return bmp;
}
if (charIndex >= text.Length)
{
state = State.Filling_With_Zeros;
}
else
{
charValue = text[charIndex++];
}
}
switch (pixelElementIndex % 3)
{
case 0:
{
if (state == State.Hiding)
{
R += charValue % 2;
charValue /= 2;
}
} break;
case 1:
{
if (state == State.Hiding)
{
G += charValue % 2;
charValue /= 2;
}
} break;
case 2:
{
if (state == State.Hiding)
{
B += charValue % 2;
charValue /= 2;
}
bmp.SetPixel(j, i, Color.FromArgb(R, G, B));
} break;
}
pixelElementIndex++;
if (state == State.Filling_With_Zeros)
{
zeros++;
}
}
}
}
return bmp;
}
// Извлечение текста из изображения
public static string ExtractText(Bitmap bmp)
{
int colorUnitIndex = 0;
int charValue = 0;
string extractedText = String.Empty;
for (int i = 0; i < bmp.Height; i++)
{
for (int j = 0; j < bmp.Width; j++)
{
Color pixel = bmp.GetPixel(j, i);
for (int n = 0; n < 3; n++)
{
switch (colorUnitIndex % 3)
{
case 0:
{
charValue = charValue * 2 + pixel.R % 2;
} break;
case 1:
{
charValue = charValue * 2 + pixel.G % 2;
} break;
case 2:
{
charValue = charValue * 2 + pixel.B % 2;
} break;
}
colorUnitIndex++;
if (colorUnitIndex % 8 == 0)
{
charValue = reverseBits(charValue);
if (charValue == 0)
{
return extractedText;
}
char c = (char)charValue;
extractedText += c.ToString();
}
}
}
}
return extractedText;
}
public static int reverseBits(int n)
{
int result