使用 AES c# 进行图像加密

问题描述 投票:0回答:1

我必须通过 AES 每种算法来加密和解密图像。 我有以下加密图像的代码:

public static byte[] MakeEncryption(Image image, CipherMode mode, byte[] key, byte[] iv)
        {
            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider { Mode = mode })
            {
                aes.Key = key;
                aes.IV = iv;
                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

                byte[] imageBytes;
                using (var mstream = new MemoryStream())
                {
                    image.Save(mstream, image.RawFormat);
                    imageBytes = mstream.ToArray();
                }

                using (MemoryStream input = new MemoryStream(imageBytes))
                using (MemoryStream encrypted = new MemoryStream())
                using (CryptoStream cryptoStream = new CryptoStream(encrypted, encryptor, CryptoStreamMode.Write))
                {
                    input.CopyTo(cryptoStream);
                    return encrypted.ToArray();
                }
            }
        }

以下代码将字节数组转换为图像:

public static Image GetImage(byte[] bytes)
        {
            Image img;
            using (var ms = new MemoryStream(bytes))
            {
                ms.Position = 0;
                ms.Write(bytes, 0, bytes.Length);
                img = Image.FromStream(ms); // this line cause to ArgumentException
            }

            return img;
            
        }

每次运行代码时我都会遇到同样的问题: System.ArgumentException 与注释一致

知道出了什么问题吗?

我尝试了多种将图像加载到加密函数中的方法,多种使用不同类型 Stream 的方法,但没有任何帮助

c# image encryption aes memorystream
1个回答
0
投票

RawFormat
属性似乎引用图像的“文件格式”,例如
Jpeg

对 JPEG 编码图像等进行加密后,您可以确保将图像转换回位图所需的元信息在加密过程中丢失。换句话说,密文将不再“代表”图像。解码这样的图像不会导致图像失真,它只会在标头的前几个字节处中止。

© www.soinside.com 2019 - 2024. All rights reserved.