本篇文章主要介绍一下常见的加密算法种类,并且解析一下各个算法的应用场景以及优缺利弊。


加密技术分类

首先,我们了解一下什么是加密技术?简单来说,加密技术就是利用技术手段把重要的数据变为乱码(加密),当需要使用时再用相同或不同的手段还原(解密)。我们常用加密技术通常分为两大类:”对称式”和”非对称式”,当然还有“散列算法”。

1.对称加密算法

对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。

示意图
示意图

下面介绍一下主流的对称加密算法:

(1) DES

DES(Data Encryption Standard):研究过加密的朋友十分熟悉,老牌的加密方法了。这是一个可逆的对称加密算法,也是应用最广泛的密钥系统。好像是从1977年美国政府开始采用的。大家都看过U-571吧,DES的思路就是参照二战时期盟军缴获的德军恩格玛加密机,不过DES比那个要牛多了。到现在为止,除了差分分析法和线性分析法外只有暴力穷举法了。前两种方法不是密码学家或数学家都不懂,不过穷举DES,以现有我们大家都可以掌握的技术手段,恐怕没个几百上千年下不来啊。不过,咱们破解不了,不能说明就没人或没有设备破解不了。正因为如此,所以才衍生出了3重DES加密。常规的DES密钥是64位的(实际上有8位是校验用),而3DES是128位(当然有16位也是校验用)。增加密钥长度并增加运算量来防止破解,并在后来的AES出来之前确定为过度方案。不过现在即便有了AES3DES也没少用,它依然很牛。

(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):椭圆曲线密码编码学。ECCRSA相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSADSA要快得多。存储空间占用小。ECC的密钥尺寸和系统参数与RSADSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在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依然可用,只不过再加上3DES、AESSHA来防止字典就更好了。

(2) SHA

SHA:SHA家族的五个算法,分别是SHA-1SHA-224SHA-256SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLSSSLPGPSSHS/MIMEIPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1MD5一样,也被王小云教授找出杂凑冲撞的漏洞,并且在2017年Google也强势宣布成功攻破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.对称加密算法(加解密密钥相同)

名称密钥长度运算速度安全性资源消耗
DES56位较快
3DES112位或168位
AES128、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


总结

  1. 加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。
  2. 对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
  3. 非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
  4. Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64
    编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。
  5. https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
  6. 大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
  7. MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32位MD5散列中把中间16位提取出来);sha1标准密钥长度160
    位(比MD5摘要长32位),Base64转换后的字符串理论上将要比原来的长1/3。