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

0

2

,

s

k

0

3

sk_0=sk_0^1, sk_0^2, sk_0^3

sk0​=sk01​,sk02​,sk03​

s

k

1

=

s

k

1

1

,

s

k

1

2

,

s

k

1

3

sk_1=sk_1^1, sk_1^2, sk_1^3

sk1​=sk11​,sk12​,sk13​
为了与上面的原始版本对比,

s

k

1

sk_1

sk1​我们还是使用上面的3个密钥,有:

s

k

1

=

9

,

A

,

E

sk_1=9, A, E

sk1​=9,A,E

s

k

1

1

=

9

,

s

k

1

2

=

A

,

s

k

1

3

=

E

sk_1^1=9, sk_1^2=A, sk_1^3=E

sk11​=9,sk12​=A,sk13​=E
我们随机生成sk0

s

k

0

=

B

,

C

,

4

sk_0 = B, C, 4

sk0​=B,C,4
因此密钥为

S

K

=

[

B

,

C

,

4

9

,

A

,

E

]

SK=\begin{bmatrix} B, C, 4\ 9, A, E\end{bmatrix}

SK=[B,C,49,A,E​]
2. 生成公钥:还是使用哈希函数H(x),对私钥进行运算,得到公钥。我们现在称公钥(Public Ksy)为

P

K

PK

PK
有:

P

K

=

H

(

S

K

)

,

P

K

=

(

p

k

0

,

p

k

1

)

PK = H(SK), PK=(pk_0, pk_1)

PK=H(SK),PK=(pk0​,pk1​)
具体来讲:

p

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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

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

)

,

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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-gtcakmNP-1713043632412)]
[外链图片转存中…(img-cZk4kxzT-1713043632413)]
[外链图片转存中…(img-CEk1t1TQ-1713043632413)]
[外链图片转存中…(img-qKvFsI46-1713043632413)]
[外链图片转存中…(img-1g8erzja-1713043632413)]

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

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

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-eGSanVD1-1713043632414)]

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

[外链图片转存中…(img-YZWTpLIl-1713043632414)]

给大家整理的电子书资料:

[外链图片转存中…(img-bc0Verej-1713043632414)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值