【零基础入门哈希签名架构,从Lamport到SPHINCS+】第一集 哈希签名始祖 Lamport 方案及其改进版本(Merkle

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

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)

  1. 计算Massage中0的个数,这里Massage时010,因此0的个数为2,在3bit的Massage中0最多有3个,因此要额外用2bit的位置表示校验和,因此加上校验和(Checksum)后的Massage为 010 10。同时我们可以和容易的算出,nbit的Massage只需要在后面加上

l

o

g

2

n

log_2n

log2​n bit的校验和即可。我们都知道

l

o

g

2

n

log_2n

log2​n是远小于

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+log2​n,大大减小了key的长度。

2.4 第三代改进 Winternitz 1979

1979年,斯坦福大学数学系的罗伯特·温特尼茨(Robert Winternitz)提出了一个进一步的实质性改进,将签名消息的大小额外减少了大约4到8倍。Winternitz的方法用时间换取了空间:减少的尺寸是以增加的计算工作量来换取的。

2.4.1 具体流程

这一代的具体流程和前面的3个版本都有挺大差别,他从另一个角度来减小签名的大小。
假设我们现在有一个32bit的massage

  1. 分块:首先将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
  2. 计算校验和:这里的校验和就是每一块数据的和,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。
  3. 生成私钥:生成4个私钥,每一个私钥对于原massage中的一个byte。比如说私钥为A B C D。但是一个byte有256种可能,而私钥只有一个,怎么一一对应起来呢?这就涉及到后面公钥是怎么生产的了。
  4. 生产签名:最神奇的地方来了。对于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种不同的签名方案,可以说是一脉相承,步步改进。现在我们来总结一下。

我们以下面的几个维度来对比以下这四种算法:

  1. 安全性:是否安全,不可被攻击
  2. 密钥对和签名长度:私钥长度、公钥长度、签名长度
  3. 签名算法花费的时间:签名时间复杂度、验证时间复杂度

我们假设massage的长度为nbit

4.1 第一版

第一版是不安全的,可以被攻击中篡改。因此我们也不讨论后面的两个维度了。

4.2 第二版

  1. 安全性:是。
  2. 私钥长度:2n,公钥长度2n,签名长度n
  3. 签名时间复杂度

O

(

n

)

O(n)

O(n),验证时间复杂度

O

(

n

)

O(n)

O(n)

4.3 第三版 Merkle 1990

  1. 安全性:是。
  2. 私钥长度:

n

l

o

g

2

n

n+log_2n

n+log2​n,公钥长度

n

l

o

g

2

n

n+log_2n

n+log2​n,签名长度

n

l

o

g

2

n

n+log_2n

n+log2​n
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

log2​w bit
因此块数为

l

1

=

n

/

l

o

g

2

w

l_1=n/log_2w

l1​=n/log2​w

  1. 安全性:是。
  2. 私钥长度:

l

1

l

o

g

2

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

O

(

n

)

O(n)

O(n)

4.3 第三版 Merkle 1990

  1. 安全性:是。
  2. 私钥长度:

n

l

o

g

2

n

n+log_2n

n+log2​n,公钥长度

n

l

o

g

2

n

n+log_2n

n+log2​n,签名长度

n

l

o

g

2

n

n+log_2n

n+log2​n
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

log2​w bit
因此块数为

l

1

=

n

/

l

o

g

2

w

l_1=n/log_2w

l1​=n/log2​w

  1. 安全性:是。
  2. 私钥长度:

l

1

l

o

g

2

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-YyB2QSwj-1713474385649)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值