一、密码学的基本概念

1.1 密码学的作用

  密码学是为了保障信息安全而发展起来的一门学科。为了解决信息安全所面临的危险,研究出了许多应对这些威胁的密码技术,“密码技术”是保障信息安全的基本技术。

信息安全的基本属性:

  • 机密性(Confidentiality)
    • 保证信息为授权者使用而不泄露给未经授权者。
    • 别人“看不到”或者“看不懂”
  • 认证(Authentication)
    • 消息认证,保证消息来源的真实性
    • 身份认证,确保通信实体的真实性
    • 证明“你就是你”
  • 完整性(Integrity)
    • 数据完整性,没有被未授权篡改或者损坏
    • 系统完整性,系统没有被非授权操纵,按既定的功能运行
    • 信息没有被“动过”
  • 不可否认性(Non-repudiation)
    • 要求无论是发送方还是接收方都不能抵赖所进行的传输
  • 可靠性(Reliability)
    • 特定行为和结果的一致性
  • 可用性(Availability)
    • 保证信息和信息系统随时为授权者提供服务,而不要出现非授权者滥用却对授权者拒绝服务的情况。
  • 可控性(Controllability)
    • 授权实体可以控制信息系统和信息使用的特性
  • 审计(Accountability)
    • 确保实体的活动可被跟踪

1.2 什么是密码学

  • 密码学能做什么?
    • 机密性:如何使得某个数据自己能看懂,别人看不懂
    • 认证:如何确保数据的正确来源,如何保证通信实体的真实性
    • 完整性:如何确保数据在传输过程中没有被删改
    • 不可否认性: 如何确保用户行为的不可否认性
  • 功能如何实现
    • 算法
    • 协议

1.3 密码算法

1.3.1 基本概念

  • 明文M——要处理的数据
  • 密文C——处理后的数据
  • 密钥k——秘密参数,可以理解成加密算法、解密算法中的参数
  • 加密函数:C = E(k, M)或C = Ek(M)
  • 解密函数:M = D(k, C)或M = Dk(C )

Note:E()代表加密算法,D()代表解密算法

1.3.2 密码算法需求

  • 需求1:可逆——算法的使用者可以将密文恢复成明文
  • 需求2:不可逆——敌手无法将密文恢复成明文
  • 秘密参数——密钥

密码算法实际上是一个带有秘密参数的函数。

  • 知道秘密参数,求逆非常容易
  • 不知道秘密参数,求逆是不可行的

1.3.3 密码算法的分类

1.按照功能分类

  • 加密算法:用于机密性解决方案
  • 杂凑函数:用于完整性解决方案
  • 数字签名:用于认证和不可否认性

2.按照密钥的使用方式不同分类

  • 对称密钥密码:加密密钥与解密密钥相同
    如:分组密码,流密码

  • 非对称密钥密码体制:加密密钥与解密密钥不同
    如:公钥加密,数字签名

1.4 保密通信系统模型

二、流密码与伪随机数发生器

2.1 流密码的基本概念

三、分组密码

3.1 设计密码系统的方法

  我们之前提到的如凯撒密码、多表代换密码等经典密码的时候,降到了破解这些密码的一种方法,就是利用英文中每个字母出现的频率不同。一次一密的方法可以抵御这种破解,原因是对于明文中的每个字符,其移位都是随机的,因此在密文中完全没有明文中字母出现的频率的信息。但是,一次一密的成本又太高,我们有没有什么办法,能尽可能地掩盖在密文中出现的字母频率的信息,来抵御这种频率攻击呢?香农给出了一种解决方法。

3.1.1 扩撒与混淆

  所谓扩散,指的是如果我们改变明文中的一个字符,加密得到的密文中的多个字符也会得到改变;如果我们改变密文中的一个字符,解密得到的明文中的多个字符也同样会得到改变。因此,明文中一个字符的信息被“扩散”到密文中的多个字符。因此,实现扩散的方法,就可以是用明文中的多个字符去生成密文中的一个字符。
 扩散是将明文和密文之间的关系变得复杂使我们很难获得密钥,而混淆则是将密钥和密文之间的关系变得复杂。例如,密钥中的一个字符的改变会导致密文中多个字符的改变。因此,即使攻击者通过密文,知道了一些关于明文的统计信息,也很难获得密钥。
 我们可以发现,凯撒密码的加密方式并没有实现扩散和混淆,因此,它可以被频率攻击轻易破解。

3.1.2 置换与代换

3.2 分组密码的定义

  事实上,在非对称密码发展之前,大多数著名的密码体系,其核心都是扩散与混淆。但是,在我们上述谈到扩散与混淆的时候,有一个值得注意的地方:实现扩散与混淆的器件,即P盒与S盒,其接受的都是固定长度的输入。这与我们之前谈到的流密码不同,流密码的输入可以是任意长度的。因此,为了更好地实现扩散与混淆,我们引入了分组密码。
 分组密码就是一个较好地实现扩散与混淆的密码系统。它的核心思想是分组。首先,将明文分成若干个等长的组,然后对每个组利用密钥依次进行加密,生成等长的密文组。
 对于分组密码,我们要研究的有:每组内如何根据输入和密钥进行加密,以及各组之间的关系。最简单的方法是各组的输入是之前分好的明文的各个分组,密钥是相同的密钥。但是,也可以使用相对复杂的方法,使加密变得更加复杂(参见“分组密码的运行模式”一节)。
 由于密文是明文按组生成的,因此分组密码具有扩散性;而通过采用特别设定的S盒,也可以实现混淆性。
 这里我们要注意的是,密码学中研究的分组密码,并不仅仅是将明文分组的加密方式。我们之前提到的同步密码,实际上也可以看作是将明文分组进行加密,每个组的长度为其伪随机密钥流的周期。但是,同步流密码依然是逐比特加密,因此,失去了扩散性。所以,只有这个组的每个比特都参与到了密文的生成中的加密方法,才是我们这一章研究的重点。
 此外,在讨论分组密码的运行模式,即各组之间的联系之后,我们接下来讨论的DES,IDEA,AES等都是每组内的加密方法。由于分好了组,所以这些密码体制都有一个特点,即明文或者密文是固定长度的。

四、公钥密码

五、哈希算法

  用于确认消息没有篡改的算法被称为哈希函数(Hash function),又称散列函数。其接受一个消息作为输入,产生的输出被称为该消息的摘要(digest)。一个优秀的哈希函数应该能做到对于输入消息的任何一点修改都会导致输出的巨大改变。
 除了这个功能之外,由于其输出的长度是固定的,因此,哈希函数还有一个重要的用途:当我们要处理的数据很大时,将其通过哈希函数,压缩成较小的数据,则更好处理。

常见的哈希算法有:MD5、SHA-256

5.1 应用

  在安全通信中,一般较少会直接用到哈希函数,其通常会与MAC技术等相结合使用。但是,在一些特定情况下,哈希函数也是最好的选择。

场景一:由于某个文件过大,所以传递过程缓慢。但是,在截止日期之前,发送者一定要让接收者了解到该文件已完成,并且接收者在实际收到文件后,需要确认其最后一次修改是在截止日期前。这个情况虽然少见,但也是确实存在的,比如说数学建模比赛,最后的论文可以在截止日期后提交。解决这一问题的方法就是发送者先对文件求一个哈希,如果两个摘要值想等,就说明在截止日期前文件已经完成修改。

场景二:在聊天软件中传输文件。现在的机制一般是发送者将发哦是那个的文件上传到聊天软件的服务器中,接收者从服务器中下载。那么,为了节省服务器资源,聊天软件设计者一般会在发送者上传文件的时候,对文件求哈希,将摘要值与服务器中已有的文件作比较,如果相同则无需再次上传,接收者可以直接下载对应的文件。

5.2 MD5

  MD5哈希算法的输出为128比特的二进制串。然而,MD5算法并不安全。在2012年,MD5算法被卡耐基梅隆大学软件工程研究所宣布能被密码学方法破解,不适合将来的使用。但是,如果只是简单的摘要对比,对安全性要求并不高的话,MD5哈希算法也是一个比较简便的方法。
 在MD5算法中,二进制串既要以比特串的形式进行异或等逻辑运算,也要以二进制数的形式进行加减等算术运算。

5.3 SHA-256

  自1993年开始,美国国家标准技术研究所陆续推出了4组哈希算法,称为安全哈希算法(Secure Hash Algorithm,SHA),分别为SHA-0,SHA-1,SHA-2,SHA-3 。
 SHA-1已经不在视为可抵御有充足资金、充足计算资源的攻击者。2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用SHA-2或SHA-3来替换SHA-1 。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年前停止接受使用SHA-1算法签名的SSL证书。SHA2包含SHA224, SHA256, SHA385, SHA512;其中SHA256是最常用的,SHA256产生的摘要是256bits,也就是32个字节。

六、消息验证码

七、数字签名

  数字签名这中工具可以同时解决完整性、真实性与不可否认性这三个消息认证的问题。

 数字签名需要第三方来进行验证。那么,我们之前了解到的工具中有什么东西是第三方知道的呢?我们最先想到的就是公钥密码体系中发送者的公钥。此外,也有一些单独设计的数字签名算法。由于涉及到了密钥,因此,数字签名总共有三个部分:

  • 密钥生成算法Gen
    返回用于签名的密钥(使用公钥密码时返回公-私钥对(PK,SK))
  • 签名算法Sig(M, SK)
    返回签名S
  • 验证签名算法Ver(S, PK)
    返回是否验证成功

  此外,如果不讨论不可否认性,由于MAC(消息验证码Message Authentication Code)使用的是对称密钥,数字签名使用的公钥密码,那么数字签名实际上就是公钥密码领域中的消息验证码。

7.1 数字签名的执行方法

  数字签名是为了一次性做到完整性、真实性和不可否认性的认证。用一句话概括,就是“这个消息确实是他说的”。那么,由谁来验证数字签名呢?最原始的方式是直接方式。

  • 直接方式(Direct digital signatures)
    即接收方直接利用验证签名算法和发送方的公钥验证发送方的签名。
    这种方式依赖于发送方私钥的安全性。如果发送方私钥丢失,那么窃取者可以伪造签名;如果发送方声称私钥丢失,那么签名就失去了验证效力,消息得到了否认。这样的话,数字签名的真实性可不可否认性都不能得到保证。

  • 仲裁方式(Arbitrated digital signatures)
    对于仲裁方式,需要第三方C,并且C应该收到发送方A和接收方B的高度信任,而且拥有A的公钥与加密用的密钥。C称为仲裁方(Arbiter)。发送方将消息及其签名先发给仲裁方。仲裁方验证了消息的完整性、真实性和不可否认性后,一般是加上时间戳,然后将消息发送给B。

DSA是NIST推荐的数字签名算法。