正在位级别加密Windows Phone资源..我这样做对吗

本文关键字:资源 这样做 Phone Windows 加密 | 更新日期: 2023-09-27 18:27:47

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

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

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

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

我正在加密/解密的数据是几个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;
}

我发布这条消息可能是在开枪自杀,但如果不知道数据是用这种方法加密的,那么暴力破解需要n!时间,其中n是文件中的总位数。(基本上,比随机猜测GUID的概率高得多)。

假设GUID很好地隐藏在文件中,那么暴力攻击将需要很长时间才能弄清楚。

在找到这个解决方案的过程中,我花了很多时间学习加密,我读到的所有东西似乎都比这复杂得多(而且,很明显,我读的所有东西都涉及双方,加密可能涉及在他们之间传递密钥)。

我学到的是:

  1. 如果加密数据的密钥与数据一起存储,那么有人破解它并获取数据只是时间问题
  2. 不存在"完全安全"这回事。加密有不同程度的成功,一般来说,在选择加密方法时,您需要权衡数据安全的重要性以及程序解密数据的容易程度(考虑到处理器和内存限制)

我认为这太简单了,不可能成为一个好的解决方案。有人能证明这种怀疑吗,并向我解释为什么这不如其他加密方法安全吗?(或者让我很高兴,告诉我这很安全?)

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

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

需要注意的是,我的应用程序并不是很重要,实际上,恶意的人不太可能每次都使用反射器来查看我的代码(实际上,只是像我这样的人想知道某个东西是如何工作的,而不是造成任何伤害)。

正在位级别加密Windows Phone资源..我这样做对吗

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

问题是您将"加密密钥"存储在密码文本中。当攻击者也可以访问所使用的算法时,没有办法确保安全。使用什么加密系统并不重要。

你面临的基本问题是,手机应用程序本身必须拥有解密和使用数据所需的所有信息,所以任何查看代码的人都能看到这一点。

DVD等数字版权管理系统的破坏速度如此之快,也是出于同样的原因。任何能够播放受DRM保护的材料的设备或应用程序都必须有解密的方法。在设备或应用软件播放内容时,在内存中进行足够的戳戳,你就会找到解密密钥,然后你可以随时破解任何类似的受保护媒体。

相关文章: