2

我对 C# 还很陌生,并且收到了这个关于图像的 AES 加密项目。我可能在这里遗漏了一件非常简单的事情。我正在尝试从 bmp 中删除标头并加密其余部分,然后重新添加标头。如果我不删除标题,程序运行良好。要删除,我试过这个(bmp 标头是 54 字节):

MyImage = new Bitmap("path");
MemoryStream ms = new MemoryStream();

MyImage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

byte[] Header=null, picture=null, pictureFull = ms.ToArray();


for (int i = 0; i < pictureFull.Length; i++)
{
    if (i < 54)
    { Header[i] = pictureFull[i]; }
    else 
    { picture[i - 54] = pictureFull[i]; }
}


byte[] demoKeyBytes = new byte[] {  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

PaddingMode padding = PaddingMode.ISO10126;

EncryptedImg = EncryptCall(demoKeyBytes, padding, picture);

问题是,如果我尝试继续加密和解密“图片”,我会得到一个空值。如果我继续使用完整图像“pictureFull”进行编码/解码,我也会得到一个空值。我需要完全删除 FOR 以便程序能够正常地编码/解码“pictureFull”,尽管 FOR 甚至没有修改它。是否有其他方法可以保存 byte[] 数组或有什么问题?

4

2 回答 2

3

试试这个,而不是 FOR:

byte[] pictureFull = ms.ToArray();
byte[] Header = pictureFull.Take(54);
byte[] picture = pictureFull.Skip(54);

并继续加密。PS 不要忘记添加 System.Linq 命名空间

于 2013-01-30T14:44:31.103 回答
0

byte[]是一个对象,因此您不想将该类型的变量初始化为null. 您可能希望Header像这样初始化:

byte[] Header = new byte[54];

并且长度至少等于实际图像数据长度,如下所示picturenew byte[]

byte[] picture = new byte[pictureFull.Length - 54];

然后你可以把东西复制给他们。

于 2013-01-30T14:46:51.947 回答