加密算法
背景:
现有的序列号加密算法大都是软件开发者自行设计的,大部分相当简单。有些算法,其作者虽 然下了很大的工夫,却往往达不到希望达到的效果。其实,有很多成熟的算法可以使用,特别是密 码学中一些强度比较高的算法,例如RSA 、BlowFish 、MD5等。对这些算法,网上有大量的源码或 编译好的库(当然这些库中可能会有一些漏洞),可以直接加以利用,我们要做的只是利用搜索引 擎找到它们并将它们嵌入自己的程序。应当指出,尽管这些算法的强度很高,但是使用方法也要得 当,否则效果就和普通的四则运算没有区别,很容易被解密者算出注册码或者写出注册机。
1.1 单向散列算法
单向散列函数算法也称 Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消 息摘要)的函数(该过程不可逆)。Hash 函数可用于数字签名、消息的完整性检测、消息起源的认 证检测等。常见的散列算法有MD5 、SHA 、RIPE-MD 、HAVAL 、N-Hash等。
在软件的加密保护中, Hash 函数是经常用到的加密算法。但是,由于 Hash 函数为不可逆算 法,软件只能使用Hash 函数作为加密的一个中间步骤。例如,对用户名进行 Hash变换,再对这个 结果进行可逆的加密变换(例如对称密码),变换结果为注册码。从解密的角度来说, 一般不必了 解 Hash 函数的具体内容(变种算法除外),只要能识别出是何种 Hash 函数,就可以直接套用相关 算法的源码来实现。
1.1.1 MD5 算法
MD5 消息摘要算法(Mesage Digest Algorithm) 是由 R.Rivest 设计的。它对输入的任意长度的 消息进行运算,产生一个128位的消息摘要。近年来,随着穷举攻击和密码分析的发展,曾经应用 最为广泛的MD5算法已经不那么流行了。
1. 算法原理
(1)数据填充
填充消息使其长度与448模512同余(即长度=448 mod 512)。也就是说,填充后的消息长度 比512的倍数仅小64位。即使消息长度本身已经满足了上述长度要求也需要填充,填充方法是: 附一个1在消息后面,然后用0来填充,直到消息的长度与448模512同余。至少填充1位,至多 填充512位。
(2)添加长度
在上一步的结果之后附上64位的消