在Image中实现AES加密
Implement AES encryption in Image
if (i < 1 && j < textBox3.TextLength)
{
char letter = Convert.ToChar(textBox3.Text.Substring(j, 1));
// int value = Convert.ToInt32(letter);
//Encryption Mechanism here
AesCryptoServiceProvider aesCSP = new AesCryptoServiceProvider();
int quote = Convert.ToInt32(textBox3.Text);
string quote1 = Convert.ToString(quote) + 12;
aesCSP.GenerateKey();
aesCSP.GenerateIV();
byte[] encQuote = EncryptString(aesCSP, quote1);
string enc = Convert.ToBase64String(encQuote);
int nerd = Convert.ToInt32(enc);
img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, nerd));
}
我在这里尝试对我想从用户输入的字符串实施 AES 加密,然后将这些加密值存储在整数数组中。我的问题是,即使在将字符串转换为 int 变量后也很困难,我无法将该 int 值放入 setpixel() 方法中。
Color.FromArgb( int alpha, int red, int green, int blue)
的 documentation 状态:
Although this method allows a 32-bit value to be passed for each
component, the value of each component is limited to 8 bits.
当你 运行 你的代码时,你没有说明 nerd
的值是什么,你也没有真正说明问题是什么,但这是一个常见的问题使用此方法的人不了解存在此限制。
检查您的代码,调试并在对 Color.FromArgb
的调用处放置一个断点,并注意此限制。
编辑:
首先,定义加密和解密字符串的方法。这里有一个很好的例子:
这些方法将return仅由ASCII字符组成的Base64字符串,其值可以转换为0到127之间的数字,对RGB值(0到255)有效。
然后,
要将加密字符串的字符混合到颜色值中:
public void MixStringIntoImage(String s, Bitmap img)
{
int i, x, y;
i = 0;
x = 0;
y = 0;
while(i<s.Length)
{
Color pixelColor = img.GetPixel(x, y);
pixelColor = Color.FromArgb(pixelColor.R, pixelColor.G, (int)s[i]); //Here you mix the blue component of the color with the character value
img.SetPixel(x, y, pixelColor);
i++;
x++;
if(x == img.Width)
{
x = 0;
y++;
if(y == img.Height) throw new Exception("String is too long for this image!!!");
}
}
}
从图像中获取加密字符串:
public String GetStringFromMixedImage(int stringLength, Bitmap img)
{
String s = "";
int i, x, y;
i = 0;
x = 0;
y = 0;
while(i<stringLength)
{
s = s + (char)(img.GetPixel(x,y).B); //Get the blue component from the pixel color and then cast to char
i++;
x++;
if(x == img.Width)
{
x = 0;
y++;
if(y == img.Height) throw new Exception("String is too long for this image!!!");
}
}
return s;
}
if (i < 1 && j < textBox3.TextLength)
{
char letter = Convert.ToChar(textBox3.Text.Substring(j, 1));
// int value = Convert.ToInt32(letter);
//Encryption Mechanism here
AesCryptoServiceProvider aesCSP = new AesCryptoServiceProvider();
int quote = Convert.ToInt32(textBox3.Text);
string quote1 = Convert.ToString(quote) + 12;
aesCSP.GenerateKey();
aesCSP.GenerateIV();
byte[] encQuote = EncryptString(aesCSP, quote1);
string enc = Convert.ToBase64String(encQuote);
int nerd = Convert.ToInt32(enc);
img.SetPixel(i, j, Color.FromArgb(pixel.R, pixel.G, nerd));
}
我在这里尝试对我想从用户输入的字符串实施 AES 加密,然后将这些加密值存储在整数数组中。我的问题是,即使在将字符串转换为 int 变量后也很困难,我无法将该 int 值放入 setpixel() 方法中。
Color.FromArgb( int alpha, int red, int green, int blue)
的 documentation 状态:
Although this method allows a 32-bit value to be passed for each component, the value of each component is limited to 8 bits.
当你 运行 你的代码时,你没有说明 nerd
的值是什么,你也没有真正说明问题是什么,但这是一个常见的问题使用此方法的人不了解存在此限制。
检查您的代码,调试并在对 Color.FromArgb
的调用处放置一个断点,并注意此限制。
编辑:
首先,定义加密和解密字符串的方法。这里有一个很好的例子:
这些方法将return仅由ASCII字符组成的Base64字符串,其值可以转换为0到127之间的数字,对RGB值(0到255)有效。
然后,
要将加密字符串的字符混合到颜色值中:
public void MixStringIntoImage(String s, Bitmap img)
{
int i, x, y;
i = 0;
x = 0;
y = 0;
while(i<s.Length)
{
Color pixelColor = img.GetPixel(x, y);
pixelColor = Color.FromArgb(pixelColor.R, pixelColor.G, (int)s[i]); //Here you mix the blue component of the color with the character value
img.SetPixel(x, y, pixelColor);
i++;
x++;
if(x == img.Width)
{
x = 0;
y++;
if(y == img.Height) throw new Exception("String is too long for this image!!!");
}
}
}
从图像中获取加密字符串:
public String GetStringFromMixedImage(int stringLength, Bitmap img)
{
String s = "";
int i, x, y;
i = 0;
x = 0;
y = 0;
while(i<stringLength)
{
s = s + (char)(img.GetPixel(x,y).B); //Get the blue component from the pixel color and then cast to char
i++;
x++;
if(x == img.Width)
{
x = 0;
y++;
if(y == img.Height) throw new Exception("String is too long for this image!!!");
}
}
return s;
}