首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows商店应用程序中本地图像的加密与解密

Windows商店应用程序中本地图像的加密与解密
EN

Stack Overflow用户
提问于 2015-04-27 13:29:35
回答 2查看 733关注 0票数 5

我正在构建一个Windows应用程序,包括一个本地的图片文件夹。

我想保护所有的图像,这样它们就不能被访问:

代码语言:javascript
运行
复制
C:\Users[username]\AppData\Local\Packages\LocalState\Settings\settings.dat

我知道我应该使用DataProtectionProvider类加密和解密图像,但是文档只显示了如何加密/解密字符串.

如何将位图图像转换为字节数组?还是应该用Base64对其进行编码?是否有使用此过程的教程或示例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-27 23:39:45

如果要加密的图像是从文件中加载并写入文件中,这是最简单的。然后你就可以:

代码语言:javascript
运行
复制
async void EncryptFile(IStorageFile fileToEncrypt, IStorageFile encryptedFile)
{
    IBuffer buffer = await FileIO.ReadBufferAsync(fileToEncrypt);

    DataProtectionProvider dataProtectionProvider = 
        new DataProtectionProvider(ENCRYPTION_DESCRIPTOR);

    IBuffer encryptedBuffer = 
        await dataProtectionProvider.ProtectAsync(buffer);

    await FileIO.WriteBufferAsync(encryptedFile, encryptedBuffer);
}

如果您可以从输入和输出中获取流实例,DataProtectionProvider.ProtectStreamAsync是另一种选择。例如,如果您有一个包含图像数据的byte[],那么您可以从它创建内存中的输入流:

代码语言:javascript
运行
复制
byte[] imageData = ...
using (var inputMemoryStream = new MemoryStream(imageData).AsInputStream())
{
    ...
}

例如,编辑:对文件进行解密并在Image控件中显示它,您可以这样做:

代码语言:javascript
运行
复制
var encryptedBuffer = await FileIO.ReadBufferAsync(encryptedFile);

var dataProtectionProvider = new DataProtectionProvider();

var buffer = await dataProtectionProvider.UnprotectAsync(encryptedBuffer);

var bmp = new BitmapImage();
await bmp.SetSourceAsync(buffer.AsStream().AsRandomAccessStream());
imageControl.Source = bmp;
票数 1
EN

Stack Overflow用户

发布于 2015-04-28 13:32:43

代码语言:javascript
运行
复制
        public async void Protect()
        {
            for (int i = 1; i < 24; i++)
            {
                string imageFile = ImagePages[i];
                var fileToEncrypt = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
                var encryptedFile1 = await ApplicationData.Current.LocalFolder.CreateFileAsync("encryptedPage" + i);

                var encryptedFile2 = await EncryptFile(fileToEncrypt, encryptedFile1);
                IBuffer buffer = await DecryptFile(encryptedFile2);
                //(2.) It goes here and throw the 'System.ArgumentException' having the encryptedFile's ContentType=""

                var bmp = new BitmapImage();
                await bmp.SetSourceAsync(buffer.AsStream().AsRandomAccessStream());

                //Fill the List responsible for the Portrait View
                MyPortrait mp = new MyPortrait();
                mp.onlyImage = bmp;
                PImageList.Add(mp);
            }
        }    

        public async Task<IStorageFile> EncryptFile(IStorageFile fileToEncrypt, IStorageFile encryptedFile)
        {
            IBuffer buffer = await FileIO.ReadBufferAsync(fileToEncrypt);
            //I have no more exceptions here

            DataProtectionProvider dataProtectionProvider = new DataProtectionProvider("LOCAL=user");

            IBuffer encryptedBuffer = await dataProtectionProvider.ProtectAsync(buffer);
            //(1.) After arriving here when deploying it goes to (2.)

            await FileIO.WriteBufferAsync(encryptedFile, encryptedBuffer);

            return encryptedFile;
        }

        public async Task<IBuffer> DecryptFile(IStorageFile encryptedFile)
        {
            var protectedBuffer = await FileIO.ReadBufferAsync(encryptedFile);

            var dataProtectionProvider = new DataProtectionProvider();

            var buffer = await dataProtectionProvider.UnprotectAsync(protectedBuffer);

            return buffer;
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29897175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档