加密的原理为:
读入src,将src与key进行某种操作,便得到加密后的结果,解密时,需要用相同的key来进行解密.简单点就是result = fn(src, password, operator) src为需要加密的, password为对应密码,operator为相应加密操作(就是result = src <operator> password),返回的便是加密的结果.这里将src与password做了操作,所以在不知password的情况下,是不能从result解出src
大多数软件员写的加密程序(不包括市面上的那些比如"高强度加密大师等是骗钱软件")采用这种方法.
比如:
要加密int src[] = {11111111, 11111110, 11111100, 11111000}这段信息(二进制).
假设加密的操作为异或操作(^).
输入的密码为11111111(二进制)
将src[]与 11111111进行异或(^)操作.
则加密后的数据为{0000000, 00000001, 00000011, 00000111}(二进制)
解密的时候只要对加密后的数据再次进行与密码进行异或(^)操作即可.
在不知道密匙(密码11111111)的情况下,得到原始的数据是不可能的.如果输入一个错误的密码进行解密,其最终的结果也只是得到错误的数据而已.
于是将其应用到程序上,好似也无法破解.
可是作者或使用者往往忽略了一点:如果对应的加密后的信息的某一部分的原形是已知的,并且在你的加密方法足够简单的时候(即使你的加密是相当的复杂,也仅仅是多花了点时间),便有机可乘了.
比如对于rar文件.用ultraedit打开随便一个rar便可知道,rar的前20个字节是固定的.如果用上面的加密方法进行加密.如果密码设置为password[] = {0x65, 0x66, 0x67, 0x68}(就是字符串"ABCD")
rar文件的头几个字节为52 61 72 21 // 字符串rar! 16进制
那么进行加密后的文件的头4个字节必然是55 7 21 66
解密者在不知道密码("ABCD")的情况下,完全可以通过原始数据固定的头4个字节值来获得密码的值.
具体操作为:0x52 ^ 0x55
0x7 ^ 0x61
0x21 ^ 0x72
0x66 ^ 0x21
结果必然是{0x65, 0x66, 0x67, 0x68}(就是字符串"ABCD")
当然这有很多限制.比如对于纯文本txt来说,原文件并没有头部信息,所以无法破解.
这里的破解是对相当简单的加密而言,并且知道密码的长度为4位.但是对于rar文件来说,其头20个字节是已知的,完全可以枚举有限种可能的结果,半猜半解的解密.对于其他某几个字节是固定的文件类型也有相同的问题.虽然增强加密强度可以加大破解难度,但这也只是增加破解者的一点时间而已.
避免这类安全隐患有相当多的方法,最简单的便是对已知的几个字节不加密(对于rar文件,则不加密其头20个字节).这样解密者就不能找到蛛丝马迹了