在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;
}