加密算法简介

2014-06-01 security

开放网络中数据传输的安全性一直是一个热门的话题,特别是电子商务兴起的今天,各种攻击欺骗手段更是层出不穷,安全的网络传输需求愈显重要,而这就是所谓的密码学涉及的内容。

通过一些加密算法,保证网络上数据传输的安全性,在此介绍一些常见的加密算法及其使用场景等。

对称加密

也就是 symmetric-key encryption,其中常见的算法包括了 AES、DES、3DES 等。

对称加密指的是可以使用同一个密钥对内容进行加密和解密,相比非对称加密,它的特点是加/解密速度快,并且加密的内容长度几乎没有限制。

encrypt symmetric key

DES 是一种分组数据加密技术,也即先将数据分成固定长度的小数据块,然后进行加密,速度较快,适用于大量数据加密。3DES 是一种基于 DES 的加密算法,使用 3 个不同密匙对同一个分组数据块进行 3 次加密,从而密文强度更高。

相较于 DES/3DES 而言,AES 算法有着更高的速度和资源使用效率,安全级别也更高了,被称为下一代加密标准。

非对称加密/公钥加密

也就是 asymmetric/public-key encryption,常见的加密算法有 RSA、DSA、ECC 等。

非对称加密有两个密钥,分别为公钥和私钥,其中公钥公开给所有人,私钥永远只能自己知道。

encrypt asymmetric key

使用公钥加密的信息只能使用私钥解密,使用私钥加密只能使用公钥解密。前者用来传输需要保密的信息,因为全世界只有知道对应私钥的人才可以解密;后者用来作数字签名,因为公钥对所有人公开的,可以用来确认这个信息是否是从私钥的拥有者发出的。

其中 RSA 和 DSA 的安全性及其它各方面性能相似,而 ECC 较之则有很多性能优越,包括处理速度、带宽要求、存储空间等。

PS. 理论上来说,无法通过公钥算出私钥,或者说以现在的计算能力需要几亿万年才能算出来。

安全散列算法

也就是 Secure Hash Algorithm,常见的算法包括了 MD5、SHA1、HMAC 等。

将任意长度的二进制值映射为较短的固定长度的二进制值,这个短的二进制值称为哈希值,这个算法具有不可逆、碰撞低等特性。同时该类算法可以用作数字签名,用来证实某个信息确实是由某个人发出的,同时可以保证信息没有被修改。

实际上,简单来说,这种算法有两个特性:A) 不同的输入一定得出不同的 hash 值;B) 无法从 hash 值倒推出原来的输入。

encrypt digital signature

数字签名通常先使用一个 Hash 函数或者消息摘要算法,获得可以唯一对应原信息的摘要信息,然后通过私钥加密。这样其它人就可以通过公钥解密摘要信息,然后使用同样的算法对接收到的信息计算摘要,如果两者获得的摘要信息相同即可。

在数据传输前,使用 MD5 和 SHA1 算法需要发送和接收方在数据传送之前就知道密匙生成算法,而 HMAC 需要生成一个密匙,发送方用此密匙对数据进行摘要处理,接收方再利用此密匙对接收到的数据进行摘要处理,再判断生成的密文是否相同。

简介

MD5 的全称是 Message-Digest Algorithm 5 (信息-摘要算法),128 位长度,目前 MD5 是一种不可逆算法,具有很高的安全性,它对应任何字符串都可以加密成一段唯一的固定长度的代码。

SHA1 的全称是 Secure Hash Algorithm (安全哈希算法) ,SHA1 基于 MD5,加密后的数据长度更长,它对长度小于 264 的输入,产生长度为 160bit 的散列值。

另外,Python 内置的 hashlib 模块就包括了 md5 和 sha1 算法,而且使用起来也极为方便。

其它

简单介绍一下一些常见的使用内容。

选择密钥长度

如果在选定了加密算法后,那采用多少位的密钥呢?

一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA 建议采用 1024 位的数字,ECC 建议采用 160 位,AES 采用 128 位即可。

常见的加密算法速度可以参考如下。

encrypt truecrypt speedtest

如果只是加密一段信息,也不是经常需要,那可以用最强的加密算法,甚至也可以用不同的算法加密两次。如果想要加密速度快点,那就用 AES 。

RADIX64 BASE64

PGP 和 S/MIME 均使用了 Radix-64 编码,而该编码实际是基于 Base64。由两部分构成,分别是 Base64 编码后的数据和一个 CRC(24-bits) 校验和。

Base64 是使用 64 个通用的可打印字符来存储和表示二进制字数据,同时也可以进行简单的加密。Base64 字符集包括 A-Za-z0-9+/ 以及后缀填充 = 共计 65 个字符。

Base64 实质上是以 6bits 为单位,并将其影射为规定的字符集。通常,数据以字节为单位的存储,也即 8bits,而 Base64 使用 6bits 表示一个字符,这就导致了计算机中的三个字节 (8bits*3) 在经过 Base64 编码后将变成四个字符 (6bits*4),转码后比原数据长大约三分之一。

转码时只需使用一个 24bits 的缓冲区,依次从原数据中读入三个字节的数据,再每次从缓冲中取 6bits 转化成 Base64 字符输出。因此,如果是 3bytes 的整数倍,则不需要 = 填充,生于两字节添加一个 =,剩余一个字节添加 ==

其中,rfc2045 定义了 MIME 中的 Base64 传输编码;而 rfc4880 协议则定义了 OpenPGP 中使用的 Radix-64 编码。

参考