为什么讲数据的加密容易而解密难,是因为数据加密时,加密算法是经过选择的,算法利用密钥去加密(含知道密钥的人,去合法地解密),他就是一种普通的数学计算,不管算法有多么复杂,但总是可以在有限的步骤里计算出结果来的,而对破解都来讲,算法本身的要求就是————如果不知道密钥,无法从数学的角度,通过有限的步骤来反向计算,只能一个数一个数地试。
如RSA算法,知道密钥(用私钥签名解密,或者知道公钥来验证签名),进行相应的计算,都是比较容易的,而如果不知道密钥,现在的办法,除了一个数一个数地去试,就只能分解一个很大的数,而这是很难的。
如果你不了解RSA,我换个表达方式,可能不太贴切,但也能说明这个问题:你用MD5工具,去计算一个文件(如A.txt)的MD5值,这是很容易的,计算后,现在你知道了A.txt的MD5是多少(假设是XXX),但你不告诉别人A.txt这个文件,只是告诉别人,有一个文件,它的MD5是XXX,让别人来猜,这个XXX对应是文件是什么,那别人是很难办得到的。
数据加密算法的原理,分两类,对称密钥与不对称密钥,原理上有很大的差异,很难在本文当中展开,但总体而言:对合法用户(知道密钥的人),计算是简单的、有限步骤的,而对非法破解者,是很难倒过来推演,从加密结果,反过来计算出原来的明文数据的。
程序的MD5自检,是指程序启动后,对磁盘当中的程序文件求MD5,然后再与事先知道的正确的MD5进行比较。
比如,你的程序文件名为“518抽奖.exe”,那么,程序启动后,找到磁盘当中的这个文件,计算一下他的MD5。当然,这个MD5值不可能事前就写入程序当中,因为源码没有编译前,你也不知道最后程序的MD5是多少。这个MD5可以与到另外一个文件当中,如“518抽奖.ini”,然后对这个ini文件进行数字签名。程序启动后,计算出来了程序文件本身的MD5,再读取ini数据,进行数字签名比对(数字签名是无法伪造的)。
如果别人修改了程序,则“518抽奖.exe”的MD5必然发生变化,与“518抽奖.ini”当中的数字签名无法匹配。而“518抽奖.ini”使用了数字签名,别人又是无法自行修改伪造的。
我不懂VC,但略懂点加密算法与VB,在VB版前几天发了一个源码示例《一个关于要求用户注册(保护程序版权)的VB6示例》
https://bbs.bccn.net/thread-444829-1-1.html,本来打算第二讲就是要讲如何进行通过自检MD5,防止程序被修改的。这是第一部分,讲如何把程序与硬件(示例是硬盘,当然也可以是主板、网卡等)锁定的,就是通常讲的机器码注册。
关于拦截,是这样的,“难都不会,会者不难”,有许多办法,也有许多工具,我不搞这块,我知道原理,但具体操作不清楚,应该能在网上比较容易地找到资料与工具。
戏法人人会变,巧妙各有不同,就在这儿啦。
如果别人知道你利用了什么(比如我的那个示例,知道你利用硬盘的序列号),则可以针对性的,监控到程序去读硬盘序列号的动作,从而进行拦截,输入一个别的机器上已经注册的公用序列号。而对于程序作者而言,就是要摆迷魂阵,不让别人知道你利用了什么数据,不知道该去拦截那个数据。