C# 加密&;在Windows应用商店应用程序中解密本地图像

C# 加密&;在Windows应用商店应用程序中解密本地图像,c#,encryption,windows-store-apps,base64,windows-8.1,C#,Encryption,Windows Store Apps,Base64,Windows 8.1,我正在构建一个包含本地图像文件夹的Windows应用商店应用程序 我想保护所有图像,使其无法从以下位置访问: C:\Users[username]\AppData\Local\Packages\LocalState\Settings\settings.dat 我知道我应该使用DataProtectionProvider类对图像进行加密和解密,但是文档只显示了如何加密/解密字符串 如何将位图图像转换为字节数组?或者我应该用Base64编码它吗?是否有使用此过程的教程或示例?如果要加密的图像是从文

我正在构建一个包含本地图像文件夹的Windows应用商店应用程序

我想保护所有图像,使其无法从以下位置访问:

C:\Users[username]\AppData\Local\Packages\LocalState\Settings\settings.dat
我知道我应该使用
DataProtectionProvider
类对图像进行加密和解密,但是文档只显示了如何加密/解密字符串


如何将位图图像转换为字节数组?或者我应该用
Base64
编码它吗?是否有使用此过程的教程或示例?

如果要加密的图像是从文件加载并写回文件,则最简单。然后你可以做:

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[] imageData = ...
using (var inputMemoryStream = new MemoryStream(imageData).AsInputStream())
{
    ...
}
编辑:例如,要解密文件并将其显示在
图像
控件中,您可以执行以下操作:

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;
public异步void Protect()
{
对于(int i=1;i<24;i++)
{
字符串imageFile=ImagePages[i];
var fileToEncrypt=wait Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(imageFile);
var encryptedFile1=wait ApplicationData.Current.LocalFolder.CreateFileAsync(“encryptedPage”+i);
var encryptedFile2=等待加密文件(fileToEncrypt,encryptedFile1);
IBuffer buffer=等待解密文件(encryptedFile2);
//(2.)它转到这里并抛出具有encryptedFile的ContentType=“”的'System.ArgumentException'
var bmp=新的位图();
等待bmp.SetSourceAsync(buffer.AsStream().AsRandomAccessStream());
//填写负责纵向视图的列表
MyPortrait mp=新的MyPortrait();
mp.onlyImage=bmp;
PImageList.Add(mp);
}
}    
公共异步任务加密文件(IStorageFile fileToEncrypt,IStorageFile encryptedFile)
{
IBuffer buffer=等待文件IO.ReadBufferAsync(文件加密);
//我这里没有例外
DataProtectionProvider DataProtectionProvider=新的DataProtectionProvider(“本地=用户”);
IBuffer encryptedBuffer=等待dataProtectionProvider.ProtectAsync(缓冲区);
//(1.)在部署时到达此处后,转到(2)
等待FileIO.WriteBufferAsync(encryptedFile,encryptedBuffer);
返回加密文件;
}
公共异步任务解密文件(IStorageFile encryptedFile)
{
var protectedBuffer=await FileIO.ReadBufferAsync(encryptedFile);
var dataProtectionProvider=新的dataProtectionProvider();
var buffer=等待dataProtectionProvider.UnprotectAsync(protectedBuffer);
返回缓冲区;
}

加密文件如何处理?它应该是一个图像,它应该是空的第一。。。如何初始化它?关于
decryptedFile()
方法,我是否应该使用新的
decryptedFile
加密文件进行同样的操作,
UnprotectAsync
WriteBufferAsync
?@LayaleMatta您可以使用任何文件/打开的API初始化
encryptedFile
,例如
var encryptedFile=wait ApplicationData.Current.LocalFolder.CreateFileAsync(filename)
。是的;我在上面的答案中添加了一个解密示例来说明这一点。我在encryptFile方法中得到一个
System.IO.FileNotFoundException
,位于
IBuffer buffer=wait FileIO.ReadBufferAsync(fileToEncrypt)我有正确的思路,并且图像确实存在于我提到的本地文件夹中。这是文件加密的路径:
“C:\\[…]\\Projects\\eBookApp\\eBookApp\\bin\\Debug\\AppX\\\\Assets\\Images\\page1.jpg”
在AppX和Assets之间有4个反斜杠,也许这就是问题所在。否则,请仔细检查路径是否正确,并/或尝试在其他位置使用另一个映像。此外,从资产加载映像的更正确方法是:
var fileToEncrypt=wait-StorageFile.getfilefromsapplicationuriasync(新Uri(“ms”)-appx:///Assets/Images/page1.jpg"));。否则,您可能会得到一个
未经授权的访问异常
。我怀疑这是因为您在
加密文件
中写入后试图读取
加密文件
。尝试使用
GetFileAsync
重新打开加密文件,然后将其传递给
DecryptFile
。完全正确!我从EncryptFile方法返回encryptedFile!非常感谢。你真是太棒了
        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;
        }