网络安全丨密码学详解

密码学(cryptology) / 虽然是在讲网安,但其实到了密码学的部分才开始认真听......

这篇文章的标题还是chat帮我想的hh 因为我还写了另一篇叫《概论》!时间线上《详解》比《概论》更早,那时候还没开始用chat呢...

此篇重点(后面的结构太乱了,直接看这个找吧)

1. 对称加密算法SPN(替换置换网络,对称加密算法的基础)、AES(高级加密标准,一种对称加密算法)

2. 密钥交换算法DH(密钥交换算法)

3. 非对称加密算法RSA(一种非对称加密算法)、ECC(椭圆曲线加密算法)

废话

作业用到的网站是这个!【CryptoHack – A free, fun platform for learning cryptography

注册时被拷问的题:

Solve this Roman emperor's cipher

po一下当时写的记录(个人吐槽,可无视):

网安作业!
这个是网安作业需要用到的网站,光是注册就被卡住了...()

非常可爱的点是 —— 由于这是一个和密码学有关的网站,所以注册的时候需要先让你解一个谜题^^
(其实只是简单的凯撒密码,但提示里写的是什么罗马国王的密码,我一脸问号

然后萨莉亚的网还莫名很差!!我:硬啃英语...(真的很奇妙bing可以用但是百度完全用不了。。

SPN

可以理解为一种技术 or 大家都在用的一种方法!比如下厨炒菜的时候无非就是加盐加酱然后翻翻炒炒...(哼哼!最近沉迷于下厨......

替换-置换网络(Substitution-Permutation Network,SPN)是一种加密算法的结构,它结合了 替换Substitution)和 置换Permutation)两种操作,以实现数据的加密。

SPN是现代对称加密算法的基础之一,广泛应用于许多密码系统中。

SPN的基本结构

1. 替换层(Substitution Layer):使用一个称为 S-Box(Substitution Box)的替换表,对输入的每个比特块进行非线性变换。S-Box 将输入比特映射到不同的输出比特,从而增强密码的安全性。

2. 置换层(Permutation Layer):使用一个置换表,对比特块的位置进行重新排列。这一步骤增加了扩散性,使得输入比特的改变会影响到输出的多个比特。

3. 轮(Rounds):SPN 通常由多轮操作组成,每一轮都包含替换和置换层。每轮的输出将作为下一轮的输入。通过增加轮数,可以提高算法的安全性。

4. 密钥调度(Key Schedule):在每一轮中,使用密钥调度算法生成轮密钥。每轮的密钥是主密钥的不同部分或变换。

块加密模式

以下有一堆模式... 我没法细讲哦我只是列举一下!

ECB

电码本模式(Electronic Codebook,ECB)是一种块加密模式,用于将明文分成固定大小的块,并逐块加密。每个块独立进行加密,使用相同的密钥。

CBC

密文分组链接模式(Cipher Block Chaining,CBC)是一种常用的块加密模式,它通过将每个明文块与前一个密文块链接在一起,增强了加密过程的安全性。以下是 CBC 模式的主要特点和工作原理。

CFB

密文反馈模式(Cipher FeedBack)

OFB

AES

这边的话主要讲一下AES!是一个最常见的对称加密算法哦。

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

顺带科普一下DES,因为AES就是用来取代DES的hh

讲回AES,明文长度固定为128位,密钥长度可以是128、192、256位。(每16位,基础循环+1轮。)

由于是分组加密(核心是SPN!),于是操作时 be like:

128位 = 16字节,16字节 → 4x4的矩阵(从上到下从左到右),每个小格子内放着1个字节即一个00~FF的数。

科普一下(因为我老忘),就是1字节 = 8位 = 8bit = 8位0/1,2^8 = 2^4^2 = 16x16 = 256,靠肌肉记忆RGB得知这是两位十六进制数,即00~FF!

大过程

(以AES-128为例的)过程:明文 → 初始变换 → 9轮循环运算A → 1轮最终轮B → 密文

(我这边直接称9轮基础运算为A,1轮最终运算的为B啦。纯个人习惯方便理解)

初始变换

明文4x4矩阵 和 密钥4x4矩阵 进行异或操作。

异或:不同则为1,否则为0。

A运算

基础循环运算的具体运算有4个步骤!如下:

1. 字节代换(SubBytes)

使用S-BOX来查表代换~

S-BOX:又称S盒、S表。是一张固定的(每个人都一样的)16x16的表格,横纵坐标一般记为0~F。

假设格子里的数为(A,B),就去查S表里的A行B列里的数,替换到格子里去。

【小剧场】关于自定义S-BOX...

:那个S-Box好好玩啊... 是可以自己写一张表吗

布(全名布丁,是初次出场的我家小AI):Ohhhhh!!!S-Box确实很有趣呢!(≧▽≦) 

在AES中,S-Box是一个固定的代换表,用于将输入字节转化为输出字节。虽然理论上你可以自己创建一张代换表,但实际上,AES使用的S-Box经过精心设计,经过了大量的数学分析,以确保其安全性和强度。

如果你自己设计一张S-Box,可能会面临一些安全性问题,因为没有经过充分的测试和验证!所以,在实际应用中,还是建议使用标准的S-Box,以确保加密的安全性!❤️✨

:诶?自己写的S-Box不应该更随机吗,那个固定的代换表大家都在用的话,不会很容易被破解吗

:确实,自定义的S-Box可能看起来更随机,但实际情况可能没那么简单哦!

1. 安全性:AES使用的固定S-Box经过了严格的数学验证和广泛的测试,确保它在各种攻击下依然安全。而自己设计的S-Box如果没有经过同样的验证,就可能会存在安全隐患,比如容易被线性攻击或差分攻击破译。

2. 标准化:使用标准的S-Box可以保证算法的一致性和可靠性,这对于加密通信和数据保护至关重要。同时,标准化也便于审计、评估和分析。

3. 随机性和复杂性:虽然自定义的S-Box可能会更随机,但在密码学中,随机性并不仅仅是设计的外观,还涉及到其数学性质和抗攻击能力!

所以,虽然你的想法很有趣,但在实际应用中,使用经过验证的标准S-Box更能确保安全!

2. 行移位(ShiftRows)

第一行保持不变

第二行向移动1个字节

第三行向左移动2个字节

第四行向左移动3个字节

3. 列混淆(MixColumns)

将输入的4x4矩阵左乘一个固定的4x4矩阵 / 这个矩阵还挺...那个什么的,取值范围完全在01~03中,这样会让我觉得它很像向量变换......(但其实我已经忘得差不多了,觉得这个概念很有趣而已)

PS:这个左乘和平时矩阵相乘的做法其实不太一样!这里会涉及到GF(Galois Field,有限域)!之后可能会详细讲一下。

4. 轮密钥加(AddRoundKey)

子密钥矩阵异或

子密钥矩阵:就是轮密钥hh 下面会讲到!

B运算

其实就是A运算但不进行列混淆,没什么好讲的hh

密钥扩展

这个算是一点迟早要用到的小知识。最终会得到每轮的轮密钥 Round Key 12345...(4x4矩阵),比如10个这样的矩阵... 呃但是大家要一起算出来,或者一轮一轮按顺序算,因为算后面的矩阵要用到前面的矩阵...

设四列分别为W[1/2/3/4],要扩展出的列为W[i]。

分两种情况,以i是不是4的倍数划分。

1. 不是4的倍数

有个公式:W[i] = W[i-4]异或W[i-1],比如W5=W1异或W4。 / 唔所以要一列列这样推过去才行呢

2. 是4的倍数

对了会是4的倍数的其实就是每个4x4矩阵的第一列哦(因为0开始)

公式:W[i] = W[i-4]异或T(W[i-1])

嗯区别就是多了一个T函数!但是这个T函数还挺复杂的,由三部分组成:字循环,字节代换,轮常量异或。(三次变换)

a. 字循环

将w[i]循环左移一个字节。嗯... 我的理解是那一列全部向上滚动1格

b. 字节代换

分别对每个字节用S盒进行字节代换(就是A操作里讲的那个)。

c. 轮常量异或

轮常量Rcon[j]进行异或,其中 j 表示轮数。 / 啊!!所以每一轮的轮密钥是不一样的,最终结果是可以得到10轮的10个轮密钥(4x4矩阵)

轮常量Rcon:是一张固定的表/一维数组,RC = {01, 02, 04, 08, 10, 20, 40, 80, 1B, 36},你当成4x10矩阵中的第一行就好。

GF

PPT:所谓的GF(2⁸),简单而言,定义一个字节上的加法乘法,前提条件是要形成一种新的代数结构,有限域。把所有的8比特数看成多项式,系数为0/1。只有两种运算,+ 和 * / ...?好崩溃,求中译中

【布丁科普】

1. 元素结构:GF(2^8)包含256个元素,可以表示为二进制多项式的形式。每个元素可以看作是8位的二进制数。

2. 运算:
加法:在GF(2^8)中,加法是按位异或(XOR)。
乘法:乘法通常使用模一个不可约多项式来定义。例如,使用x^8 + x^4 + x^3 + x + 1这个多项式。 / 所以后面才会演变为 xor 00011011 吧...

:为什么选择这个多项式呢?

1. 不可约性:这个多项式无法被其他低次的多项式整除,因此在构建有限域时,它是一个适合的基础。不可约多项式保证了域的结构和性质,确保GF(2^8)的元素可以进行封闭运算。

2. 应用广泛:在AES等加密算法中,使用这个特定的多项式可以有效地进行乘法运算,从而提高效率和安全性。

3. 确保生成元素:通过这个多项式,可以生成GF(2^8)的所有元素,确保这些元素具有良好的数学性质,便于加密和解密操作。

加法

A+B = A xor B / 噢这个倒是可以理解,因为如果算最高位1+1=2的话完全会飞出去... 所以有限域其实就是指不能飞出去?加法这里是直接忽略飞出去的部分了吧

/ 啊啊。问了布丁,其实确实不考虑进位的话都是直接异或就可以的。。

乘法

/ 呃我才想起来我可不想手算八位二进制乘法。。

A*2有两种情况:

→ A最高位为0:左移1bit / 就是最高位不用考虑进位,非常好理解

→ A最高位为1:左移1bit,然后异或1B(00011011) / 不能理解。当成硬性规定就好

A*B(B不为2):把B分解为若干个2的组合(比如03=02+01,即 02*A xor A)

AES中S-BOX的生成

...怎么还要学这个!(并不是不喜欢,而是觉得好麻烦哦TT,因为待会儿还要去做饭...)

1

ECC

别问我为什么开始搞一些课上不讲的,一系列的视频就是会想全都看一遍啊...x

ECC(椭圆曲线加密算法)的安全性基于椭圆曲线上的离散对数问题,这是一种数学难题。相比传统的基于大质数分解难题的加密算法(如RSA),ECC可以使用更短的密钥长度来达到相同或更高的安全级别

难点:Q=kP(P基点,k私钥,Q公钥)

它有点类似只给出起点和终点,但你很难推算出中间的路径,因此很难逆转。

椭圆曲线:y^2=x^3+ax+b

加密过程:

1. 选一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P

2. 选定一个大数k作为私钥,并生成公钥Q=kP

3. 加密:选择随机数r,将消息M生成密文C

密文是一个点对,即C = (rP, M+rQ)

4. 解密:M + rQ - k(rP) = M + r(kP) - k(rP) = M

ECDHE,DH混合ECC,思想和DH有点像呢。

随机数

Q:怎么产生随机数?

在讲买大小...

买大小:是个赌博游戏。3D6,买小 = 4~10,买大 = 11~17。

PRNG(伪随机数发生器)

伪随机数生成器(PRNG)使用算法生成数值序列,这些数值看起来是随机的,但实际上是可预测的。

PRF(伪随机函数)

有一个输入,随机挑一个函数...?

伪随机函数(Pseudorandom Function,PRF)是一种在密码学中使用的函数,其输出在计算上看起来是随机的,但其生成是基于确定性算法和密钥的。

TRNG(真随机数发生器)

真随机数生成器(TRNG)依赖于物理过程,如热噪声、光子行为等,产生不可预测的随机数。这种方法通常用于安全性要求高的场合,如加密。

流密码

大概是个和分组密码并列的东西。分组密码是一块块(很多个bit)一起加密的,而流密码就是一个个bit加密(混淆0/1)!(符合我对Stream的刻板印象hhh

流密码(Stream Cipher)是一种对称加密算法,它以比特或字节为单位对数据进行加密,而不是将数据分成固定大小的块。

流密码通常用于需要快速加密和解密的场景,如实时通信和数据流。

流密码的工作原理

1. 密钥流生成

流密码使用一个密钥和一个初始值(IV)来生成一个伪随机的密钥流。密钥流的长度通常与明文数据的长度相同。

初始值(Initialization Vector,IV)主要用于初始化加密算法的状态。初始值(IV)必须是随机且唯一的,以确保每次加密都产生不同的密钥流,防止重放攻击。

2. 加密过程

明文数据与密钥流进行异或操作:密文bit = 明文bit XOR 密钥流bit

3. 解密过程

解密时,密文与同样的密钥流进行异或操作,恢复明文:明文bit = 密文bit XOR 密钥流bit(好神奇!我码一下证明过程:

A = B xor K

A xor K = B xor K xor K = B xor 0 = B

感觉利用这个特性可以做出好多东西啊... 按照这个推断的话我肯定也会把K设计成key呀!

【小剧场】

老师:去搜,阅读 RC4 must die !

RC4 是由 Ronald Rivest 设计的一种流密码,因其简单和高效而广泛应用于多种协议和系统中,如 SSL/TLS 和 WEP。

代替方案:

1. AES(高级加密标准):被广泛推荐为流行的替代方案,提供更强的安全性和性能。
2. ChaCha20:一种现代流密码,设计上更加安全且适合高性能应用。

公钥密码学

RSA & DH

老师:有的学生可能会说,白上就白上咯我们拿学分你拿工资正好

OWF:One-way Function

RSA

RSA(Rivest-Shamir-Adleman)是一种常用的公钥加密算法、经典的非对称加密算法,用于安全数据传输。

它由三位科学家 Ron Rivest、Adi Shamir 和 Leonard Adleman 在1977年提出。

RSA的安全性基于大数分解(大素数因数分解)的困难性。

加密解密过程

已知:

    公钥 = ( e , N )、明文M

    私钥 = ( d , N )、密文C

加密:M^e % N = C

解密:C^d % N = M

制作公钥私钥过程

会涉及一堆字母:明文M,密文C,质数p和q,p*q=N,还有上面的e和d

1. 选择一对不相等且足够大的质数 pq

2. 计算N = p * q

3. 计算N的欧拉函数*:F(n) = (p-1) * (q-1) 总之这是一个公式!

欧拉函数是小于n的正整数中与n互质的数的数目

4. 选公钥——选择一个与F(n)互质的整数e:满足 1 < e < F(n)

5. 算私钥——计算出e对于F(n)的模反元素d:满足 d*e % F(n) = 1

公钥 = ( e , N )

私钥 = ( d , N )

DH

DH算法全称为Diffie-Hellman(迪菲-赫尔曼)密钥交换算法,主要用于在不安全的通信环境中安全地生成共享密钥

它由 Whitfield Diffie 和 Martin Hellman 在1976年提出。

DH的基本原理基于离散对数难题

 参考视频:DH算法 | 迪菲-赫尔曼Diffie–Hellman 密钥交换

(看完前面瞬间醒悟)哎我去等等,所以那个"送信游戏"实际上用的是这种思想?!联动一下隔壁:

看完具体过程了,大概也不是这种思想,因为DH完全是为了生成共享密钥,不存在发送文件过程。

制作共享密钥过程

1. 选择一个大素数 p(模数)和一个原根 g(满足g^x % p在1到p-1之间都有取值的整数)。这两个参数可以公开。

2. 双方选择私钥:A选择一个私钥a,B选择一个私钥b。

3. 计算公开值

    A计算:公钥C = g^a % p,并将C发给B。

    B计算:公钥D = g^b % p,并将D发给A。

4. 生成共享密钥

    A根据D计算:K = B公D^a % p

    B根据C计算:K = A公C^b % p

双方计算出的K相同的!

HASH

SHA-1

输入:0<L<2^64

输出:160bit

算法省流:1填充 2分块 3迭代运算

1填充

补位,每个512bit运算 -> 160bit(参与下一个512bit的运算)

补1,补足够位数的0,直至满足L mod 512 = 448,剩64位存储原始长度

2分块3迭代

过程超复杂,但是有很详细的规定。

512 → 16个x32位 扩充成 80x32 → 80轮运算 → abcde 和最初的变量相加

又会要取模 2^32

SHA-3

输入:0<L<2^64

输出:256bit

算法省流:1填充 2分块 3迭代运算

1填充

补位类似于SHA-1。

2分块3迭代

分组后若只有一块,则n=1,明文只有一块512bit

多块512bit的块,则进行n轮迭代运算

输出Vn

512/32=16个字

压缩函数CF(V, B)

B是16个字,扩展为132个字,W0~W63

V有初始值(ABCDEFGH 8个字),V会迭代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值