您的位置: 我要加密首页 >> 加密技术 >> 阅读文档:浅谈目前的各种加密方案

浅谈目前的各种加密方案

[ 作者: | 更新日期:2007-8-15 10:05:03 | 阅读次数: | 评论 0 条 | 我要投稿 ]

当前软件加密方法多种多样,已经不可能找出一种分类方法来把各种加密方案很好地区分开来。基本上来说可以分为依赖特定硬件的加密方案和不依赖硬件的加密方案。

  一、依赖硬件的加密方案

  1. 软盘加密

  这是在计算机上最为古老的一种加密方案,它的原理是在软盘的特.殊位置写入一些信息,软件在运行时要检验这些信息。这种软盘就好像一把钥匙。软件开发商只需一次投资购买一套加密工具就可以自己制作多张钥匙盘。此方法加密简单,成本低,在软件发展的不同时期都能看到其闪光点。但因为软驱是慢速设备,多次检查软盘上的加密点会大大拖慢程序的运行速度,所以一般加密软件只在软件运行开始的时候检查一次,这样不能避免用户用一张加密盘启动多份软件。而且由于软盘是一种易损载体,加密软件对软盘加密点的反复读写很容易造成软盘的损坏。而这张加密盘又不能备份,软件公司要不断应付用户更换加密盘的请求。另外由于这种加密技术出现得较早,硬解密的技术相对比较成熟,像双星公司的King-Copy软件能拷贝大多数的加密软盘,连加密点一起复制,复制后的软盘还是加密的。

  2. 卡加密

  在90年代初,各种各样的汉卡涌现出来,随之而来的卡加密技术也风行一时。由于种种问题,这种加密技术现在已经难得一见了。 字串1

  3. 软件锁加密

  软件锁加密是在国外首先出现的,它是一个插在计算.机打印口上火柴盒大小的设备,国内俗称“加密狗”。在加密锁内部存有一定的数据和算法,计算机可以与之通讯来获得其中的数据,或通过加密锁进行某种计算。软件无法离开加密锁而运行。由于它不像卡加密那样需要打开计算机的机箱来安装,但又像加密卡那样可以随时访问,而且访问速度很快,所以一推出就受到软件开发者们的青睐。目前,所有的加密锁都提供了可编程的接口。用户可以控制加密锁中的内容,在程序中通过加密锁的接口任意访问加密锁。国外加密锁一般仅提供若干种算法,但好的加密锁不但可以向客户提供加密算法,也容许客户根据自己的意愿自定义加密算法,容许客户自定义用户ID号。但加密锁也是有一定欠缺的,由于加密锁利用的是计算机的打印口,而打印口原来是为打印机而设计的,软件锁一方面要保证用户加密操作的正确,同时也要保证打印机工作的正常。但由于打印机驱动程序设计上千差万别,没有任何一家的加密锁能够完全做到这一点。

  但这一问题现在有希望得到彻底的解决,那就是USB接口的加密锁。USB接口的加密锁不但拥有并口加密锁的所有优点,而且没有打印上的问题,其前景十分看好。但美中不足的是只有Windows 98和Windows 2000目前能够支持USB设备。

字串7



  由于软件锁加密目前是软件加密的主流方案,所以再特别讲一下软件锁加密的安全性问题。

  首先从软件锁的硬件方面进行研究。早先的软件锁由于硬件的加密程度不够,容易被破解。最近一年的软件锁设计大多采用了低电压CPU为基础的设计,CPU内部的程序由软件锁厂商自行写入,由于CPU内部的程序是一次写入而且不可修改、不可读出的,安全性也比较高,而且由于CPU程序是由软件锁生产厂家来写入,厂家可以根据自己的要求随时修改软件锁内部的程序,灵活性也比较高。

  其次我们从软件锁软件方面考虑一下。实际上大多数黑客攻击的只是软件锁和客户的软件方面,真正从硬件角度来破解软件锁的比较少。从结构上来说,一个使用软件锁进行加密的软件分为三个部分:1)软件锁的驱动程序部分;2)软件锁提供的负责同驱动程序进行通讯的具体语言模块(.OBJ、.DLL……);3)客户软件部分。前两部分都是由软件锁的厂家来完成的,都有不同程度的加密与反跟踪成分,不易被解密。客户软件部分相对比较简单,往往是黑客攻击的主要部分。软件锁的使用环节很.多,任何一个环节出了问题,都会造成整个加密方案的失败。而客户的使用方法往往是加密成败的关键,如果某个软件锁的访问最后能够归结为某个条件判别的话,那么一旦在这里被跳过,整个加密也就失去作用了。规划一套真正行之有效的加密方案,才能更好地发挥软件锁的保护功效。

字串2



  4. 光盘加密

  既然有软盘加密成功在先,为什么不能有光盘加密呢?但实际操作上确实是有一些问题的,因为光盘有ISO9660标准协议规定,其可控制性比软盘还要严格,想找出一种只能运行而不能复制的方式确实很困难。但现在确实已经有几家这样的产品出来了,而且加密方法也不尽相同。其主要原理是利用特殊的光盘母盘上的某些特征信息是不可再现的,而且这些特征信息大多是光盘上非数据性的内容,在光盘复制时复制不到的地方。因为投入是一次性的,对于大规模的生产这种加密方案可以将成本降得很低。而且软件数据和加密在同一载体上,对用户无疑是很方便的。但这是一种较新的加密方案,很多方面还需进一步验证。而且由于加密方式所.限,不可能在用户自己刻录的光盘上实现这种加密,必须是生产线上生产的光盘才能够实现。这对于一些小规模的软件生产厂商还是有一定困难的,而且由于光盘的只读性,一旦加密有错是无法修复的。

  二、不依赖硬件的加密方案

  所有的带有附加硬件设备的加密方案都有一定的加密成本在里面,对于那些价格高昂的软件当然无所谓,但对于那些共享软件或价格本身就很低的软件来说,硬件加密成本可能比软件本身的售价还高,所以近年来产生了很多软加密方案。

字串8



  1. 密码表加密

  在软件运行的开始要求用户根据屏幕的提示信息输入特定的答案,答案往往在用户手册上的一份防复印的密码表中。用户只有输入密码正确后才能够继续运行。这种加密方案实现简单,不需要太多的成本。但用户每次运行软件都要查找密码,不免使用户感到十分不便。像台湾的游戏大多采用此加密方式。而且往往有一些有耐心者把整个密码表输入到计算机中存成一个文件,同软件的盗版一同公布出来,让加密者无可奈何。基本上是一种防君子不防小人的加密方式。

  2. 序列号加密

  这种加密方式从某种角度来讲不是一套完整的加密方案,现今很多Shareware(共享软件)大多采用这种加密方式,用户在软件的试用期是不需要交费的,一旦试用期满还希望继续使用这个软件,就必须到软件公司进行注册,然后软件公司会根据你提交的信息(一般是用户的名字)来生成一个序列号,当你收到这个序列号以后,并在软件运行的时候输入.进去,软件会验证你的名字与序列号之间的关系是否正确,如果正确说明你已经购买了这个软件,也就没有日期的限制了。这种加密方案实现简单,而且购买过程也完全在Internet上实现,无论是开发者和购买者都觉得很方便。不过有心的人可能已经注意到软件的名字与序列号之间的验证是在你的计算机上完成的,很多黑客利用这个漏洞找出了名字和序列号之间的换算关系,编写出一种叫KeyMaker的程序,你只要输入你的名字,这个程序会帮助你计算出序列号,再将你的名字和这个序列号输入进软件中就变成正版软件了。而且也没有什么更好的方法来阻止用户扩散他注册后得到的序列号。 字串9

  3. 许可证加密

  这种方式从某种角度上可以说是序列号加密的一个变种,你从网上下载的或购买过来的软件并不能直接使用,软件在安装时或运行时会对你的计算机进行一番检测,并根据检测结果生成一个你的计算机的特定指纹,这个指纹可以是一个小文件,也可以是一串谁也看不懂的数,你需要把这个指纹数据通过Internet、E-mail、电话、传真等方式发送到开.发商那里,开发商再根据这个指纹给你一个注册码或注册文件,你得到这个注册码或注册文件并按软件要求的步骤在你的计算机上完成注册后方能使用。这个方法的买卖也是完全通过网络来进行的,而且用户购买的软件被限制只能在他自己的计算机上面运行,换到其他的计算机上,这个注册码或注册文件可能不再有效。但用户更换某些硬件设备也可能造成注册码的失效,而且用户得到软件后在完成注册工作前会有一段时间无法使用。

  加密方案涉及的主要技术

  1.外壳加密

  “外壳”这个词估计是中国人独创的,我觉得比较生动贴切,它的意思就是给可执行的文件加上一个外壳。用户执行的实际上是这个外壳的程序,而这个外壳程序负责把用户原来的程序在内存.中解开压缩,并把控制权交还给解开后的真正的程序,由于一切工作都是在内存中运行,用户根本不知道也不需要知道其运行过程,并且对执行速度没有什么影响。

字串8



  如果在外壳程序中加入对软件锁或钥匙盘的验证部分,它就是我们所说的外壳加密了。其实外壳加密的作用还不止于此,在Internet上面有很多程序是专门为加壳而设计的,它对程序进行压缩或根本不压缩,它的主要特点在于反跟踪,加密代码和数据,保护你的程序数据的完整性。如果你不希望你的程序代码被黑客修改,如果你的程序不希望被人跟踪调试,如果你的算法程序不想被别人静态分析,这种外壳程序就是为你设计的。

  需要注意的是,有很多网上免费的外壳加密程序兼容性很差,加密后的程序在某些计算机或某些操作系统下无法运行。

  2.序列号加密中的数学算法

  大多数软件加密本身的实现都是一种编程上的技巧。但近几年来随着序列号加密程序的普及,数学算法在软件加密中的比重越来越大了。

  我们先来看看在因特网上大行其道的序列号加密的工作原理。当用户从网络上下载某个Shareware—共享软件后,一般都有使用时间上的限制,当过了共享软件的试用期后,你必须到这个软件的公司去注册后方.能继续使用。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软件公司,软件公司会根据用户的信息计算出一个序列码出来,在用户得到这个序列码后,按照注册需要的步骤在软件中输入注册信息和注册码,其注册信息的合法性由软件验证通过后,软件就会取消掉本身的各种限制。 字串6

  软件验证序列号的合法性过程,其实就是验证用户名与序列号之间的换算关系是否正确的过程。现有的序列号加密算法大多是软件开发者自行设计的,大部分相当简单。而且有些算法作者虽然下了很大的工夫,但效果往往达不到它所希望的结果。其实现在有很多现成的加密算法可以使用,如RSADES、MD4、MD5……只不过这些算法是为了加密密文.或密码用的,同序列号加密多少有些不同,如果希望使用这些加密算法的话多少需要动点脑筋。我在这里试举一例,希望有抛砖引玉的作用:

  1)在软件程序中有一段加密过的密文S;

  2)密钥=F(用户名称,序列号); (用上面的二元算法得到密钥)

  3)明文D=F-DES(密文S,密钥); (用得到的密钥来解密密文得到明文D)

  4)CRC=F-CRC(明文D); (对得到的明文用各种CRC统计)

  5)检查CRC是否正确,最好多设计几种CRC算法,检查多个CRC结果是否都正确。

  用这种方法,在没有一个已知正确的序列号的情况下是永远推算不出正确的序列号的。

  3.解释、编译与反编译

  如果你设计了一种不希望别人知道的特有的算法,所采用的加密手段.往往同你的编程语言有很大的关系。对于解释语言与编译语言所编制出来的代码安全性上而言,可以说是各有优缺点。解释语言有一个致命的弱点,那就是解释语言的程序代码都是以伪码的方式存放的,一旦被人找到了伪码与源码之间的对应关系,就很容易做出一个反编译器出来,你的源程序等于被公开了一样。而编译语言因为直接把用户程序编译成机器码,再经过优化程序的优化,很难从程序返回到你的源程序的状态,但对于熟悉汇编语言的解密者来说,也很容易通过跟踪你的代码来确定某些代码的用途。

字串7



  根据我对各种具有反编译器的语言的了解,Visual Basic 5.0以上版本和C语言还没有反编译器。我的建议是:

  1)千万不能编制功能强大的子程序,如果你程序的一个子程序就能印钱的话,我就不需要看别的了。

  2)多用全局变量,最好是全局的临时变量,这个变量在每个子程序中的用法都不一样,程序结构可能不太好,但能造成牵一发而动全身的效果。

  3)如果能用C++的话,尽量用C++来编程,最好把你的算法全用类来实现,哪怕是一个加法减法也给它定义个类,再从子类上面继承继承再继承。

  4)编译后的程序不能小于500kB。

  4.CPU、操作系统与编程语言

  一个软件的加密性是否良好同具体的CPU、操作系统与.编程语言是有很大关系的。这里有个加密方面的摩尔定律,某种技术的普及化程度越高,那么它的加密性就越差。例如我用VB写一个程序,其中调用了大量的ActiveX、COM等控件,而且针对MMX、3DNow、SSE……做了具体的优化。这样的程序比完全用VC写的程序的安全性要好得多,因为这完全是一种纯技术上的比拼,如果某个黑客对VB,ActiveX,COM的技术及内部工作原理十分清楚的话,可能破解这种程序要比用VC编写的程序容易许多。如果说软件的加密性同软件的执行效率是不冲突的话,那么软件的加密性同软件的可移植性就很难共存了,因为你不可能希望一个能锁住所有门的锁有很好的安全性。不同的平台、不同的CPU都会产生不同的加密方式,但软件必然是在特定的CPU和操作系统平台上执行,针对特定平台的优化,不但是安全性的要求,更多的是执行效率上的考虑
字串2


  我们经常需要一种措施来保护我们的数据,防止被一些怀有不良用心的人所看到或者破坏。在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,造成破坏。在竞争激烈的大公司中,工业间谍经常会获取对方的情报。因此,在客观上就需要一种强有力的安全措施来保护机密数据不被窃取或篡改。数据加密与解密从宏观上讲是非常简单的,很容易理解。加密与解密的一些方法是非常直接的,很容易掌握,可以很方便的对机密数据进行加密和解密。

  一:数据加密方法

  在传统上,我们有几种方法来加密数据流。所有这些方法都可以用软件很容易的实现,但是当我们只知道密文的时候,是不容易破译这些加密算法的(当同时有原文和密文时,破译加密算法虽然也不是很容易,但已经是可能的了)。最好的加密算法对系统性能几乎没有影响,并且还可以带来其他内在的优点。例如,大家都知道的PKZIP,它既压缩数据又加密数据。又如,DBMS的一些软件包总是包含一些加密方法以使复制文件这一功能对一些敏感数据是无效的,或者需要用户的密码。所有这些加密算法都要有高效的加密和解密能力。

  幸运的是,在所有的加密算法中最简单的一种就是“置换表”算法,这种算法也能很好达到加密的需要。每一个数据段(总是一个字节)对应着“置换表”中的一个偏移量,偏移量所对应的值就输出成为加密后的文件。加密程序和解密程序都需要一个这样的“置换表”。事实上,80x86 CPU系列就有一个指令‘XLAT’在硬件级来完成这样的工作。这种加密算法比较简单,加密解密速度都很快,但是一旦这个“置换表”被对方获得,那这个加密方案就完全被识破了。更进一步讲,这种加密算法对.于黑客破译来讲是相当直接的,只要找到一个“置换表”就可以了。这种方法在计算机出现之前就已经被广泛的使用。
字串8


  对这种“置换表”方式的一个改进就是使用2个或者更多的“置换表”,这些表都是基于数据流中字节的位置的,或者基于数据流本身。这时,破译变的更加困难,因为黑客必须正确的做几次变换。通过使用更多的“置换表”,并且按伪随机的方式使用每个表,这种改进的加密方法已经变的很难破译。比如,我们可以对所有的偶数位置的数据使用A表,对所有的奇数位置使用B表,即使黑客获得了明文和密文,他想破译这个加密方案也是非常困难的,除非黑客确切的知道用了两张表。

  与使用“置换表”相类似,“变换数据位置”也在计算机加密中使用。但是,这需要更多的执行时间。从输入中读入明文放到一个buffer中,再在buffer中对他们重排序,然后按这个顺序再输出。解密程序按相反的顺序还原数据。这种方法总是和一些别的加密算法混合使用,这就使得破译变的特别的困难,几乎有些不可能了。例如,有这样一个词,变换起字母的顺序,slient 可以变为listen,但所有的字母都没有变化,没有增加也没有减少,但是字母之间的顺序已经变化了。

  但是,还有一种更好的加密算法,只有计算机可以做,就是字/字节循环移位和XOR操作。如果我们把一个字或字节在一个数据流内做循环移位,使用多个或变化的方向(左移或右移),就可以迅速的.产生一个加密的数据流。这种方法是很好的,破译它就更加困难!而且,更进一步的是,如果再使用XOR操作,按位做异或操作,就就使破译密码更加困难了。如果再使用伪随机的方法,这涉及到要产生一系列的数字,我们可以使用Fibbonaci数列。对数列所产生的数做模运算(例如模3),得到一个结果,然后循环移位这个结果的次数,将使破译次密码变的几乎不可能!但是,使用Fibbonaci数列这种伪随机的方式所产生的密码对我们的解密程序来讲是非常容易的。
字串5


  在一些情况下,我们想能够知道数据是否已经被篡改了或被破坏了,这时就需要产生一些校验码,并且把这些校验码插入到数据流中。这样做对数据的防伪与程序本身都是有好处的。但是感染计算机程序的病毒才不会在意这些数据或程序是否加过密,是否有数字签名。所以,加密程序在每次load到内存要开始执行时,都要检查一下本身是否被病毒感染,对与需要加、解密的文件都要做这种检查!很自然,这样一种方法体制应该保密的,因为病毒程序的编写者将会利用这些来破坏别人的程序或数据。因此,在一些反病毒或杀病毒软件中一定要使用加密技术。

  循环冗余校验是一种典型的校验数据的方法。对于每一个数据块,它使用位循环移位和XOR操作来产生一个16位或32位的校验和 ,这使得丢失一位或两个位的错误一定会导致校验和出错。这种方式很久以来就应用于文件的传输,例如 XMODEM-CRC。 这是方法已经成为标准,而且有详细的文档。但是,基于标准CRC算法的一种修改算法对于发现加密数据块中的错误和文件是否被病毒感染是很有效的。

  
共2页: 上一页 1 [2] 下一页
Tags:加密 方案
来源:
您的评论
用户名:新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为