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);

問題は、続けて「画像」を暗号化および復号化しようとすると、null値が返されることです。フルイメージ「pictureFull」でenc/decに進むと、null値も取得します。プログラムが通常「pictureFull」をenc/decするためには、FORを完全に削除する必要がありますが、そのFORはそれを変更しません。byte []配列を保存する他の方法はありますか、それとも何が問題になっていますか?

4

2 に答える 2

3

FORの代わりにそれを試してください:

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

暗号化を続行します。PSSystem.Linq名前空間を追加することを忘れないでください

于 2013-01-30T14:44:31.103 に答える
0

byte[]はオブジェクトであるため、そのタイプの変数をに初期化する必要はありませんnull。おそらくHeader次のように初期化する必要があります。

byte[] Header = new byte[54];

次のように、実際の画像データの長さと少なくとも同じ長さのpictureaに。new byte[]

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

次に、それらに物事をコピーすることができます。

于 2013-01-30T14:46:51.947 に答える