C# 正在位级别加密Windows Phone资源。。。我这样做对吗?
我有一个关于加密的问题,更具体地说,加密不需要互联网连接(与私钥/公钥或OAuth方法相反) 当我发现WP7应用商店不安全时,问题出现了。我不会发布链接,但是一个基本的搜索将生成一个桌面应用程序,允许您下载市场上的任何免费WP7。然后将.xap重命名为.zip,并使用reflector查看代码 我相信这会解决我的问题,但作为一次学习经历,我决定提出自己的解决方案 我决定让一个程序在预构建中收集我想要加密的文件,将它们放在一个文件中,加密该文件,并将其添加到项目中进行编译。手机应用程序中的代码只需要解密数据 我正在加密/解密的数据是几个API密钥(用于10个web服务),这意味着解密时可以作为纯文本读取 这是我提出的加密算法(大致上,并做了一些修改):C# 正在位级别加密Windows Phone资源。。。我这样做对吗?,c#,windows-phone-7,encryption,C#,Windows Phone 7,Encryption,我有一个关于加密的问题,更具体地说,加密不需要互联网连接(与私钥/公钥或OAuth方法相反) 当我发现WP7应用商店不安全时,问题出现了。我不会发布链接,但是一个基本的搜索将生成一个桌面应用程序,允许您下载市场上的任何免费WP7。然后将.xap重命名为.zip,并使用reflector查看代码 我相信这会解决我的问题,但作为一次学习经历,我决定提出自己的解决方案 我决定让一个程序在预构建中收集我想要加密的文件,将它们放在一个文件中,加密该文件,并将其添加到项目中进行编译。手机应用程序中的代码只需
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在文件中隐藏得很好,暴力攻击将需要很长时间才能找到答案
在我找到这个解决方案的过程中,我花了很多时间学习了加密技术,我读到的所有内容似乎都比这复杂得多(显然,我读到的所有内容都涉及到两方,其中加密可能涉及在他们之间传递密钥)
我学到的是:
需要注意的是,我的应用程序并不是非常重要,实际上,恶意用户不太可能每次都使用reflector查看我的代码(实际上,像我这样的人只想知道一些东西是如何工作的,而不是造成任何伤害)。这个算法不会给你带来太多好处。下载你的应用程序并使用Reflector时遇到麻烦的人会得到你的加密数据和解密过程的代码。他们可以找到你解密数据的方法,然后使用它 问题是您正在将“加密密钥”存储在密码文本中。当攻击者还可以访问所使用的算法时,无法使其安全。不管你用什么密码系统 您面临的基本问题是,电话应用程序本身必须拥有解密和使用数据所需的所有信息,因此任何查看代码的人都能够看到这些信息
同样的原因是,DVD等上的DRM方案通常会很快被破坏。任何能够播放受DRM保护的材料的设备或应用程序都必须具备对其进行解密的手段。当设备或应用程序播放内容时,在内存中进行足够多的拨动,你会找到解密密钥,然后你可以随时破解任何类似保护的媒体。这种算法不会给你带来太多好处。下载你的应用程序并使用Reflector时遇到麻烦的人