加解密算法的概述和总结

加解密算法的概述和总结

一.单向散列算法

也称为Hash(哈希)算法。是一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(该过程不可逆)。Hash函数可用于数字签名、消息的完整性检测、消息起源的认证检测等。常见的散列算法有MD5、SHA、RIPE-MD、HAVAL、N-Hash、Tiger等。

1. MD5算法

MD5消息摘要算法(Message Digest Algorithm)。对输入的任意长度的消息进行运算,产生一个128位的消息摘要。
用到4个常量初始化数据:A=01234567h,B=89abcdefh,C=fedcba98h,D=76543210h。可以使用其他数据作为变形。

2. SHA算法

安全散列算法(Secure Hash Algorithm)简称SHA。有SHA-1、SHA-256、SHA-384、SHA-512几种,分别产生160位、256位、384位和512位的散列值。

2.1 SHA-1算法

是一种主流的散列加密算法,设计时基于和MD4相同的原理,并模仿了该算法。消息分组和填充方式与MD5相同。也用到了一些常量做初始化数据。
总结,随着密码分析技术的发展,现有的散列算法都是不安全的。如SHA-160、MD5、RIPEMD、HAVAL、Tiger在某些条件下能构造出碰撞。建议选择SHA-256//384/512,或者Whirlpool。如果在解密时碰到Hash算法,一般只需根据每种Hash算法的特征搞清楚具体哪一种Hash算法以及是否为某种算法的变形,继而通过该Hash的源代码即可**。

二.对称加密算法

加***和解***是完全相同的。其安全性依赖于:1.加密算法足够强;2.**的秘密性。
常见的对称分组加密算法有DES(Data Encryption Standard)、IDEA(International Data Encryption Algorithm)、AES(Advanced Encryption Standard)、BlowFish、Twofish等。

1. RC4流密码

现今最为流行的流密码,应用于SSL(Secure Sockes Layer)、WEP。RC4生成一种称为**流的伪随机流,它同明文通过异或操作相混合以达到加密的目的。解密时,同密文进行异或操作。其**流的生成有两部分组成:KSA(the Key-Scheduling Algorithm)和PRGA(the Pseudo-Random Generation Algorithm)。由于RC4算法加密采用XOR,所以一旦**序列出现重复,密文就有可能被**。推荐使用RC4算法时,必须对加***进行测试,判断其是否为弱**。

2. TEA算法

TEA(Tiny Encryption Algorithm)算法。分组长度为64位,**长度为128位。采用Feistel网络。其作者推荐使用32次循环加密,即64轮。TEA算法简单易懂,容易实现。但存在很大的缺陷,如相关**攻击。由此提出一些改进算法,如XTEA。

3. IDEA算法

IDEA(International Data Encryption Algorithm)国际数据加密算法。分组密码IDEA明文和密文的分组长度为64位,**长度为128位。该算法的特点是使用了3种不同的代数群上的操作。IDEA共使用52个16位的子**,由输入的128位**生成。加密过程由8个相同的加密步骤(加密轮函数)和一个输出变换组成。而解密过程与加密过程相同。解密与加密唯一不同的地方就是使用不同的子**。首先,解密所用的52个子**是加密的子**的相应于不同操作运算的逆元,其次,解密时子**必须以相反的顺序使用。

4. BlowFish算法

BlowFish算法是一个64位分组及可变**长度的分组密码算法,该算法是非专利的。BlowFish算法基于Feistel网络(替换/置换网络的典型代表),加密函数迭代执行16轮。分组长度为64位(bit),**长度可以从32位到448位。算法由两部分组成:**扩展部分和数据加密部分。**扩展部分将最长为448位的**转化为共4168字节长度的子**数组。其中,数据加密由一个16轮的Feistel网络完成。每一轮由一个**相关置换和一个**与数据相关的替换组成。

5. AES算法

AES(Advanced Encryption Standard,高级加密标准),用于替代DES成为新一代的加密标准。具有128比特的分组长度,并支持128、192和256比特的**长度,可在全世界范围内免费得到。其前身为Rijndael(读作:Rain Doll)。Rijndael算法与AES的唯一区别在于各自所支持的分组长度和密码**长度的反胃不同。Rijndael是具有可变分组长度和可变**长度的分组密码,其分组长度和**长度均可独立地设定为32比特的任意倍数,最小值128bit,最大256bit。而AES将分组长度固定为128位,而且仅支持128、192和256位的**长度,分别称为AES-128,AES-192,AES-256。

三.公开**加密算法

又称为非对称加密算法(Asymmetric Key Cryptography),即使用公钥(Public Key)加密,使用私钥(Private Key)解密。

1. RSA算法

RSA是第一个既能用于数据加密也能用于数字签名的算法,易于理解和操作,应用广泛。RSA的安全性依赖于大整数因子分解。目前来看,攻击RSA算法最有效的方法便是分解模n。一般认为RSA需要1024位或更长的魔术才有安全保障。

2. ElGamal公钥算法

其完全依赖于在有限域上计算离散对数的困难性。ElGamal的一个不足之处是密文的长度是明文的两倍。而另一种签名算法,Schnorr签名系统的密文比较短,这是由其系统内的单向散列函数决定的。

3. DSA数字签名算法

是在借鉴了ElGamal及Schnorr签名算法的基础上,公布的数字签名标准(Digital Signature Standard),该标准采用的算法为DSA(Digital Signature Algorithm)。其安全性同样基于有限域的离散对数问题。目前DSA的应用越来越广泛。

4. 椭圆曲线密码编码学(Elliptic Curve Cryptography)

相比RSA等公钥算法,使用较短的**长度而能得到相同程度的安全性。预测未来ECC(Elliptic Curve Cryptography)将会取代RSA成为主流的**算法。

四.其他算法

1. CRC32算法

CRC(Cyclic Redundancy Checksum 或者 Cyclic Redundancy Check),是对数据的校验值,中文为“循环冗余校验码”,常用语校验数据完整性。最常见的CRC是CRC32,即数据校验值为32位。CRC32代码量小,容易理解,所以目前应用十分广泛。但同时CRC32并不是一个安全的加密算法。如果需要更安全的完整性校验算法,建议使用数字签名技术。

2. Base64编码

Base64编码是将二进制数据编码为可现实的字母和数字,用于传送图形、声音和传真等非文本数据。常用于MIME电子邮件格式中。其使用含有65个字符的ASCII字符集(第65个字符为“=”,用于对字符串的特殊处理过程),并用6个进制位表示一个可显示字符。
把数据编码为Base64,将第一个字节放置于24位缓冲区的高8位,第二个字节放置于中间的8位,第三个字节放置于低8位。如果是少于3个字节的数据,相应的缓冲区置0。然后对24位缓冲区以6位为一组作为索引,高位优先,从字符串“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789+/”中取出相应的元素作为输出。如果仅有一个或两个字节输入,那么只使用输出的两个或三个字符,其余的用“=”填充。
解码过程是编码的逆过程。首先得到Base64字符串的每个字符在Base64码表中的索引,然后将这些索引的二进制连接起来,重新以8位为一组进行分组,即可得到源码。
Base24码表:
BCDFGHJKMPQRTVWXY2346789
Base32码表:
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
Base60码表:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwx
Windows产品***就是使用Base24编码。实际使用时,码表会和标准码表不一样,但原理相同。

五.常见的加密库

1. Miracl大数运算库

Miracl(Multiprecision Integer and Rational Arithmetic C/C++ Library),多精度整数和有理数算术运算C/C++库。它是一个大数库,实现了设计使用大数的加密技术的最基本的函数。支持RSA公钥系统、Diffie-Hellman**交换、DSA数字签名系统及基于GF(p)和GF(2m)的椭圆曲线加密系统。其提供了C和C++两种接口,使用方便,速度快,开源。

2. FGInt

FGInt(Fast Gigantic Integers),是用于Delphi的一种可以实现常见的公钥加密系统的库。

3. freeLIP

最初设计用于进行RSA-129挑战大数计算的大数库,采用2的30次方进制来表示大数,速度不及miracl。

4. Crypto++

一个实现了相当数量的加密算法的加密库。使用了C++的高级语法,文档较少,不易上手。

5. LibTomCrypt

一款相当不错的加密算法库。包括了常见的散列算法、对称算法及公钥加密系统。接口友好,非常适合C程序员使用。

6. GMP

全称GNU Multiple Precision Arithmetic Library。其核心采用汇编实现,速度非常快,超过miracl,常用来实现大整数因子的分解。

7. OpenSSL

主要用于网络安全,也包含了一些加密算法的实现。如对称算法中的BlowFish、IDEA、DES、CAST,公钥中的RSA、DSA,散列中的MD5、RIPEMD、SHA等。

8. DCP和DEC

DCP全称Delphi Cryptography Package,DEC全称Delphi Encryption Compendium,都是用于Delphi的一种加密算法库。这两个算法库实现了大部分常见的散列算法及对称算法,使用方便。

9. Microsoft Crypto API

是微软为了方便程序员在软件中进行数字签名、数据加密的开发而提供的一套加密系统。接口友好方便。

10. NTL

是一个可以用于数论相关计算的库。提供了非常友好的C++接口,用于实现有符号的、算术整数的运算,以及向量、矩阵、基于有限域和整数的多项式运算。在密码学中,有限域的应用相当广泛,如AES、twofish、ECC等都涉及有限域。

六.算法测试

2.1 测试方法
测试范围 :常见的数据校验、摘要算法,主要有 CRC32、MD5、SHA1、SHA256、SHA384、SHA512
样本数据 :2G大小Vmware 虚拟机操作系统的磁盘文件,其中包含其中各种类型的文件,如二进制文件和文本文件等。
软件平台 :Windows、.NET Framework 2.0
硬件平台 :
机器A(SCSI Disk):软件配置 Windows 2000 + .Net Framework 2.0;硬件配置 CPU:4 (Xeon),2.8G,RAM:2G ,HD:70 GB SCSI
机器B(IDE Disk):软件配置 Windows 2003 + .Net Framework 2.0;硬件配置 CPU:1 (P4),2.8G,RAM:1G,HD:40 GB IDE
  考虑到整个测试过程只是涉及到文件读取与哈希值的计算,并无过多的与操作系统、软件平台、开发语言相关的操作,因此可以认为上述测试方法的结果具有普遍性,即也适用于其它操作系统平台(如Linux/Unix)或应用语言/平台(C、Java)。

2.2 测试结果

  1)不同配置机器间的对比

  在不同机器配置上的平均运算结果如下表所示:

加解密算法的概述和总结

  注1:配有SCSI磁盘的机器运行时间反而比 IDE 磁盘时间长,可能是由于前者具有较多的应用负载造成的,如Oracle、WebSphere等,而且其OS为 Windows 2000,在之上运行 .NET 应用程序可能与 Windows 2003 的效率有所差别

  注2:上述算法中,只有 CRC32 没有包含在.NET Framework 中,而是使用C#单独实现的,因此可能会对其测试结果带来一些影响。

  2)不同算法的CPU占用率比较

  在不同的算法运行时,在机器B上监控其对于 CPU 的平均使用时间,结果如下表所示:
加解密算法的概述和总结

3、实验结论
数据摘要算法的处理是很快的,在一般配置的PC机上使用MD5算法,处理1G的文件数据只需20-30秒(有些专用设备声称达 3GB/秒),不会对应用或机器带来过多负载
MD5、SHA1虽然被发现存在缺陷(碰撞),但在近几年内,仍然可以大量使用
SHA256/384/512 的速度较慢,可以用于少量数据摘要,目前不适合用于大文件校验
  CRC32为32bit的简单hash,MD5为128bit较复杂的hash算法。直觉上貌似CRC32的计算速度要比MD5快的。今天用FlexHEX计算大文件的hash时发现CRC32相对MD5并没有明显优势。

  实验发现:Linux操作系统下用md5sum和cksum取文件哈希:MD5仅花费CRC32时间的72%左右。

MD5计算速度要明显优于CRC32!

七.MD5、SHA-1、CRC32区别

经常有人问,说CRC、MD5、SHA1都是计算一个校验值的,到底有何区别?
相同点:
CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。

不同点:
1. 算法不同。CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法;

  1. 校验值的长度不同。CRC校验位的长度跟其多项式有关系,一般为16位或32位;MD5是16个字节(128位);SHA1是20个字节(160位);

  2. 校验值的称呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值(Hash)或散列值;

  3. 安全性不同。这里的安全性是指检错的能力,即数据的错误能通过校验位检测出来。CRC的安全性跟多项式有很大关系,相对于MD5和SHA1要弱很多;MD5的安全性很高,不过大概在04年的时候被山东大学的王小云**了;SHA1的安全性最高。

  4. 效率不同,CRC的计算效率很高;MD5和SHA1比较慢。

  5. 用途不同。CRC一般用作通信数据的校验;MD5和SHA1用于安全(Security)领域,比如文件校验、数字签名等。


Reference:
http://blog.chinaunix.net/uid-11582448-id-3058813.html
http://blog.csdn.net/xiaofei0859/article/details/52683533
http://blog.csdn.net/lvxiangan/article/details/56677376