public void EncryptFile()
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|All files (*.*)|*.*";
dialog.InitialDirectory = @"C:\";
dialog.Title = "Please select an image file to encrypt.";
if (dialog.ShowDialog() == DialogResult.OK)
{
byte[] ImageBytes = File.ReadAllBytes(dialog.FileName);
foreach (byte X in ImageBytes)
{
//How can I take byte "X" and add a numerical value to it?
}
}
}
所以,我试图通过将图像文件转换为byte []数组然后为每个字节添加一个数值来加密图像文件。
如何将数值添加到字节?
答案 0 :(得分:2)
你只需添加它。问题是你不能修改foreach循环中的值。你真的想要一个for循环:
for(int k = 0; k < ImagesBytes.Length; k++){
ImageBytes[k] = (byte) (ImageBytes[k] + 5); // needs a cast
}
答案 1 :(得分:0)
byte
是一种值类型,这意味着它总是在返回时被复制。因此,您只能在foreach
内的本地字节值中添加一个值,就像更改函数内byte
参数的值一样,不会更改函数外的值(除非,当然,您使用了ref
关键字)。
您无法使用foreach
执行此任务。使用常规for
循环:
for(int i = 0; i < ImageBytes.Length; i++)
ImageBytes[i] += MyNumericValue;
答案 2 :(得分:0)
您需要使用 modulo (特别是模256),这样操作才是可逆的。或者,您可以使用按位运算,XOR是一种常见的选择。
模数256操作很容易实现字节,你只需要转换结果,如:
ImageBytes[k] = (unsigned byte) ((unsigned byte) ImageBytes[k] + x)
请注意,这种“加密”相当薄弱。提高这种加密强度的一种方法是为每个字节添加一个不同的值,例如通过在循环缓冲器中取加值(即最终重复自身的序列)。一种更好的方法,仍然可以使用容易解码的值作为操作数的一部分。
答案 3 :(得分:0)
问题:为什么不在.NET中使用其中一个内置的加密流?
如果您不想这样做,假设您想要在隐藏它的位之后以某种方式使用图像,我会看一下自定义流类,只修改字节是进来。
这里有一个很好的结束步行Custom Transform Streams(旋转流将是解决模糊图像文件问题的更快捷方式)。这也消除了添加到字节的溢出问题。