【问题标题】:Encrypting an image to form another encrypted image Windows Phone 8.1加密图像以形成另一个加密图像 Windows Phone 8.1
【发布时间】:2016-03-22 22:18:47
【问题描述】:

我的要求是使用 AES 加密图像。我的方法是将图像转换为字节数组并应用加密。加密后将加密的字节数组转换回图像。

但在最后一部分中,没有从字节加密数组生成图像。

图片在这里加载到字节数组中

RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromFile(storageFile);
var streamWithContent = await rasr.OpenReadAsync();
byte[] buffer = new byte[streamWithContent.Size];
await streamWithContent.ReadAsync(buffer.AsBuffer(), (uint)streamWithContent.Size, InputStreamOptions.None);

加密在下面的代码中完成

IBuffer Buffer = CryptographicBuffer.CreateFromByteArray(buffer);
byte[] encrypted = null;
CryptographicBuffer.CopyToByteArray(CryptographicEngine.Encrypt(AES, Buffer, null),out encrypted);
return encrypted;

虽然字节数组被转换回图像为

var pic = new BitmapImage();
var imageBytes = returned_value;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
    using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
    {
         writer.WriteBytes((byte[])imageBytes);
         writer.StoreAsync().GetResults();
    }
    pic.SetSource(ms);
}

我尝试使用pic.PixelWidth 来检查结果图像的尺寸,它只是 0。

这是可能的还是有什么建议?

【问题讨论】:

  • 您是否使用调试器检查了解密字节数组中的字节是否与原始字节匹配? (也许有一个单元测试?)
  • 好吧,解密还没有完成。但即使它们不匹配,也应该将某些内容显示为图像。加密字节数组的长度在 5k 左右,但它不会生成任何图像。
  • 为什么你会期望一个可能无效的字节数组总是生成图像?
  • 我猜这就是一品脱。是否可以保证正确的加密始终会生成有效的字节数组?如何检查字节数组是否有效?
  • 如果您加密一个字节数组,您将无法将其显示为图像。它不再是图像,而是一堆字节。

标签: c# encryption windows-phone-8.1 bitmapimage


【解决方案1】:

位图文件在实际图像之前有一些特定的标题信息。您将需要正确创建该信息作为加密字节的标头。自然,加密图像本身就是彩色像素的混搭。

请参阅BMP file format 了解您需要构建的标头的详细信息。

【讨论】:

  • JPEG 图像文件以FF D8 开头并以FF D9 结尾。如果我在字节数组的开头和结尾手动添加这些怎么办?我实际上尝试过这个,但它没有帮助。我试图检查在转换时是否抛出任何异常here。但没有发现异常。
  • JPEG 文件被压缩。加密的图像不会匹配任何压缩格式。您可以根据需要进行试验,但您需要使用某种未压缩的图像格式。如果 BMP 不适合,那么 PNG 可能更适合您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多