加减密和数字签名

加密数据的目的是防止发给对方的隐私信息被他人看到;发布签名的目的是向对方证明这段消息确实是你发的。

一、加密算法

加密算法分为 对称密钥算法(Symmetric Key Algorithm)公开密钥算法(Public Key Algorithm)。对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码);公开密钥算法也称为 非对称密钥算法 ,就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的,加密算法E和解密算法D也都是公开的,虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

1.1 DES(Data Encryption Standard, 数据加密标准)

DES是一种对称加密算法。
加密原理:DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
三重 DES:使用 168 位的密钥对资料进行三次加密的一种机制。因DES的密钥长度太短,很容易被暴力破解,故利用三重加密来有效地增加密钥长度。
不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准。

1.2 AES(Advanced Encryption Standard, 高级加密标准)

AES是一种对称加密算法。这个标准用来替代原先的DES,2006年AES已然成为对称密钥加密中最流行的算法之一。
加密原理:AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。

1.3 RSA

RSA是一种公开密钥算法。由Ron Rivest、Adi Shamir、Leonard Adleman提出,故该算法取三个人名字的首字母来命名。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开。
RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
具体解析:带你彻底理解RSA算法原理

1.4 加密算法选择

因对称加密算法在传输数据时,也需要把双方共同的密钥明文传给对方,这里就会出现安全性地问题,故现在所有的通信都会使用公开密钥算法RSA。
但RSA有几个缺点:1.产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;速度太慢,由于RSA 的分组长度太大,为保证安全性,n 至少也要 600 bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。

为了速度问题,人们广泛使用单,公钥密码结合使用的方法,优缺点互补:单钥密码加密速度快,人们用它来加密较长的文件,然后用RSA来给文件密钥加密,极好的解决了单钥密码的密钥分发问题。在对称密钥算法中应首选AES。

二、数字签名

数字签名就是为了证明发布数据者的身份。签名流程是先 认证,再 加密

  1. 认证。以单向散列函数思想为基础,它接受一个任意长度的明文作为输入,然后计算出一个 固定长度 的位串,这个散列函数MD称为 消息摘要(Message Digest)。散列过程是不可逆的,即给定P很容易计算出MD(P),但给定MD(P),不能有效推算出P;并且输入明文中即使只有1位变化也会导致完全不同的输出。
  2. 加密。加密的过程也就是签名的过程,为了安全,在实际的场景中,仍然使用公开加密算法RSA,为了证明发布者的身份,发布者就会用自己的私钥加密,接收方用发布者的公钥解密来确认。

发布者对明文进行签名后,需要把明文和摘要都发给接收方,接收方只需对明文也hash计算出摘要,和接收到的摘要进行对比是否一致。

问题1:理论上用RSA直接对明文签名就可以,为什么还要先对消息进行散列得到摘要再加密?
Why hash the message before signing it with RSA?
主要原因无非是 安全快速。散列过程是不可逆的,故安全;散列完总是计算出一个固定的值,能加快RSA的加减密速度。

问题2:RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
RSA算法是第一个能同时用于加密和数字签名的算法。RSA的两个密钥是对称的,随便哪一个加密,可以用另一个解密,理论上你可以保留公钥,发布私钥,只不过公钥可以通过私钥轻松算出,反之不行,故实际中的做法是保留私钥发布私钥。
我们会发现实际中对数据加密时,使用的是接收方的公钥,而在数字签名时,使用的是发送者的私钥。
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

不要去硬记。
你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出 公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出 私钥负责签名,公钥负责验证

2.1 MD5(Message-Digest Algorithm 5, 信息-摘要算法5)

MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5码可以唯一地代表原信息的特征,通常用于密码的加密存储,数字签名,文件完整性验证等。

2.2 SHA-1(Secure Hash Algorithm 1, 安全散列算法1)

SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要。SHA-1基于MD5,MD5又基于MD4。
论坛里提供的系统镜像文件的hash也就是微软官方提供的SHA-1值,下载后和此值对应,就说明你下载过程中文件没有被更改,属于原版。

比较:SHA-1摘要比MD5摘要长 32 比特,故SHA-1抗攻击能力更强,自然运行速度比MD5慢。需根据实际场景来选择

三、编码转换

在进行完加密和签名后的数据时二进制的,不适合用于传输,故需要转换为字符集。目前常见的编码算法就是 Base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。

四、总结

目前大多数应用通信的安全流程是:

process.png

上图是加密和签名的流程图,而解密和验签倒序进行。

五、公钥管理

为了安全地分发公钥(因为在传输的过程中可能被非法者替换),就建立了能证明公钥所属权的 认证中心(CA, Certification Authority)。CA会给申请者颁发一个证书,用自己私钥对证书的SHA-1散列值进行签名。证书的作用就是将一个公钥与安全个体的名字绑定在一起。
实际上,CA并不是一个,为了安全和效率,而是分等级层次的,这样即使一个CA的数据库被攻破了,也不会影响全球的安全性。最顶级的CA即层次的根,它的责任是证明第二级的CA,顶级CA称为 区域管理机构(RA, Regional Authority)

Certificate chain.png

当用户不相信对方直属CA颁发的证书时,就会请求上一级CA,以此类推,请求的证书就形成了一个 证书链(Certificate chain)。总之你必须相信根CA,证书链才有效,当然根CA并非只有一个,而是有多个根,每个根都有它直接的RA和CA。实际上,现代浏览器在安装的时候预先加载了100多个根的公钥。通过这种方式,就可以避免在全球范围内使用单一的可信权威机构。

六、常见安全通信协议

6.1 GPG/PGP

PGP(Pretty Good Privacy, 良好的隐私性) 是一个完整的电子有点安全软件包,提供了私密性、认证、数字签名和压缩功能。它使用 国际数据加密算法(IDEA, International Data Encryption Algorithm) 的块密码算法来加密数据,PGP的密钥管理使用RSA,数据完整性使用MD5。
PGP使用已有的密码学算法,而不是发明新的算法。它像一个预处理器,接受明文输入,并产生签过名的密文作为输出,其输出格式为Base64。

PGP.png

但是PGP是商业软件,不能自由使用。所以自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG,即 GPG(The GNU Privacy Guard)

6.2 SSH(Secure Shell, 安全外壳协议)

SSH 为建立在应用层基础上的安全协议,它专为远程登录会话和其他网络服务提供安全性的协议。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH采用面向连接的TCP协议传输,监听 22端口
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
从客户端来看,SSH提供两种级别的安全验证:

  1. 基于口令的安全验证:通过帐号和口令登录到远程主机,所有传输的数据都会被加密。但可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
  2. 基于密匙的安全验证:需要创建一对密匙,并把公用密匙放在需要访问的服务器上,通过类似RSA的方式来加密和解密数据。它不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙),但是整个登录的过程可能需要10秒。

生活中应该首选SSH Keys,尽量避免使用密码方式登录SSH。

6.3 SSL(Secure Sockets Layer, 安全套接层)

现在SSL的协议已广泛被Google、Firefox、Safari和IE等浏览器采用,主要用于页面信息的通信。SSL在两个套接字之间建立一个安全的连接,主要功能有浏览器和服务器的双向认证、数据加密和数据完整性保护等。
实际上,SSL位于应用层和传输层之间的一个新层,它接受来自浏览器的请求,再将请求传递给TCP以便传输到服务器上。一旦安全的连接已经被建立起来,则SSL的主要任务时处理压缩和加密。
在SSL上使用的HTTP被称为 安全的HTTP(HTTPS, Secure HTTP),它使用一个新端口 443,而不是标准的端口80。现在许多企业都强烈推荐使用HTTPS协议,2017.01.01苹果要求所以的APP都必须使用HTTPS。

SSL.png

SSL存在一个问题是,用户并不总是验证所用的密钥是否与证书相匹配,故产生了IETF标准haul后的 传输层安全(TLS, Transport Layer Security)。TLS是SSL的第3个版本,这就是所谓的 SSL/TLS

参考链接:《计算机网络(第5版)》 AndrewS.Tanenbaum
RSA算法原理(一)
RSA算法原理(二)

推荐阅读更多精彩内容