常用的加密算法分析

对称加密

常见的对称加密算法有DES,3DES和AES。他们使用的都是Feistel结构

DES即Data Encryption Standard,由于其使用了过短的key(有效为只有56bits,可被暴力破解),出于安全原因已经不推荐使用。

3DES即同样使用DES的实现,但是使用不同key进行3次链式加密,因此相对于DES更为安全。然而由于DES本身是基于硬件的设计,在软件上的效率太低,3DES采用同样的实现则效率更低。

AES即新一代的Advanced Encryption Standard。AES可以使用128,192或256bits的不同key,目前认为128bits已经足够安全。此外相较3DES或者其他参与NIST竞争的参赛算法性能更好。

非对称加密

常见的非对称加密算法有RSA,DSA和ECC。

RSA是利用了两个质数相乘比较容易,但是对一个大整数进行因数分解非常困难的特点来保证安全性。具体原理可以参考这篇博文。越长的密钥则越安全,2009年公开记录的被破解的密钥长度为768位,因此建议使用1024位甚至2048位的密钥长度。

ECC椭圆曲线加密也是建立在另外一个数学难题上:在射影坐标系上,给定椭圆曲线上的一个点G,给定一个整数k,进行乘法计算求K=kG比较容易;反过来,给定椭圆曲线上的两个点K和G,求k使得K=kG则非常困难。具体原理可以参考这篇博文

RSA在使用较长的密钥长度比如1024或2058位时,加解密的速度大大降低。ECC则具有每比特最高的安全度,其210位的密钥长度安全性相当于2048位的RSA。此外,在CPU和内存消耗方便ECC也比较有优势。

在对大量数据进行处理时,非对称加密相较对称加密而言,效率非常低下;另外非对称加密算法对加密内容的长度有限制,不能超过公钥的长度。因此常用的做法是结合两者一起使用。先使用对称加密如AES对明文进行加密,而后采用非对称加密如ECC对AES的密钥进行加密,这样可以在安全和性能上达到较好的效果

摘要算法

也称HASH算法,从明文生成固定长度的散列值,同时保证不同的输入得到唯一的输出(几率非常小,可参考[哈希碰撞])。
常用的摘要算法有MD5和SHA。
MD5算法和SHA-1算法已经被证明不再安全,不推荐使用。目前NIST建议使用的为SHA-256

同态加密

同态加密是指对密文进行处理得到的结果与对明文进行处理后再加密得到的结果相同。

同态性包括加法同态,乘法同态,减法同态与除法同态。

同时满足加法同态和乘法同态则成为全同态,同时满足四种则成为算数同态。

第一个全同态算法在2009年被Craig Gentry证明,但目前由于需要消耗大量的计算时间,尚且达不到实际应用的水平。

零知识证明

数字证书

数字证书是由可信任的CA机构(Certificate Authority)颁发的,一般包含服务器的公钥,名称以及CA的数字签名。CA为使用非对称加密的服务器发放数字证书,以证明该证书中的公钥匙合法有效的,通常用来防止中间人攻击。

实际应用

HTTPS

具体原理可参考这篇博文

为了保证来自服务器的公钥不被篡改,利用数字证书来保证其有效性。
在实际传输过程中,若使用非对称加密则效率不够高效;因此在握手阶段会产生一个“对话密钥”(session key)用于信息的对称加密,而服务器公钥则用来加密对话密钥本身。

在HTTPS的TLS握手阶段,使用了非对称加密来保证信息传输的安全,具体步骤如下:

  1. 客户端发起请求,并提供如下信息:
    • 客户端支持的协议版本,如TLS 1.2
    • 客户端支持的加密算法
    • 客户端生成的随机数r1
  2. 服务器收到请求,并返回如下信息:
    • 确认使用的协议版本
    • 确认使用的加密算法
    • 服务器端生成的随机数r2
    • 服务器证书(包含了公钥)
  3. 客户端收到服务器回应,首先验证服务器证书是否有效,然后继续发送以下信息:
    • 客户端生成的随机数r3,并用服务器公钥进行加密(之前的随机数都是明文传输)
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
    • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验
  4. 服务器收到请求,则返回:
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
    • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验
  5. 至此,握手阶段结束,客户端与服务器端同时拥有三个随机数r1,r2,r3。根据握手阶段商定好的加密算法来生成后续对话的对话密钥,用来加密具体的传输内容

目前大部分网站使用的的非对称加密算法为2048位的RSA,ECC暂时还没大规模普及,但很多CA已经提供ECDSA证书。
具体的传输内容是通过session key来进行加密的,目前最广泛使用的是AES算法。

SSH

SSH同样使用了非对称加密。
用户通过把自己的公钥存储到远程主机上,在登录时,远程主机发送一个随机数,用户用私钥加密并传给远程主机,如果远程主机用公钥可以解密并匹配上就可以登录成功

bitcoin

比特币中的非对称算法采用的是secp256k1 ECDSA。其中私钥是使用SHA-256生成的32字节的随机数。通过私钥得到公钥后,经过双哈希(SHA256, RIPPLE160)和BASE58CHECK编码生成地址,即可进行交易。