密码学(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. 选择一对不相等且足够大的质数 p、q
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会迭代