软件加密技术和注册机制( 三 )


(3) 给定 M,要找到另一个消息 M‘ 并满足 H(M) = H(M’) 很难 。
在许多应用中,仅有单向性是不够的,还需要称之为“抗碰撞的条件:
要找出两个随机的消息 M 和 M‘,使 H(M) = H(M’) 满足很难 。
由于散列函数的这些特性,由于公开密码算法的计算速度往往很慢,所以,在一些密码协议中,它可以作为一个消息 M 的摘要,代替原始消息 M,让发送者为 H(M) 签名而不是对 M 签名 .
如 SHA 散列算法用于数字签名协议 DSA中 。
2.5数字签名
提到数字签名就离不开公开密码系统和散列技术 。
有几种公钥算法能用作数字签名 。在一些算法中,例如RSA,公钥或者私钥都可用作加密 。用你的私钥加密文件,你就拥有安全的数字签名 。在其它情况下,如DSA,算法便区分开来了??数字签名算法不能用于加密 。这种思想首先由Diffie和Hellman提出 .
基本协议是简单的 :
(1) A 用她的私钥对文件加密,从而对文件签名 。
(2) A 将签名的文件传给B.
(3) B用A的公钥解密文件,从而验证签名 。
这个协议中,只需要证明A的公钥的确是她的 。如果B不能完成第(3)步,那么他知道签名是无效的 。
这个协议也满足以下特征:
(1) 签名是可信的 。当B用A的公钥验证信息时,他知道是由A签名的 。
(2) 签名是不可伪造的 。只有A知道她的私钥 。
(3) 签名是不可重用的 。签名是文件的函数,并且不可能转换成另外的文件 。
(4) 被签名的文件是不可改变的 。如果文件有任何改变,文件就不可能用A的公钥验证 。
(5) 签名是不可抵赖的 。B不用A的帮助就能验证A的签名 。
在实际应用中,因为公共密码算法的速度太慢,签名者往往是对消息的散列签名而不是对消息本身签名 。这样做并不会降低签名的可信性 。
3;当前流行的一些软件保护技术
3.1序列号保护
数学算法一项都是密码加密的核心,但在一般的软件加密中,它似乎并不太为人们关心,因为大多数时候软件加密本身实现的都是一种编程的技巧 。但近几年来随着序列号加密程序的普及,数学算法在软件加密中的比重似乎是越来越大了 。
看看在网络上大行其道的序列号加密的工作原理 。当用户从网络上下载某个shareware——共享软件后,一般都有使用时间上的限制,当过了共享软件的试用期后,你必须到这个软件的公司去注册后方能继续使用 。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软件公司,软件公司会根据用户的信息计算出一个序列码,在用户得到这个序列码后,按照注册需要的步骤在软件中输入注册信息和注册码,其注册信息的合法性由软件验证通过后,软件就会取消掉本身的各种限制,这种加密实现起来比较简单,不需要额外的成本,用户购买也非常方便,在互联网上的软件80%都是以这种方式来保护的 。
软件验证序列号的合法性过程,其实就是验证用户名和序列号之间的换算关系是否正确的过程 。其验证最基本的有两种,一种是按用户输入的姓名来生成注册码,再同用户输入的注册码比较,公式表示如下:
序列号 = F(用户名)
但这种方法等于在用户软件中再现了软件公司生成注册码的过程,实际上是非常不安全的,不论其换算过程多么复杂,解密者只需把你的换算过程从程序中提取出来就可以编制一个通用的注册程序 。
另外一种是通过注册码来验证用户名的正确性,公式表示如下:
用户名称 = F逆(序列号) (如ACDSEE)

推荐阅读