先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
正文
k
0
i
=
H
(
s
k
0
i
)
,
p
k
1
i
=
H
(
s
k
1
i
)
,
i
∈
{
1
,
2
,
3
}
pk_0i=H(sk_0i), pk_1i=H(sk_1i), \ i \in{1,2,3}
pk0i=H(sk0i),pk1i=H(sk1i), i∈{1,2,3}
为了与上面的原始版本对比,
p
k
1
pk_1
pk1我们还是使用上面的3个公钥,有:
s
k
1
=
5
,
D
,
2
sk_1=5,D,2
sk1=5,D,2
我们随机生成pk0
p
k
0
=
F
,
3
,
6
pk_0 = F, 3, 6
pk0=F,3,6
因此公钥为
P
K
=
[
F
,
3
,
6
5
,
D
,
2
]
PK=\begin{bmatrix} F, 3, 6 \ 5,D,2 \end{bmatrix}
PK=[F,3,65,D,2]
然后Sender包公钥公布于众
3. Sender发送明文和签名,明文就是010
。签名是这样的,当明文为0
时,对应位置上的签名为
s
k
0
i
sk_0^i
sk0i,当明文为1
时,对应位置上的签名就是相应的
s
k
1
i
sk_1^i
sk1i。因此这里的签名Signature是BA4
4. Receiver接收到签名。开始验证,第一个bit是0,因此将Signature的第一个位B
做哈希运算H(B)=F,得到的结果是F
,这和
p
k
0
1
pk_0^1
pk01对应,这没有问题。然后第二bit是1
,对应的signature是A
,对其进行哈希运算,H(A) = D,得到的结果是D
,这和公钥中对应位置的数
p
k
1
2
pk_1^2
pk12是一样的,因此也没有问题。第三个bit以此类推。验证完毕后,receiver可以确定这个010
是sender发出来的了。
签名:
验证:
安全性:
2.2.2 该方案的缺点
最明显的缺点就是,私钥和公钥都很大,是Massage的bit数的两倍。当Massage很大的时候,签名和公钥就变得很大。
2.3 第二代改进 Merkle 1990
该方案是1990年Merkle在《A CERTIFIED DIGITAL SIGNATURE》中的第四节“4. An Improved One Time Signature”中提出的方案。
2.3.1 具体流程
这一代的具体流程和原始版本是一样的,不同的地方是,在整个Massage后面,加上了一个数,用于校验Massage中0
的个数,这个数被称为“校验和”(Checksum)
- 计算Massage中
0
的个数,这里Massage时010
,因此0
的个数为2,在3bit的Massage中0
最多有3个,因此要额外用2bit的位置表示校验和,因此加上校验和(Checksum)后的Massage为010 10
。同时我们可以和容易的算出,n
bit的Massage只需要在后面加上
l
o
g
2
n
log_2n
log2n bit的校验和即可。我们都知道
l
o
g
2
n
log_2n
log2n是远小于
n
n
n的,因此可以节省很多空间,这样密钥对的大小就可以被大大减小了。
2. 生成私钥:因为多了2bit的校验和,因此要随机生成3+2
个不同的数,密钥:9 A E 5 0
3. 生成公钥:使用哈希函数H(x),对私钥进行运算,得到公钥。最后得到的公钥是5D267
4. Sender发送明文和签名,明文就是010 10
。签名是这样的,当明文为0
时,对应位置上的签名为空,当明文为1
时,对应位置上的签名就是相应的私钥。因此这里的签名Signature是空A空 5空
5. Receiver接收到签名。开始验证,signature上空
的位置和massage中0
的位置是对应的,这没有问题。然后再对signature中的A
进行哈希运算,H(A) = D,得到的结果是D
,这和公钥中对应位置的数是一样的,因此也没有问题。校验和的两位也是同理。好了,验证完毕,receiver可以确定这个010
是sender发出来的了。
为什么这样做就是安全的呢?如果攻击者,把原Massage中的1
修改成0
,校验和也一起改,这样不行吗?
答案是不行的。首先我们先想想,校验和我们可以改成什么?我们只能把原本为1
的改成0
,通过这个操作,你只能把校验和减小,而不能变大。由于校验和代表的是原Massage中0的个数,也就是说通过改变校验和,我们只能把原Massage中0的个数减小,但是我们只能把1
的改成0
,也是增加0的个数。
是不是很巧妙?所以通过这样死锁,保证了这种方案安全性。
2.3.2 该方案的总结
该方案是1990年Merkle在《A CERTIFIED DIGITAL SIGNATURE》中的第四节“4. An Improved One Time Signature”中提到对OTS的改进。对于一个长度为n的massage,之前需要使用
2
∗
n
2*n
2∗n长度的key,而现在只需要
n
l
o
g
2
n
n+log_2 n
n+log2n,大大减小了key的长度。
2.4 第三代改进 Winternitz 1979
1979年,斯坦福大学数学系的罗伯特·温特尼茨(Robert Winternitz)提出了一个进一步的实质性改进,将签名消息的大小额外减少了大约4到8倍。Winternitz的方法用时间换取了空间:减少的尺寸是以增加的计算工作量来换取的。
2.4.1 具体流程
这一代的具体流程和前面的3个版本都有挺大差别,他从另一个角度来减小签名的大小。
假设我们现在有一个32bit
的massage
- 分块:首先将massage分块,每一块的大小一般为
4bit
或者8bit
,这里我们使用8bit
,因此massage被分成4块。每一块就是1byte
。因为8bit可以表示0-255,所以我们直接用十进制来表示massage,我们的32bit的massage是0 1 2 3
写成二进制就是0000 0000 - 0000 0001 - 0000 0010 - 0000 0011
- 计算校验和:这里的校验和就是每一块数据的和,
0+1+2+3=6
,因此这里校验和是6
。在这个例子中,校验和最大为4*255=1020
因此需要额外的10bit
来表示校验和。加上校验和后的massage为0000 0000 - 0000 0001 - 0000 0010 - 0000 0011 -- 00 0000 0110
。最后的明文0000 0000 - 0000 0001 - 0000 0010 - 0000 0011 -- 0000 0000 - 0000 0110
,这里为了方便,把校验和中的6bit变成2byte,所以现在一共是6byte。 - 生成私钥:生成
4
个私钥,每一个私钥对于原massage中的一个byte。比如说私钥为A B C D
。但是一个byte有256种可能,而私钥只有一个,怎么一一对应起来呢?这就涉及到后面公钥是怎么生产的了。 - 生产签名:最神奇的地方来了。对于massage的第一个byte,是
0
,因此第一个signature就是对应位置上的A
。如果第一个byte是1
,则signature是对应位置上的A
做一次哈希运算
H
(
A
)
H(A)
H(A);如果第一个byte是2
,则signature是对应位置上的A
做两次哈希运算
H
(
H
(
A
)
)
=
H
2
(
A
)
H(H(A))=H^2(A)
H(H(A))=H2(A);以此类推;如果如果第一个byte是255
,则signature是对应位置上的A
做255次哈希运算
H
255
(
A
)
H^{255}(A)
H255(A)。根据这个规则,最后得到的4个byte的signature是
A
,
H
(
B
)
,
H
2
(
C
)
,
H
3
(
D
)
A,\ H(B),\ H2©, H3(D)
A, H(B), H2©, H3(D) 。后面校验和的signature还是使用之前的签名方法。
5. 产生公钥:公钥就是将密钥做256次哈希运算后得到的值:
H
256
(
A
)
,
H
256
(
B
)
,
H
256
(
C
)
,
H
256
(
D
)
H{256}(A), H{256}(B),\ H{256}©, H{256}(D)
H256(A), H256(B), H256©, H256(D) 。后面校验和的公钥还是使用之前的方法,
p
k
5
,
p
k
6
pk_5,\ pk_6
pk5, pk6。Sender将公钥公布于众。
6. Sender发送明文和签名:明文0000 0000 - 0000 0001 - 0000 0010 - 0000 0011 -- 0000 0000 - 0000 0110
.签名
A
,
H
(
B
)
,
H
2
(
C
)
,
H
3
(
D
)
,
s
k
5
,
s
k
6
A,\ H(B),\ H2©, H3(D),\ sk_5,\ sk_6
A, H(B), H2©, H3(D), sk5, sk6
7. Receiver验证:对于第一个byte: 0
,把对应的签名
A
A
A 做256-0=256
次哈希函数运算,得到
H
256
(
A
)
H^{256}(A)
H256(A) ,这与第一byte对应的公钥一致,第一byte验证完毕。对于第二个byte: 1
,把对应的签名
H
(
B
)
H(B)
H(B) 做256-1=255
次哈希函数运算,得到
H
256
(
B
)
H^{256}(B)
H256(B) ,这与第二byte对应的公钥一致,第二byte验证完毕。后面的两个byte以此类推。最后的校验和还是使用之前的方法,这里不再赘述。
2.4.2 该方案的安全性
聪明的你肯定又发现了,只要攻击者知道sk0,那么通过Hash计算,就可以知道后面的
s
k
1
∼
s
k
254
sk_1 \sim sk_{254}
sk1∼sk254。那么攻击者是不是就可以把这个byte的0
篡改成1~254
呢?
但是我们上面提到校验和的时候,一直说我们用之前的方法来验证校验和。这就意味着校验和只能被改小(因为只能把1
改成0
),也意味着校验和是6
只能变小或者不变。
假如攻击者不改变校验和。攻击者将0 1 2 3
中的0
修改成1
,则需要在后面的3个byte中选一个减去1。但是攻击者是无法将一个byte里的数减小的,只能增大,(因为哈希函数的单向性)。
假如攻击者将校验和变小。同理,攻击者肯定需要在0 1 2 3
中至少把其中的一个数变小,这也是攻击者做不到的。
综上,保证了此算法的安全性。
四、总结
从最开始的Lamport提出的方案,现在一共介绍了4种不同的签名方案,可以说是一脉相承,步步改进。现在我们来总结一下。
我们以下面的几个维度来对比以下这四种算法:
- 安全性:是否安全,不可被攻击
- 密钥对和签名长度:私钥长度、公钥长度、签名长度
- 签名算法花费的时间:签名时间复杂度、验证时间复杂度
我们假设massage的长度为n
bit
4.1 第一版
第一版是不安全的,可以被攻击中篡改。因此我们也不讨论后面的两个维度了。
4.2 第二版
- 安全性:是。
- 私钥长度:
2n
,公钥长度2n
,签名长度n
- 签名时间复杂度
O
(
n
)
O(n)
O(n),验证时间复杂度
O
(
n
)
O(n)
O(n)
4.3 第三版 Merkle 1990
- 安全性:是。
- 私钥长度:
n
l
o
g
2
n
n+log_2n
n+log2n,公钥长度
n
l
o
g
2
n
n+log_2n
n+log2n,签名长度
n
l
o
g
2
n
n+log_2n
n+log2n
3. 签名时间复杂度
O
(
n
)
O(n)
O(n),验证时间复杂度
O
(
n
)
O(n)
O(n)
4.4 第四版 Winternitz 1979
第四版比较特殊,因为要分块。
假设我们每一块能代表的数为w
。这里的w
也被称为Winternitz系数,每一块就是
l
o
g
2
w
log_2w
log2w bit
因此块数为
l
1
=
n
/
l
o
g
2
w
l_1=n/log_2w
l1=n/log2w
- 安全性:是。
- 私钥长度:
l
1
l
o
g
2
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
O
(
n
)
O(n)
O(n)
4.3 第三版 Merkle 1990
- 安全性:是。
- 私钥长度:
n
l
o
g
2
n
n+log_2n
n+log2n,公钥长度
n
l
o
g
2
n
n+log_2n
n+log2n,签名长度
n
l
o
g
2
n
n+log_2n
n+log2n
3. 签名时间复杂度
O
(
n
)
O(n)
O(n),验证时间复杂度
O
(
n
)
O(n)
O(n)
4.4 第四版 Winternitz 1979
第四版比较特殊,因为要分块。
假设我们每一块能代表的数为w
。这里的w
也被称为Winternitz系数,每一块就是
l
o
g
2
w
log_2w
log2w bit
因此块数为
l
1
=
n
/
l
o
g
2
w
l_1=n/log_2w
l1=n/log2w
- 安全性:是。
- 私钥长度:
l
1
l
o
g
2
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-YyB2QSwj-1713474385649)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!