本篇文章主要介绍一下常见的加密算法种类,并且解析一下各个算法的应用场景以及优缺利弊。
加密技术分类
首先,我们了解一下什么是加密技术?简单来说,加密技术就是利用技术手段把重要的数据变为乱码(加密),当需要使用时再用相同或不同的手段还原(解密)。我们常用加密技术通常分为两大类:”对称式”和”非对称式”,当然还有“散列算法”。
1.对称加密算法
对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。

下面介绍一下主流的对称加密算法:
(1) DES
DES(Data Encryption Standard):研究过加密的朋友十分熟悉,老牌的加密方法了。这是一个可逆的对称加密算法,也是应用最广泛的密钥系统。好像是从1977年美国政府开始采用的。大家都看过U-571吧,
DES
的思路就是参照二战时期盟军缴获的德军恩格玛加密机,不过DES
比那个要牛多了。到现在为止,除了差分分析法和线性分析法外只有暴力穷举法了。前两种方法不是密码学家或数学家都不懂,不过穷举DES
,以现有我们大家都可以掌握的技术手段,恐怕没个几百上千年下不来啊。不过,咱们破解不了,不能说明就没人或没有设备破解不了。正因为如此,所以才衍生出了3重DES
加密。常规的DES
密钥是64位的(实际上有8位是校验用),而3DES
是128位(当然有16位也是校验用)。增加密钥长度并增加运算量来防止破解,并在后来的AES
出来之前确定为过度方案。不过现在即便有了AES
,3DES
也没少用,它依然很牛。
(2) 3DES
3DES(Triple DES):是基于
DES
,对一块数据用三个不同的密钥进行三次加密,强度更高。
(3) AES
AES(Advanced Encryption Standard):高级加密标准,也叫
Rijndael
算法,是下一代的加密算法标准,用来代替原来的DES
加密方法的,优点是速度快,安全级别高。。AES
是一个使用128为分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。众所周之AES
是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES
适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID
系统。
(4) Blowfish
它使用变长的密钥,长度可达448位,运行速度很快。
(5) RC2、RC4
对称算法,用变长密钥对大量数据进行加密,比
DES
快。
(6) RC6
RC6:有个算法
RC4
听说过吧,在无线传输和串行流传输的加密领域占有相当的分量。据说RC6
是同一帮人研究出来的,不过它和RC4
没太大关系啊。它是AES
方案征集时的候选算法之一,但是没有Rijndael
算法那么幸运。RC6
据说可以抵抗所有已知的攻击,并能够提供AES
所要求的安全性,它也是相当优秀的一种可逆加密算法。不过当初它为什么没能当选为AES
算法就不得而知了,不知道当时有没有给评委们足够的商务费用啊。
(7) SM4
国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用
2.非对称加密算法
非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为”公钥”和”私钥”,它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

下面介绍一下主流的对称加密算法:
(1) RSA
RSA:由
RSA
公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。RSA
在国外早已进入实用阶段,已研制出多种高速的RSA
的专用芯片。
(2) DSA
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的
DSS
(数字签名标准),严格来说不算加密算法。
(3) ECC
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
ECC
和RSA
相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC
总的速度比RSA
、DSA
要快得多。存储空间占用小。ECC
的密钥尺寸和系统参数与RSA
、DSA
相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC
卡上的应用具有特别重要的意义。带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC
带宽要求却低得多。带宽要求低使ECC
在无线网络领域具有广泛的应用前景。
(4) Elgamal
(5) 背包算法
(6) Rabin
(7) D-H
(8) SM2
国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用
3.散列算法
散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(
Hash
)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的”散列”或”消息摘要”(Message digest)
。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是用于签名。主要用于验证,防止信息被修。具体用途如:文件校验、数字签名、鉴权协议等。下面介绍一下主流的散列算法:
(1) MD5
MD5:非常著名的哈希算法,不可逆算法。网站登录、操作系统的用户认证、文件完整性和数字签名等领域广泛应用。不可逆算法一般做的都比较绝,例如彩虹加密狗,只告诉你一个余数,你能知道原来的除数和被除数吗?只把运算过的数据相比较,而不非得知道原数据,这样就完成了认证过程。要想破解
MD5
的密码,即使采用现在最快的巨型计算机,据说也要运算100万年以上。不过,加密和解密都是数学领域的竞赛,每一种加密算法都或多或少的存在漏洞或缺陷,MD5
看上去真那么牢不可破吗?和MD5
同样有名的是山东大学的王小云教授。在2004年的国际密码大会上王小云宣布了她的研究小组完成了对MD5
杂凑函数的杂凑冲撞,也就是从理论上说使用MD5的数字签名可以伪造。这也意味着MD5可能需要和其他加密算法共用才可以保证数字签名的安全。不过,说MD5
已被破解,那也有些杞人忧天了。可以肯定的告诉你,网络上所有针对MD5
提供的破解服务,全部都是查询用字典法暴力破解后的数据包,没有一个是真正伪造出来的数字签名,那些号称有几百亿条的记录对MD5
庞大算法来说太小了。试想想,动用美国军方的巨型计算机,利用王小云研究理论,来破解我们的一个单片机或网站认证程序?没必要吧。所以MD5依然可用,只不过再加上3DE
S、AES
或SHA
来防止字典就更好了。
(2) SHA
SHA:
SHA
家族的五个算法,分别是SHA-1
、SHA-224
、SHA-256
、SHA-384
,和SHA-512
,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1
在许多安全协定中广为使用,包括TLS
和SSL
、PGP
、SSH
、S/MIME
和IPsec
,曾被视为是MD5
(更早之前被广为使用的杂凑函数)的后继者。但SHA-1
和MD5
一样,也被王小云教授找出杂凑冲撞的漏洞,并且在2017年SHA-1
加密,不过这些都是停留在理论上的,必经碰撞破解是要花费很高的代价的。举个栗子:“100个GPU大约需要计算一年,大概要花费几十万美元”,当然如果你有钱那也是可以的。不过话虽如此,使用SHA-256
将是以后的趋势。
(3) HMAC
HMAC:是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),
HMAC
运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC
是需要一个密钥的。所以,HMAC_SHA1
也是需要一个密钥的,而SHA1
不需要。
4.其他常用算法
(1) Base64
Base64:其实不是安全领域下的加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/,共64个字符(26 + 26 + 10 + 1 + 1 = 64,其实是65个字符,“=”是填充字符。
Base64
要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64
编码会以一个或两个等号结束的原因,中间是不可能出现等号的,但等号最多只有两个。其实不用”=”也不耽误解码,之所以用”=”,可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。)
Base64
编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生Base64
字符也不一样。例如”上网”对应UTF-8
格式的Base64
编码是”5LiK572R”,对应GB2312
格式的Base64
编码是”yc/N+A==”。
标准的
Base64
并不适合直接放在URL里传输,因为URL编码器会把标准Base64
中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。为解决此问题,可采用一种用于URL的改进Base64
编码,它不在末尾填充’=’号,并将标准Base64
中的“+”和“/”分别改成了“-”和“”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。另有一种用于正则表达式的改进Base64
变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“:”(用于XML中的Name)。
(2) TEA
TEA:它是一种分组加密算法,也是可逆算法。短小精悍。它的实现非常简单,超不过10行代码。
TEA
算法每一次可以操作64位(8字节),采用128位(16字节)作为密钥,算法采用迭代的形式,尽管32轮迭代已经足够了,但是最好的迭代轮数是64轮。数据流加密可能比较适合,因为据说早期的QQ采用过TEA
加密算法。
加密算法比较
1.对称加密算法(加解密密钥相同)
名称 | 密钥长度 | 运算速度 | 安全性 | 资源消耗 |
---|---|---|---|---|
DES | 56位 | 较快 | 低 | 中 |
3DES | 112位或168位 | 慢 | 中 | 高 |
AES | 128、192、256位 | 快 | 高 | 低 |
2.非对称算法(加密密钥和解密密钥不同)
名称 | 成熟度 | 安全性(取决于密钥长度) | 运算速度 | 资源消耗 |
---|---|---|---|---|
RSA | 高 | 高 | 慢 | 高 |
DSA | 高 | 高 | 慢 | 只能用于数字签名 |
ECC | 低 | 高 | 快 | 低(计算量小,存储空间占用小,带宽要求低) |
3.散列算法
名称 | 安全性 | 速度 |
---|---|---|
SHA-1 | 高 | 慢 |
MD5 | 中 | 快 |
4.对称与非对称算法
名称 | 密钥管理 | 安全性 | 速度 |
---|---|---|---|
对称算法 | 比较难,不适合互联网,一般用于内部系统 | 中 | 快,好几个数量级(软件加解密速度至少快100倍,每秒可以加解密数M比特数据),适合大数据量的加解密处 |
非对称算法 | 密钥容易管理 | 高 | 慢,适合小数据量加解密或数据签名 |
加密算法选择(从性能和安全性综合)
对称加密:
AES
(128位)
非对称加密:
ECC
(160位)、RSA
(1024)
消息摘要:
MD5
数字签名:
DSA
速度排名(估测,未验证):
IDEA
<DES
<GASTI28
<GOST
<AES
<RC4
<TEA
<Blowfish
总结
- 加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。
- 对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
- 非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
- Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64
编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。- https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
- 大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
- MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32位MD5散列中把中间16位提取出来);sha1标准密钥长度160
位(比MD5摘要长32位),Base64转换后的字符串理论上将要比原来的长1/3。