欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Web 3.0 - 基础层技术 - SCQA 模型 有趣的密码学

最编程 2024-04-30 16:20:53
...

image.png

【小木箱成长营】密码学系列教程:

Web3.0 · 基础层技术 ·密码学在移动端应用与实践

一、序言

Hello,我是小木箱,欢迎来到小木箱成长营密码学系列教程,今天将分享Web3.0 · 基础层技术 · SCQA模型趣谈密码学。

SCQA模型趣谈密码学主要分为四部分,第一部分是加解密算法,第二部分是Hash算法,第三部分是数据编解码,最后一部分是总结与展望。

其中,加解密算法主要是分为四部分,第一部分是对称加密,第二部分是DH交换算法,第三部分是非对称加密,第四部分是混合加密。

image.png

如果学完小木箱密码学系列教程,那么任何人完成高性能日志组件、网络接口组件和网络优化工作,甚至迎接Web3.0都会有巨大帮助。

二、加解密算法

SCQA模型是麦肯锡芭芭拉·明托在《金字塔原理》中提出的“结构化表达”模板工具,常用于方案、文案、广告、演讲、讲故事、写作等。SCQA是Situation、Complication、Question和Answer4个英文单词简称,分别是

  • S—业务背景
  • C—困境冲突
  • Q—分析问题
  • A—解决问题

如果你想把难以理解的密码学知识表达清楚,那么建议采用万能表达模板—SCQA。

image.png

加密技术⽆处不在但是容易忽略。更多的了解加密技术能做什么,不能做什么,对我们建⽴更加完善的信息安全意识是⾮常重要的。

加密技术的演进其实是⼀场没有硝烟的战争,在加密⽅和破解⽅惊⼼动魄的攻守战中不断完善。

接下来,我们⾸先利用⼀个⼩故事,然后通过业务背景、困境冲突、分析问题和解决问题的SCQA模型⽅式学习加密技术演进,最后达到活学活用的目的。

S: 业务背景

故事的主⼈公是小木箱和粉丝。他们通过微信公众平台进行传话,小木箱给粉丝发了⼀个消息:微信公众号小木箱成长营。

image.png

于是黑粉⽴刻拦截了他们的信息,并把小木箱和粉丝交流关系链中断了。

C: 困境冲突

当下面临的问题有三个。第一个窃听问题,小木箱和粉丝交流过程中,内容是明文传输的,内容被黑粉窃听,导致信息泄露风险。

第二个是密钥配送问题,通过对称加密算法,小木箱和粉丝好像解决了信息传递的问题,但是,实际操作过程中,发现了⼀个⼤问题:如何共享密钥?这就是密钥配送问题。

第三个问题是中间⼈攻击问题,小木箱和粉丝即使解决了密钥配送问题,不一定能确保密钥通信安全。

黑粉通过⾃⼰的聪明才智,想到了⼀个劫持+篡改的⽅案,再次攻破了DH密钥交换和⾮对称加密,即中间⼈攻击。

Q:分析问题

如何解决窃听问题呢?

针对窃听问题,为了避免被黑粉窃听,小木箱和粉丝想到了⼀个好办法:首先小木箱和粉丝共享了⼀个密钥,然后小木箱先把消息加密成密⽂,最后再发送给粉丝,粉丝拿到密⽂之后⽤密钥解密成明⽂。这就是对称加密。

image.png

如何解决密钥配送问题呢?

针对密钥配送问题,密钥配送问题的解决⽅案有很多,有两种解决密钥配送问题⽅案:DH 交换算法和⾮对称加密算法。

如何解决中间人攻击问题呢?

中间人攻击本质即篡改和伪装,解决方案有单向散列、消息验证码、数字签名和数字证书四种方式。

A: 解决问题

针对窃听问题,首先我们来说说对称加密,加密方式主要讲解四种加解密方式: 第一种是DES加密,第二种是3DES加密,第三种是AES加密,第四种是ChaCha加密。

下面小木箱将从简介、历史、现状、明文块长和密钥长和加解密流程等多方面维度讲解四种加解密算法。

2.1 对称加密

2.1.1 对称加密简介

加密处理方式有对称加密和非对称加密两种。

其中,对称加密指的是通信双⽅同时掌握⼀个密钥,加密解密都是由⼀个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。

image.png

对称加密双⽅通信前共同拟定⼀个密钥,不对第三⽅公开,解密时使用加密过程的完全逆过程配合密钥来进行解密。

2.1.2 对称加密手段

2.1.2.1 DES

其中,对称加密指的是加密和解密的密钥不同的加密算法。首先我们讲解一下第一种对称加密算法DES 加密。

2.1.2.1.1 DES 简介

关于DES加密,DES,全称Data Encryption Standard,数据加密标准。

2.1.2.1.2 DES 历史

DES是1975年IBM推出,并随后在国际上⼴泛使⽤开来。

2.1.2.1.3 DES 现状

随着计算机技术的发展,在20世纪末的时候,DES算法已经可以被暴⼒破解。在1999年的DES III ⽐赛中,只⽤了22 ⼩时多就完成了破解。所以现在不要再使⽤DES算法。

2.1.2.1.4 DES 明文块长和密钥长

DES 算法的明⽂块⻓度是64位。密钥总⻓度是64位,其中每隔7位会有⼀个⽐特的错误校验,所以有效密钥⻓度为56位。

2.1.2.1.5 DES 加解密流程

DES的加解密流程如下:

  1. 第一步:DES算法的基本结构被称为Feistel⽹络。Feistel⽹络中,⼀个基本单位叫做轮,整个加密过程就是由16个轮循环组成。
  2. 第二步:明⽂被平分成左右两部分L0和R0。L0经过加密得到加密后的L0,作为下⼀轮的右半部分R1。R0不做处理,直接作为下⼀轮的左半部分L1。

image.png

2.1.2.1.6 DES 加密结构

DES解密和加密的结构是⼀样的(利⽤传统的换位、异或、置换等加密⽅法),具体可以参考下面的图解。

image.png

2.1.2.1.7 DES 代码实现

github.com/strich1991/…

2.1.2.2 3DES

然后,我们讲解一下第二种对称加密算法3DES加密。

2.1.2.2.1 3DES 简介

3DES算法是将DES算法重复3次的⼀种算法。

2.1.2.2.2 3DES 历史

3DES是DES算法被攻破之后,被开发出来临时替代DES算法的。1999年,NIST(National Institute of Standards and Technology,美国国家标准技术研究所)将3DES指定为过渡加密标准。

2.1.2.2.3 3DES 现状

3DES算法由于其处理效率不⾼,并且作为过渡标准,所以除了⼀些要向下兼容原有的DES算法的场景,现在很少被使⽤。

2.1.2.2.4 3DES 明文块长和密钥长

3DES算法的明⽂块⻓度为64位,有效密钥⻓度为56*3位。

2.1.2.2.5 3DES 加解密过程
  1. 3DES的加密为依次进⾏密钥1的DES加密、密钥2的DES解密、密钥3的DES加密。
  2. 3DES的解密为依次进⾏密钥3的DES解密、密钥2的DES加密、密钥1的DES

解密。

  1. 3DES的加密的结构是加解密交替进⾏⽽不是进⾏3次加密(思考⼀下这是为什么?)

image.png

由于DES密码长度容易被暴力破解,增加DES的密钥长度可反破解,因此针对每个数据块进行三次DES加密,即3DES。

组合分组方法设计的分组3DES加密算法,3DES密钥相比DES长度更长,安全性更高。

2.1.2.2.6 3DES 代码实现

github.com/songxiaolia…

2.1.2.3 AES

接着,我们讲解一下第三种对称加密算法AES加密。

2.1.2.3.1 AES 简介

AES算法,Advanced Encryption Standard,⾼级加密标准,是取代DES算法的⼀种新的对称加密标准。

2.1.2.3.2 AES 历史

AES是NIST公开竞选得到的⼀种加密标准。可以说是先有了AES的名字,然后竞选之后才确定的算法。最终被选中的算法叫做Rijndael算法。不过严格来讲,AES是Rijndael的⼀种特殊情况。

2.1.2.3.3 AES 现状

AES现在已经是最流⾏的对称密钥加密算法,⼴泛应⽤在各个领域。也是我们现在推荐使⽤的对称加密算法。

2.1.2.3.4 AES 明文块长和密钥长

AES的块⻓128位,密钥⻓度⽀持128位、192位、256位三种⻓度。(这⾥注意,Rijndael算法的块⻓和密钥⻓度,是在128-256之间的32倍数即可。

2.1.2.3.5 AES 加解密过程

AES加密过程分为两个过程,⼀是密钥扩展过程、⼀是明⽂加密过程。

A: 密钥扩展过程:

密钥扩展过程是基于⽤户密钥,通过Rijndael密钥编排算法⽣成多组128⽐特⻓的轮密钥,根据密钥⻓度,分别⽣成10组、12组和14组轮密钥。

B: 明文加密过程:

image.png

  1. AES加密与DES加密⼀样,是由多轮组成。根据密钥⻓度,分别是10轮、12轮、14轮。
  2. 每⼀轮由以下四种运算组合⽽成:
  1. SubBytes,字节替换。是通过⼀个S-Box对每个字节进⾏替换操作。
  2. ShiftRows,⾏位移。每⼀⾏根据所在⾏数位移不同的字节数。
  3. MixColums,列混合。每⼀列需要跟⼀个常量矩阵相乘。
  4. AddRoundKey,轮密钥加。将列混合之后的结果和轮密钥做异或运算。
  1. 第⼀轮只有AddRoundKey运算。
  2. 最后⼀轮是SubBytes->ShiftRows->AddRoundKey运算。
  3. 中间轮都是SubBytes->ShiftRows->MixColums->AddRoundKey运算。

AES解密过程就是AES加密逆过程,小木箱不做过多讲解。

2.1.2.3.5 AES 代码实现

github.com/ForTheDevel…

2.1.2.4 ChaCha20

最后,我们讲解一下第四种对称加密算法ChaCha20加密

2.1.2.4.1 ChaCha20 简介

ChaCha20算法是Google设计的一种新型流密码算法,ChaCha命名来源于印度某漫画"Chacha Chaudhary",20表示ChaCha20算法有20轮加密计算。

ChaCha20带Poly1305消息认证码的ChaCha20(即ChaCha20-Poly1305),作为OpenSSL中RC4的替代品,用以完成互联网的安全通信。

Google最初实现了HTTPS(TLS/SSL)流量在Chrome浏览器(Android手机版)与Google网站之间的通信。

image.png

2.1.2.4.2 ChaCha20 历史

2008年,丹尼尔·J·伯恩斯坦发布“ChaCha”密码家族,目的是增加每一轮扩散以提升性能。

2013年,Google提出ChaCha20-Poly1305算法,11月份在Chrome31版本启用了ChaCha20-Poly1305算法。

2014年,所有的IOS设备和Android设备上Chrome启用了ChaCha20-Poly1305算法。

firfox密码库用的是NSS,NSS3.23版本支持ChaCha20/Poly1305。

2.1.2.4.3 ChaCha20 现状

ChaCha20算法因为其轻量级、链路加密、密钥安全、IOT安全特征,所以更适用于ARM设备。

ChaCha20-poly1305比AES-128-GCM性能高,但因为ChaCha20 IOT安全特征,因此手机设备更适合ChaCha20-poly1305算法,电脑上更适合AES-128-GCM算法。

2.1.2.4.4 ChaCha20 明文长和密钥长

ChaCha20矩阵输入一个256位的密钥长度、64位随机数、64位计数器值以及4×32位的常数,常数填充在32位整型数组中作为初始矩阵。

2.1.2.4.5 ChaCha20 加解密过程

image.png

2.1.2.4.5.1 ChaCha20加密

了解ChaCha20加密之前我们首先要熟悉三个新概念,第一个是ChaCha20的初始矩阵,第二个是初始矩阵置换,第三个是轮函数。

首先,聊聊ChaCha20的初始矩阵,ChaCha20的初始矩阵是指输入一个256位的密钥、64位随机数、64位计数器值以及4×32位的常数,它们均填充在32位整型数组中作为初始矩阵。

其次,聊聊初始矩阵置换,初始矩阵置换是指 ChaCha20算法有20轮运算,其中奇数轮次与偶数轮次在执行轮函数前需要分别经过行置换和列置换,故20轮运算可以看作10次迭代,每次迭代先做行置换再做列置换。

接着,聊聊轮函数,轮函数是指在矩阵每次完成置换后,都需要执行一次轮函数QUARTERROUND,该函数输入为4个32位串,即4个数组中的元素,输出同样也为4个32位串,这样执行完轮函数后除了数据以外,矩阵结构未发生任何变化。

最后,聊聊ChaCha20加密过程,ChaCha20加密其实是将需要加密的信息(明文)与密钥流按位异或即得到密文,明文大于512位时,对轮函数进行20轮周期(10轮行周期+10轮列周期),初始矩阵已经变成了一个新的4×4矩阵,此时将新矩阵与初始矩阵矢量相加,得到的矩阵再拆分倒序序列化处理后即得到一个512位的密钥比特流。

由于计数器是32位,理论上可以生成2^512bit(256GB)的密钥流,所以一般长度的信息加密完全足够,这就是ChaCha20加密过程。

2.1.2.4.5.2 ChaCha20解密

聊完ChaCha20加密过程,我们再聊聊ChaCha20解密过程,接收方使用发送方传输过来的初始密钥、随机数以及协商好的常数和依次递增的计数器值按照ChaCha20的密钥流生成规则产生与加密相同的密钥流,按位与密文异或即可得到明文,这就是ChaCha20解密过程。

2.1.2.5 ChaCha20 代码实现

github.com/kitsook/Cha…

2.1.3 对称加密破解思路

说完四种加解密算法,小木箱说说对称加密算法的破解思路。

对称加密算法破解比较简单,首先拿到⼀组或多组原文-密文对,然后设法找到⼀个密钥,这个密钥可以将这些原文-密文对中的原文加密为密文,以及将密文解密为原⽂的组合,即成功破解。

2.1.4 对称加密反破解

对称加密如何反破解呢?

⼀种优秀的对称加密算法的标准是让破解者找不到⽐穷举法(暴力破解法)更有效地破解⼿段,并且穷举法的破解时间⾜够长(例如数千年)。

2.1.5 对称加密优缺点

对称加密算法的优点很明显,效率高,性能高。缺点是有密钥泄露风险,只能在安全网络上传输密钥,一旦密钥泄露则加密通信失败。

2.1.6 对称加密作用

对称加密算法的作用在于加密通信,防⽌信息在不安全网络上被截获后,信息被人读取或篡改。

2.1.7 对称加密分组和填充⽅式

2.1.7.1 分组模式

从上⾯的算法,我们可以看到,输⼊的明⽂都是固定⼤⼩的块。那么对于⼀个任意⻓度的明⽂,要如何加密呢?

答案就是分组。下面简单介绍CBC、CTR和CFB三种分组模式。

2.1.7.1.1 CBC模式

CBC模式的全称是Cipher Block Chaining模式,密文分组链接模式。名字中也展示CBC的实质,像链条一样相互链接在一起。

image.png

CBC加密“链条”起始于一个初始化向量IV,这个初始化向量IV是一个随机的比特序列。

CBC加密必须是从“链条”头开始加密,所以中间任何一个分组都无法单独生成密文。

CBC解密的时候,如果解密“链条”中间有一环“断”了,会出现什么问题呢?

image.png

CBC解密过程中如果有一环出现了问题,硬盘等问题出现了,但是整个链条长度没变,如上图的情况,那么一个坏的环会影响2个分组的解密。

image.png

如果链条长度也发生变化了,或者某个分组中的1个比特位在网络传输过程中缺失了。那么影响的解密分组可能就不止2个分组了。

因为会引起整个链条上重新分组,这样一来导致原文无法解密(因为位数少于分组要求,解密的时候不会填充末尾分组不足的比特位)。

这一点算是CBC链式的一个“小缺点” 。一个比特位的缺失会导致整个密文无法解析。

对CBC的攻击

由于CBC是链式的,所以攻击者可以考虑从“头”开始攻击,即攻击初始化向量IV,例如把初始化向量中的某些比特位进行0,1反转。

这样的话,消息接收者在解密消息的时候,明文1分组会受到初始化向量的影响,出现错误。

还有一种攻击办法是直接攻击密文,例如密文分组中的某个分组n被改变了,那么就会影响到明文分组n+1的解密。

2.1.7.1.2 CTR模式

CTR模式的全称是CounTeR模式(计数器模式)。CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。

image.png

注意上图中解密过程,中间是加密而不是解密!因为需要保证明文和密文之间异或的对象不变。不变才能异或两次还原明文。

计数器每次都会生成不同的nonce来作为计数器的初始值。这样保证每次的值都不同。

这种方法就是用分组密码来模拟生成随机的比特序列。

对 CTR 的攻击

在被攻击方面CTR和OFB是差不多的。CTR模式的密文分组中有一个比特被反转了,则解密后明文分组中仅有与之