C# 正在位级别加密Windows Phone资源。。。我这样做对吗?

C# 正在位级别加密Windows Phone资源。。。我这样做对吗?,c#,windows-phone-7,encryption,C#,Windows Phone 7,Encryption,我有一个关于加密的问题,更具体地说,加密不需要互联网连接(与私钥/公钥或OAuth方法相反) 当我发现WP7应用商店不安全时,问题出现了。我不会发布链接,但是一个基本的搜索将生成一个桌面应用程序,允许您下载市场上的任何免费WP7。然后将.xap重命名为.zip,并使用reflector查看代码 我相信这会解决我的问题,但作为一次学习经历,我决定提出自己的解决方案 我决定让一个程序在预构建中收集我想要加密的文件,将它们放在一个文件中,加密该文件,并将其添加到项目中进行编译。手机应用程序中的代码只需

我有一个关于加密的问题,更具体地说,加密不需要互联网连接(与私钥/公钥或OAuth方法相反)

当我发现WP7应用商店不安全时,问题出现了。我不会发布链接,但是一个基本的搜索将生成一个桌面应用程序,允许您下载市场上的任何免费WP7。然后将.xap重命名为.zip,并使用reflector查看代码

我相信这会解决我的问题,但作为一次学习经历,我决定提出自己的解决方案

我决定让一个程序在预构建中收集我想要加密的文件,将它们放在一个文件中,加密该文件,并将其添加到项目中进行编译。手机应用程序中的代码只需要解密数据

我正在加密/解密的数据是几个API密钥(用于10个web服务),这意味着解密时可以作为纯文本读取

这是我提出的加密算法(大致上,并做了一些修改):

public static byte[] SuffleData(byte[] data)
{
    // Create a bit array to deal with the data on the bit level
    BitArray bits = new BitArray(data);

    // Generate a random GUID, and store it in a bit array as well
    Guid guid = Guid.NewGuid();
    BitArray guidBits = new BitArray(guid.ToByteArray());

    int guidBitsIndex = 0;

    // Iterate over all the data bit by bit
    for (int i = 0; i < bits.Count / 2; i++)
    {
        // if the current GUID bit is true (1), then swap
        // the current bit with it's mirror
        if (guidBits[guidBitsIndex])
        {
            bool temp = bits[i];
            bits[i] = bits[bits.Length - i];
            bits[bits.Length - i] = temp;
        }

        // Because the data being shuffled is expected to
        // contain more bits than the GUID, this index 
        // needs to be reset
        if (guidBitsIndex == guidBits.Count)
            guidBitsIndex = 0;
        else
            guidBitsIndex++;
    }

    // HideGuidInData hides the bits for the GUID in a hard
    // coded location inside the data being encrypted.
    HideGuidInData(ref bits, guidBits);

    // Convert the shuffled data bits (now containing the 
    // GUID needed to decrypt the bits) into a byte array
    byte[] shuffled = new byte[bits.Length / 8];
    bits.CopyTo(shuffled, 0);

    // return the data, now shuffled. (this array should
    // be the length of the original data, plus 16 bytes,
    // since 16 bytes are needed to store the GUID).
    return shuffled;
}
公共静态字节[]SuffleData(字节[]数据)
{
//创建位数组以处理位级别的数据
位数组位=新的位数组(数据);
//生成随机GUID,并将其存储在位数组中
Guid=Guid.NewGuid();
BitArray guidBits=新的位数组(guid.ToByteArray());
int guidBitsIndex=0;
//逐位迭代所有数据
for(int i=0;i
我可能会在发布这篇文章的时候伤到自己的脚,但是如果不知道数据是用这种方法加密的,暴力破解这个需要n!时间,其中n是文件中的总位数。(基本上,远远高于随机猜测GUID的概率)

假设GUID在文件中隐藏得很好,暴力攻击将需要很长时间才能找到答案

在我找到这个解决方案的过程中,我花了很多时间学习了加密技术,我读到的所有内容似乎都比这复杂得多(显然,我读到的所有内容都涉及到两方,其中加密可能涉及在他们之间传递密钥)

我学到的是:

  • 如果加密数据的密钥与数据一起存储,那么破解并获取数据只是时间问题
  • 没有“完全安全”这样的东西。加密的成功程度各不相同,一般来说,在选择加密方法时,您需要权衡数据安全的重要性和程序解密数据的难易程度(考虑到处理器和内存限制)
  • 我认为这太简单了,不是一个好的解决方案。有谁能证明这一怀疑,并向我解释为什么这不像其他加密方法那样安全?(或者让我非常高兴,告诉我这很安全?)

    我现在可以看到这种算法的缺点:

  • 该算法要求所有数据都在内存中(不用太担心,因为我正在加密一个约500字节的非常小的文件)
  • 该算法需要更改读取数据的流的位置,以便提取GUID(基本上,您不能从文件的开头到结尾对其进行流式解密)

  • 需要注意的是,我的应用程序并不是非常重要,实际上,恶意用户不太可能每次都使用reflector查看我的代码(实际上,像我这样的人只想知道一些东西是如何工作的,而不是造成任何伤害)。

    这个算法不会给你带来太多好处。下载你的应用程序并使用Reflector时遇到麻烦的人会得到你的加密数据和解密过程的代码。他们可以找到你解密数据的方法,然后使用它

    问题是您正在将“加密密钥”存储在密码文本中。当攻击者还可以访问所使用的算法时,无法使其安全。不管你用什么密码系统

    您面临的基本问题是,电话应用程序本身必须拥有解密和使用数据所需的所有信息,因此任何查看代码的人都能够看到这些信息


    同样的原因是,DVD等上的DRM方案通常会很快被破坏。任何能够播放受DRM保护的材料的设备或应用程序都必须具备对其进行解密的手段。当设备或应用程序播放内容时,在内存中进行足够多的拨动,你会找到解密密钥,然后你可以随时破解任何类似保护的媒体。

    这种算法不会给你带来太多好处。下载你的应用程序并使用Reflector时遇到麻烦的人