来源:月光博客
网址:http://www.williamlong.info/archives/704.html
[资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原做者保留全部权力,
如本博客的内容侵犯了你的权益,请与如下地址联系,本人获知后,立刻删除。同时本人深表歉意,并致以崇高的谢意!]
本文是一篇软件加密技术的基础性文章,简要介绍了软件加密的一些基本常识和一些加密产品,适用于国内软件开发商或者我的共享软件开发者阅读参考。html
一、加密技术概述算法
一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。数据库
对纯数据的加密的确是这样。对于你不肯意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。编程
可是,软件的加密不一样于数据的加密,它只能是“隐藏”。无论你愿意不肯意让他(合法用户,或 Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。既然机器能够“看见”这些明文,那么 Cracker,经过一些技术,也能够看到这些明文。安全
因而,从理论上,任何软件加密技术均可以破解。只是破解的难度不一样而已。有的要让最高明的 Cracker 忙上几个月,有的可能不费吹灰之力,就被破解了。网络
因此,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增长 Cracker 的破解难度。让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。这样 Cracker 的破解变得毫无心义——谁会花比正版软件更多的钱去买盗版软件?函数
二、密码学简介工具
2.1 概念post
(1) 发送者和接收者学习
假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。
(2) 消息和加密
消息被称为明文。用某种方法假装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。
明文用M(消息)或P(明文)表示,它多是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,不管在哪一种状况,M指待加密的消息。
密文用C表示,它也是二进制数据,有时和M同样大,有时稍大(经过压缩和加密的结合,C有可能比P小些。然而,单单加密一般达不到这一点)。加密函数E做用于M获得密文C,用数学表示为:
E(M)=C.
相反地,解密函数D做用于C产生M
D(C)=M.
先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:
D(E(M))=M
(3) 鉴别、完整性和抗抵赖
除了提供机密性外,密码学一般有其它的做用:.
(a) 鉴别
消息的接收者应该可以确认消息的来源;入侵者不可能假装成他人。
(b) 完整性检验
消息的接收者应该可以验证在传送过程当中消息没有被修改;入侵者不可能用假消息代替合法消息。
(c) 抗抵赖
发送者过后不可能虚假地否定他发送的消息。
(4) 算法和密钥
密码算法也叫密码,是用于加密和解密的数学函数。(一般状况下,有两个相关的函数:一个用做加密,另外一个用做解密)
若是算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具备历史意义,但按如今的标准,它们的保密性已远远不够。大的或常常变换的用户组织不能使用它们,由于每有一个用户离开这个组织,其它的用户就必须改换另外不一样的算法。若是有人无心暴露了这个秘密,全部人都必须改变他们的算法。
更糟的是,受限制的密码算法不可能进行质量控制或标准化。每一个用户组织必须有他们本身的惟一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却能够买到这些流行产品并学习算法,因而用户不得不本身编写算法并予以实现,若是这个组织中没有好的密码学家,那么他们就没法知道他们是否拥有安全的算法。
尽管有这些主要缺陷,受限制的算法对低密级的应用来讲仍是很流行的,用户或者没有认识到或者不在意他们系统中内在的问题。
现代密码学用密钥解决了这个问题,密钥用K表示。K能够是不少数值里的任意值。密钥K的可能值的范围叫作密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K做为下标表示),这样,加/解密函数如今变成:
EK(M)=C
DK(C)=M.
DK(EK(M))=M.
有些算法使用不一样的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不一样,在这种状况下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
全部这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法能够公开,也能够被分析,能够大量生产使用算法的产品,即便偷听者知道你的算法也没有关系;若是他不知道你使用的具体密钥,他就不可能阅读你的消息。
密码系统由算法、以及全部可能的明文、密文和密钥组成的。
基于密钥的算法一般有两类:对称算法和公开密钥算法。下面将分别介绍:
2.2 对称密码算法
对称算法有时又叫传统密码算法,就是加密密钥可以从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通讯以前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。只要通讯须要保密,密钥就必须保密。
对称算法的加密和解密表示为:
EK(M)=C
DK(C)=M
对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另外一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法广泛地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。
2.3 公开密码算法
公开密钥算法(也叫非对称算法)是这样设计的:用做加密的密钥不一样于用做解密的密钥,并且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之因此叫作公开密钥算法,是由于加密密钥可以公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫作公开密钥(简称公钥),解密密钥叫作私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了不与对称算法混淆,此处不用秘密密钥这个名字。
用公开密钥K加密表示为
EK(M)=C.
虽然公开密钥和私人密钥是不一样的,但用相应的私人密钥解密可表示为:
DK(C)=M
有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:
EK(M)=C
DK(C)=M
当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。
2.4 单向散列函数
单向散列函数 H(M) 做用于一个任意长度的消息 M,它返回一个固定长度的散列值 h,其中 h 的长度为 m .
输入为任意长度且输出为固定长度的函数有不少种,但单向散列函数还有使其单向的其它特性:
(1) 给定 M ,很容易计算 h ;
(2) 给定 h ,根据 H(M) = h 计算 M 很难 ;
(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)
这实际上是软件公司注册码计算过程的反算法,若是正向算法与反向算法不是对称算法的话,对于解密者来讲,的确有些困难,但这种算法至关很差设计。
因而有人考虑到如下的算法:
F1(用户名称) = F2(序列号)
F一、F2是两种彻底不一样的的算法,但用户名经过F1算法计算出的特征字等于序列号经过F2算法计算出的特征字,这种算法在设计上比较简单,保密性相对以上两种算法也要好的多。若是可以把F一、F2算法设计成不可逆算法的话,保密性至关的好;可一旦解密者找到其中之一的反算法的话,这种算法就不安全了。一元算法的设计看来再如何努力也很难有太大的突破,那么二元呢?
特定值 = F(用户名,序列号)
这个算法看上去至关不错,用户名称与序列号之间的关系再也不那么清晰了,但同时也失去了用户名于序列号的一一对应关系,软件开发者必须本身维护用户名称与序列号之间的惟一性,但这彷佛不是难以办到的事,建个数据库就能够了。固然也能够把用户名称和序列号分为几个部分来构造多元的算法。
特定值 = F(用户名1,用户名2,...序列号1,序列号2...)
现有的序列号加密算法大可能是软件开发者自行设计的,大部分至关简单。并且有些算法做者虽然下了很大的功夫,效果却每每得不到它所但愿的结果。
3.2 时间限制
有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就中止工做,必须从新运行该程序才能正常工做。这些程序里面天然有个定时器来统计程序运行的时间。
这种方法使用的较少。
3.3 Key File 保护
Key File(注册文件)是一种利用文件来注册软件的保护方式。Key File通常是一个小文件,能够是纯文本文件,也能够是包含不可显示字符的二进制文件,其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信息。文件格式则由软件做者本身定义。试用版软件没有注册文件,当用户向做者付费注册以后,会收到做者寄来的注册文件,其中可能包含用户的我的信息。用户只要将该文件放入指定的目录,就可让软件成为正式版。该文件通常是放在软件的安装目录中或系统目录下。软件每次启动时,从该文件中读取数据,而后利用某种算法进行处理,根据处理的结果判断是否为正确的注册文件,若是正确则以注册版模式来运行。
这种保护方法使用也很少。
3.4 CD-check
即光盘保护技术。程序在启动时判断光驱中的光盘上是否存在特定的文件,若是不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程中通常再也不检查光盘的存在与否。Windows下的具体实现通常是这样的:先用GetLogicalDriveStrings( )或GetLogicalDrives( )获得系统中安装的全部驱动器的列表,而后再用GetDriveType( )检查每个驱动器,若是是光驱则用CreateFileA( )或FindFirstFileA( )等函数检查特定的文件存在与否,并可能进一步地检查文件的属性、大小、内容等。
3.5 软件狗
软件狗是一种智能型加密工具。它是一个安装在并口、串口等接口上的硬件电路,同时有一套使用于各类语言的接口软件和工具软件。当被狗保护的软件运行时,程序向插在计算机上的软件狗发出查询命令,软件狗迅速计算查询并给出响应,正确的响应保证软件继续运行。若是没有软件狗,程序将不能运行,复杂的软硬件技术结合在一块儿防止软件盗版。真正有商业价值得软件通常都用软件狗来保护。
平时常见的狗主要有“洋狗”(国外狗)和“土狗”(国产狗)。这里“洋狗”主要指美国的彩虹和以色列的HASP,“土狗”主要有金天地(如今与美国彩虹合资,叫“彩虹天地”)、深思、尖石。总的说来,“洋狗”在软件接口、加壳、反跟踪等“软”方面没有“土狗”好,但在硬件上破解难度很是大;而“土狗”在软的方面作的很好,但在硬件上不如“洋狗”,稍有单片机功力的人,均可以复制。
3.6 软盘加密
经过在软盘上格式化一些非标准磁道,在这些磁道上写入一些数据,如软件的解密密钥等等。这种软盘成为“钥匙盘”。软件运行时用户将软盘插入,软件读取这些磁道中的数据,判断是否合法的“钥匙盘”。
软盘加密还有其它一些技术,如弱位加密等等。
随着近年来软盘的没落,这种方法基本上退出了历史舞台。
3.7 将软件与机器硬件信息结合
用户获得(买到或从网上下载)软件后,安装时软件从用户的机器上取得该机器的一些硬件信息(如硬盘序列号、BOIS序列号等等),而后把这些信息和用户的序列号、用户名等进行计算,从而在必定程度上将软件和硬件部分绑定。用户须要把这一序列号用Email、电话或邮寄等方法寄给软件提供商或开发商,软件开发商利用注册机(软件)产生该软件的注册号寄给用户便可。软件加密虽然加密强度比硬件方法较弱,但它具备很是廉价的成本、方便的使用方法等优势。很是适合作为采用光盘(CDROM)等方式发授软件的加密方案。
此种加密算法的优势
· 不一样机器注册码不一样。用户得到一个密码只能在一台机器上注册使用软件。不一样于目前大多软件采用的注册方法,即只要知道注册码,可在任何机器上安装注册。
· 不须要任何硬件或软盘
· 能够选择控制软件运行在什么机器、运行多长时间或次数等
· 可以让软件在不注册前的功能为演示软件,只能运行一段时间或部分功能。注册后就当即变为正式软件
· 采用特别技术,解密者很难找到产生注册号码的规律
· 在使用注册号产生软件(注册机)时可采用使用密码、密钥盘、总次数限制等方法
· 方便易用,价格低廉。
这种加密还有如下特色
一、 注册加密的软件,只能在一台机器上安装使用。把软件拷贝到其它机器上不能运行。
二、 若用户想在另外一机器上安装运行,必须把软件在这一机器上运行时的序列号,寄给软件出版商换取注册密码。固然应再交一份软件费用。
三、 此加密方法特别适应在因特网上发布的软件及用光盘发布的软件。
注释:
一、“加密技术概述”部份内容参考了大学教材“密码学基础”。
二、“当前流行的一些软件保护技术”部份内容参考了“加密与解密--软件保护技术及彻底解决方案”一文。
出处:http://www.cnblogs.com/erwin/archive/2007/06/13/782706.html