数据完整性算法
- 概念
- 消息加密实现认证
- 对称加密提供认证
- 公钥加密提供认证
- Hash函数
- 要求满足特点
- 哈希函数安全性要求
- 密码分析
- 基于分组密码链接的Hash函数
- 生日攻击:
- MD5
- SHA-256算法步骤
- SHA-3
- 散列函数实现消息认证
- 散列函数实现消息认证方法一
- 散列函数实现消息认证方法二
- 散列函数实现消息认证方法三
- 散列函数实现消息认证方法四
- 散列函数实现数字签名
- 散列函数实现数字签名 方法一
- 散列函数实现数字签名方法二
- 消息认证码
- 消息认证码的基本用途1:报文认证码用作消息认证
- 消息认证码的基本用途2:与对称加密结合,实现保密性和认证性
- 消息认证码的基本用途3:与对称加密结合,实现保密性和认证性
- 使用哈希函数的消息认证码HMAC
- 基于分组密码的MAC:数据认证算法DAA和基于密文的消息认证码CMAC
- 数字签名
- 组成、原理、特征、要求
- 攻击和伪造:
- 直接数字签名:
- ElGamal数字签名方案
- Schnorr数字签名方案
- 数字签名标准DSS
- RSA概率签名方案
- ECC签名算法ECDSA
- 其他类型的签名
概念
哈希函数是将任意长度的消息映射成一个较短的定长输出消息的函数,又称散列函数、杂凑函数。
认证(Authentication)是防止主动攻击的重要技术,对开发系统安全性有重要作用。认证的主要目的包括:实体认证(验证信息来源的真实性,发送者非冒充,又称消息源认证)、消息认证(验证信息的完整性,即消息在传送或存储过程中未被篡改、重放或延迟)。----->>消息认证码的功能:接收方详细发送方发来的消息未被篡改、接收方相信发送方不是冒充的。
消息认证:验证所收到的消息确实是来自真正的发送方,且未被修改。可以看作两层: (1) 产生消息认证符的函数 (2) 使用认证函数作为原语来验证消息真实性的协议
保密和认证是信息系统安全的两个方面,但它们是两个不同属性的问题,认证不能自动提供保密性,而保密性也不能自然提供认证功能。
数字签名:给以电子形式存储的消息进行签名,签名后的消息可以通过计算机网络传输
数字证书:数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人都可以查询和下载,因此数字证书和公钥一样是公开的。可以这样说,数字证书就是经过CA认证过的公钥,而私钥一般情况都是由证书持有者在自己本地生成的,由证书持有者自己负责保管。
三类产生认证符的函数:报文加密
(消息加密)、报文认证码(MAC)
(消息认证码)、哈希函数
;
消息加密实现认证
对称加密提供认证
用户A为发信方,用户B为接收方。用户B接收到信息后,通过解密来判决信息是否来自A,信息是否是完整的,有无窜扰。
A向B发送A向B发送 E K ( M ) E_K(M) EK(M):提供保密、提供一定程度的认证、不提供签名
公钥加密提供认证
发送方用对方的公钥加密消息,接收方用自己的私钥解密消息—>提供了保密性,但不提供认证性。
发送方用自己的私钥签名消息M,接收方用发送方公钥验证签名–>提供了认证性,但不提供保密性。
发送方先用自己的私钥签名消息,然后用接收方的公钥加密消息–>既提供认证性又提供保密性。
Hash函数
哈希函数是将任意长度的消息映射成一个较短的定长输出消息的函数,又称散列函数、杂凑函数。
散列函数的特点:任意长输入,产生定长输出;
一个**“好”的哈希**函数具有特点:对于一个大的输入集合,其输出结果均匀分布且看起来随机。
首要目标:保证数据完整性;具雪崩效应
h =H(x)则成x是h的原像
要求满足特点
单向性:对任意给定的x, H(x)要相对易于计算;而对任意给定的码h, 寻求x使得H(x)=h在计算上是不可行的;
弱抗碰撞性:任意给定消息x, 寻求不等于x的y, 使得H(y)= H(x)在计算上不可行
强抗碰撞性:寻求对任何的(x,y)对使得H(x)=H(y)在计算上不可行
哈希函数安全性要求
单向性、弱抗碰撞性、强抗碰撞性、输入长度可变、输出长度固定、效率(易计算、软硬件可实现)、伪随机性
密码分析
攻击:理想的哈希函数要求密码分析的代价大于穷举,密码分析主要集中在对f的内部结构分析,并试图找到能由f的单步执行产生碰撞的有效方法
Merkle和Damgard在1989年证明,如果压缩函数f具有抗碰撞能力,那么MD结构的迭代Hash函数也具有抗碰撞能力。因此现有的Hash函数大多使用MD迭代结构。
在这种结构下,设计安全Hash函数可以归纳为设计输入为定长,且具有抗碰撞能力的压缩函数f
对Hash的密码分析集中在对f的内部结构分析,并试图找到f的碰撞。且需要分析轮与轮之间信息变化的规律
但是,在第三代的安全Hash算法(SHA-3)中,人们倾向于放弃MD结构
基于分组密码链接的Hash函数
例如rabin提出的将消息M分成固定大小的分组 M 1 , M 2 , . . . , M n M_1,M_2,...,M_n M1,M2,...,Mn,并使用对称加密体制,如DES,计算其Hash码G。这种方法类似CBC方法,但不使用密,也容易受到生日攻击。
生日攻击:
(弱抗碰撞性)给定一个Hash函数H和一个Hash值H(x)。假定H的输出长度为m比特,即共有 2 m 2^m 2m个Hash码。将H作用于k个随机的输入,那么满足这些输入中至少有一个y,使得H(y)=H(x) 的概率为0.5的k的值为 2 m / 2 2^{m/2} 2m/2,即 2 m 2^m 2m数量级。
(强抗碰撞性)给定一个Hash函数H。假定H的输出长度为m比特。将H作用于k个随机的输入得到集合X,将H作用于另外k个随机输入得到集合Y。则这两个集合至少有一个匹配(即存在 x ∈ X , y ∈ Y x∈X,y∈Y x∈X,y∈Y,使得 H ( y ) = H ( x ) H(y)=H(x) H(y)=H(x) )时k的值为 2 m / 2 2^{m/2} 2m/2 (例: 36 5 1 / 2 ≈ 23 365^{1/2}≈23 3651/2≈23)。
简单的说,对输出长度为m的Hash函数,值
2
m
/
2
2^{m/2}
2m/2决定了该Hash函数抗穷举攻击的能力。
MD5
步骤1:添加填充位(一个1和若干个0)。在消息的最后添加适当的填充位使得数据位的长度满足 l e n g t h ≡ 448 m o d 512 length\equiv 448 \mod 512 length≡448mod512。
步骤2:添加长度。原始消息长度,用64位表示。如果长度超过 2 64 2^{64} 264位,则仅取最低64位。
步骤3:初始化MD缓冲区。一个128位MD缓冲区用以保存中间和最终散列函数的结果。它可以表示为4个32位的寄存器(A,B,C,D)。寄存器初始化为以下的16进制值。使用低端格式存储。
步骤4:处理消息块(512位 = 16个32位字)。一个压缩函数是本算法的核心( H M D 5 H_{MD5} HMD5)。它包括4轮处理。四轮处理具有相似的结构,但每次使用不同的基本逻辑函数,记为F,G,H,I。每一轮以当前的512位数据块( Y q Y_q Yq)和128位缓冲值ABCD作为输入,并修改缓冲值的内容。每次使用64元素表T[1…64]中的四分之一。T表,由sin 函数构造而成。
步骤5:输出结果。所有L个512位数据块处理完毕后,最后的结果就是128位消息摘要。
SHA-256算法步骤
步骤1:添加填充位(一个1和若干个0)。在消息的最后添加适当的填充位使得数据位的长度满足 l e n g t h ≡ 896 ( m o d 1024 ) length\equiv 896(\mod 1024) length≡896(mod1024)。
步骤2:添加长度。一个128位块,表示原消息长度,128位无符号整数
步骤3:分组,将消息以1024位为单位分成N组
步骤4: 初始化哈希缓冲区。一个512位缓冲区用以保存中间和最终散列函数的结果。它可以表示为8个64位的寄存器。
步骤5:以1024位分组为单位处理消息。
算法核心的模块F是80轮运算的模块。每轮输入缓冲区中512位,并更新缓冲区。
步骤6:输出。最后一组输出512位哈希码。
SHA-3
设计者将SHA-3使用的基本迭代结构成为海绵结构方案
海绵结构与其他迭代哈希函数结构相似
海绵函数的输入也是:消息分组+上轮输出反馈,海绵函数由三组参数定义:f,r,pad
海绵函数允许输入、输出长度都可变;用于设计哈希函数、用于伪随机数发生器、其他密码函数……
两种填充方案:
简单填充:pad10*:10000…000
多重位速率填充:pad10*1:1000…001
两种输出方案:对于输出长度为L
若L<b,直接输出前L位(一般的hash)
若L>b,进入挤压阶段,每轮输出r位直至长度足够
整体结构上看,Keccak算法主要依靠基于海绵结构(sponge construction)的海绵函数(sponge function),状态更新使用的是作用在三维数组上的五步迭代排列
硬件实现优势非常明显
f函数在每个输入消息块被Hash时执行一次,函数的输入是1600位的状态变量s,将s转换为由64位纵构成的5*5矩阵,然后函数对矩阵执行24圈操作,每一圈包括5个步骤,每个步骤通过置换或代换操作作对状态矩阵进行更新。
散列函数实现消息认证
散列函数实现消息认证方法一
假设A和B共享密钥K。A向B发送: E k ( M ∣ ∣ H ( M ) ) E_k(M || H(M) ) Ek(M∣∣H(M))
提供保密性(仅A和B共享K);提供认证性(加密保护H(M))
散列函数实现消息认证方法二
假设A和B共享密钥K。A向B发送: M ∣ ∣ E k ( H ( M ) ) M || E_k(H(M)) M∣∣Ek(H(M))
提供鉴认证(加密保护 H(M) );可以看作是是一个MAC
散列函数实现消息认证方法三
该方法不使用加密函数。但假设A和B共享某秘密S
A向B发送: M ∣ ∣ H ( M ∣ ∣ S ) M || H(M || S) M∣∣H(M∣∣S)
提供消息认证
散列函数实现消息认证方法四
假设A和B共享会话密钥K,以及某秘密信息S。A向B发送: E k ( M ∣ ∣ H ( M ∣ ∣ S ) ) E_k(M || H(M||S)) Ek(M∣∣H(M∣∣S))
提供消息认证 (仅A和B共享S);提供保密(仅A和B共享K)
不希望使用加密函数的理由:加密软件速度慢;加密硬件成本不容忽视;加密硬件的优化通常是针对大数据块的;加密算法可能收专利保护;
消息认证是通过使用消息认证码(MAC)实现的,即带密钥的Hash函数。
散列函数实现数字签名
散列函数实现数字签名 方法一
假设A的公私钥对为 P K a , S K a {PK_a,SK_a} PKa,SKa,A向B发送: M ∣ ∣ S i g S K a ( H ( M ) ) M || Sig_{SK_a}(H(M)) M∣∣SigSKa(H(M))
提供消息认证和数字签名(加密保护 H ( M ) H(M) H(M),且仅A能生成 S i g S K a ( H ( M ) ) Sig_{SK_a}(H(M)) SigSKa(H(M)),即:对“指纹”签名
散列函数实现数字签名方法二
假设A的公私钥对为 P K a , S K a {PK_a,SK_a} PKa,SKa,A和B共享会话密钥k
A向B发送: E k ( M ∣ ∣ S i g S K a ( H ( M ) ) ) E_k(M||Sig_{SK_a}(H(M))) Ek(M∣∣SigSKa(H(M)))
提供消息认证和数字签名;提供保密性(仅A和B共享K)
消息认证码
认证码(MAC,也称密码检验和),也是一种认证技术,其中的一些方法可用来抗发送方否认;
实现消息认证的基本方法,即消息认证码。
两类MAC:使用密码学Hash函数的MAC
和使用分组密码的MAC
。
消息认证就是验证所收到的消息确实是来自真正的发送方,且是未被修改的消息。它也可验证消息的顺序和及时性。
认证(Authentication),又称鉴别,确认,它是证实某事是否符合其实或是否有效的一个过程。
对选定报文M,使用一个密钥K,产生一个短小的定长数据分组,称为认证码MAC,并将它附加在报文中,提供认证功能。
认证和加密的区别在于:
加密是用于确保数据的保密性,阻止对手的被动攻击,如截取,窃听等;
认证用于确保报文发送者和接收者的真实性以及报文的完整性,阻止对手的主动攻击,如冒充、篡改、重播等。
与对称加密的区别与联系:
认证函数类似加密函数,但它是不需要可逆的;
由于认证函数的数学性质,会比加密函数更难破解
MAC不能用于实现保密性;认证函数并不提供数字签名
对MAC的要求:(性质)(假定攻击者没有K)
消息M变长,认证码MAC定长;
有M和 C k ( M ) C_k(M) Ck(M),试图生成 M ′ M' M′, 使得 C k ( M ′ ) = C k ( M ) C_k(M')= C_k(M) Ck(M′)=Ck(M), 这在计算上不可行;
C k ( M ) C_k(M) Ck(M)应能均匀分布;
对于随机选取的报文 M M M和 M ′ M' M′, C k ( M ) = C k ( M ′ ) C_k(M)= C_k(M') Ck(M)=Ck(M′)的概率为2-n。其中n 为 MAC的比特长度
报文 M ′ M' M′为 M M M的某种已知代换,即 M ′ = f ( M ) M'=f(M) M′=f(M),则 C k ( M ) = C k ( M ′ ) C_k(M)= C_k(M') Ck(M)=Ck(M′)的概率为2-n
为什么使用消息认证(而不是用常规加密)?
适用于广播;报文加密解密的工作量比较大;某些应用不关心报文的保密而只关心报文的真实性;认证函数与保密函数的分离能提供结构上的灵活性(认证与保密可在网络协议的不同层次进行);认证码可延长报文的保护期限,同时能处理报文内容。
必须使用MAC的三种情况是:对同一消息进行广播;通信一方的负荷很大没时间解密;对明文计算机程序进行认证,消息认证码附于程序之后需保证完整性时校验;
而更适合使用MAC的情况是:一些应用无须保密,更在乎认证;将认证和保密分离,可以使层次结构更灵活;用户可能希望延迟对消息的保护时间
网络通信环境中,可能有下述攻击:
1)消息透露给没有合法密钥的人或程序;
2)传输分析
3)伪装
4)内容修改
5)顺序修改
6)计时修改
7)发送方否认
8)接收方否认
其中,1和2是消息保密性范畴;3456是消息认证;7是数字签名(一般数字签名也可以抵抗3456);8需要数字签名和协议;
一种是直接利用公钥密码算法仅对Hash码进行加密,可以提供认证。
另一种是先利用发送方的私钥对Hash码进行加密,再用对称密码中的密钥对消息和公钥算法加密结果进行加密,这种比较常见。
消息认证码的基本用途1:报文认证码用作消息认证
A向B发送: M ∣ ∣ C k ( M ) M || C_k(M) M∣∣Ck(M)
作用: 提供认证, 因为仅A和B共享密钥K
消息认证码的基本用途2:与对称加密结合,实现保密性和认证性
A向B发送: E k 2 ( M ∣ ∣ C k 1 ( M ) ) E_{k_2}(M||C_{k_1}(M)) Ek2(M∣∣Ck1(M))
提供认证, 因仅A和B共享 K 1 K_1 K1;提供保密,因仅A和B共享 K 2 K_2 K2
这里的认证与明文相关,即先对明文计算MAC,再连同明文一起加密
消息认证码的基本用途3:与对称加密结合,实现保密性和认证性
A向B发送: E k 2 ( M ) ∣ ∣ C k 1 ( E k 2 ( M ) ) E_{k_2} (M) || C_{k_1}(E_{k_2} (M) ) Ek2(M)∣∣Ck1(Ek2(M))
提供认证, 因仅A和B共享 K 1 K_1 K1;提供保密,因仅A和B共享 K 2 K_2 K2
这里的认证与密文相关,即先加密,再对密文计算MAC
使用哈希函数的消息认证码HMAC
优点:Hash函数的软件执行速度往往比对称加密快;可利用Hash函数代码库;很多国家对Hash函数没有出口限制,而对于分组加密有出口限制
设计目标:不必修改而直接使用现有的散列函数;容易替代;应保持散列函数的原有性能;对密钥的使用和处理要简单;安全强度依赖于使用散列函数的强度。
其中:K+是在K的左边填充0使得K长度达到b位的结果;
ipad=00110110(十六进制数36)重复b/8次的结果;
opad=01011100(十六进制数5C)重复b/8此的结果;
HMAC可描述为: H M A C ( K , M ) = H [ ( K + ⊕ o p a d ) ∣ ∣ H [ ( K + ⊕ i p a d ) ∣ ∣ M ] ] HMAC(K,M)=H[(K^+\oplus opad)||H[(K^+ \oplus ipad)||M]] HMAC(K,M)=H[(K+⊕opad)∣∣H[(K+⊕ipad)∣∣M]]
注意,K与ipad异或后,其信息位有一半发生了变化;同样与opad异或后另一半也发生了变化,这样通过将Si与So传给Hash算法中的压缩函数,我们可以从K伪随机地产生出两个密钥。
HMAC的安全性:在给定时间内,给定一定数量的<消息,MAC>对(用相同密钥产生),伪造成功的概率可以用于描述MAC函数的安全性
攻击HMAC的概率等价于对HASH函数的下列攻击
即使IV未知、随机,也能计算压缩函数的输出
即使IV随机,也能找到HASH函数中的碰撞
基于分组密码的MAC:数据认证算法DAA和基于密文的消息认证码CMAC
数据认证码DAC
是基于DES的消息认证码(是不安全的!)是使用最广泛的MAC算法之一,也是ANSI标准(X9.17)
数据认证算法采用DES运算的密文块链接(CBC)方式
局限性:
要求输入长度必须为mn,其中m为固定值,n为分组加密的分组长度
否则很容易出现攻击
T = M A C ( K , X ) T=MAC(K,X) T=MAC(K,X)
T = M A C ( K , X ∣ ∣ ( X ⊕ T ) ) T=MAC(K,X||(X ⊕ T)) T=MAC(K,X∣∣(X⊕T))
改进基本思想:使用三个密钥,即CMAC;可以用于处理不定长的输入
基于密文的消息认证码CMAC(CBC-MAC)(在政府和工业界广泛采用)
CMAC被NIST SP800-38B标准采用
长度限制, M A C ( X ) = M A X ( X ∣ ∣ ( X ⊕ T ) ) MAC(X) = MAX(X||(X⊕T)) MAC(X)=MAX(X∣∣(X⊕T))
使用三个密钥来克服,这些密钥可以通过一个密钥导出
T= 消息认证码;Tlen=T的比特长度;MSBs(X)= X的最左边的s位
认证加密(AE) 是指在通信中同时根据保密性和认证性(完整性)的加密系统
(HtE)先Hash再加密: h = H ( M ) , E K ( M ∣ ∣ h ) h=H(M), E_K(M||h) h=H(M),EK(M∣∣h)
(MtE)先MAC再加密: T = M A C K 1 ( M ) , E K 2 ( M ∣ ∣ T ) T=MAC_{K_1}(M), E_{K_2}(M||T) T=MACK1(M),EK2(M∣∣T),用于SSL/TLS协议
(E&M)加密并且MAC: C = E K 2 ( M ) , T = M A C K 1 ( M ) C=E_{K_2}(M), T=MAC_{K_1}(M) C=EK2(M),T=MACK1(M), 用(C,T)对明文认证。用于SSH协议
(EtM)先加密再MAC: C = E K 2 ( M ) , T = M A C K 1 ( C ) C=E_{K_2}(M), T=MAC_{K_1}(C) C=EK2(M),T=MACK1(C), 用于IPsec
对于每种方式,都可以直接进行解密验证;对于(HtE)、(MtE)、(E&M)要先解密后验证,而对于(EtM)是先验证再解密
认证加密的两种模式:CCM、GCM
CCM使用的是AES、CTR、CMAC(Counter with CBC-MAC)在加密和MAC算法中公用一个密钥K。
输入:将被认证和加密的明文消息P、将被认证但不需加密的相关数据A、临时量N作为负载和相关数据的补充(防止重放攻击)。
其中 C t r 0 Ctr_0 Ctr0是初始计数器
注意对于明文要进行两次完全的处理:一次用来生成MAC值,一次用来加密。
Galois/计数器(GCM)工作模式
NIST SP 800-38D;并行化设计:高吞吐率、低成本、低延迟;基于变形的CTR;属于EtM
密钥封装(KW)操作模式使用AES或3DES作为底层加密算法;
目的是为通信双方安全地交换对称密钥(而通信双方事先已共享有一组称为密钥加密密钥KEK的对称密钥)
所有伪随机数发生器的关键组成包括随机种子值和生成伪随机位流的确定性算法。
如果算法使用伪随机函数(PRF)来产生诸如会话密码密钥之类的值,那么要求仅有PRF的使用者知道种子,如果该算法用于产生流密码的加密密钥流,那么种子的作用是仅为发送方和接收方知道的密钥。
数字签名
数字签名:给以电子形式存储的消息进行签名,签名后的消息可以通过计算机网络传输
为什么需要数字签名?避免双方相互欺骗
组成、原理、特征、要求
数字签名组成:
明文:签名算法的输入
签名算法:对明文进行各种转换
公钥和私钥:签名和验证算法的输入,一个用于签名,一个用于验证
签名:签名算法的输出
验证算法:输入为消息和签名,输出为0或1
数字签名原理:
每个用户拥有一对公私钥对 ( P K , S K ) (PK , SK) (PK,SK)
公钥 P K PK PK公开,私钥 S K SK SK保密;
已知公钥算法,公钥 P K PK PK,得不到 S K SK SK的值。
签名 S = S i g S K [ M ] S=Sig_{SK}[M] S=SigSK[M],输出 M ∣ ∣ S i g S K [ M ] = M ∣ ∣ S M || Sig_{SK}[M]=M || S M∣∣SigSK[M]=M∣∣S(用户用自己的私钥签名)
验证 V e r P K [ S , M ] = 1 o r 0 Ver_{PK}[S,M]=1 or 0 VerPK[S,M]=1or0
输出1,代表S是对M的有效签名
输出0,代表S是对M的无效签名
数字签名的特征 :
能验证签名者、签名日期和时间;
能认证被签的消息内容;
第三者可以确认收发双方之间的消息传送,即第三方能仲裁;
数字签名的要求:
签名必须是依赖于被签名信息的比特模式;
签名必须使用某些发送者独有的信息,以防止双方的伪造与否认;
签名过程及验证过程容易;
伪造该数字签名在计算复杂性意义上具有不可行性
既包括对一个已有的数字签名构造新的消息
也包括对一个给定消息伪造一个数字签名;
在存储器中保存一个数字签名备份是现实可行的
两类被制定为标准的数字签名方案:椭圆曲线数字签名算法(ECDSA)、RSA概率签名方案(RSA—PSS)
攻击和伪造:
危害程度从高到低:A代表签名收到攻击的用户;C代表攻击者
成功的攻击签名方案:
直接数字签名:
只涉及通信双方,有效性依赖于发送方私钥的安全性
ElGamal数字签名方案
参数选取:
选取素数 q q q及其原根 α \alpha α;生成随机整数 X A X_A XA使得 1 < X A < q − 1 1<X_A<q-1 1<XA<q−1;计算 Y A = α X A m o d q Y_A=\alpha ^{X_A} \mod q YA=αXAmodq—>A的私钥 X A X_A XA公钥 q , α , Y A {q,\alpha,Y_A} q,α,YA
签名:
首先计算消息M的hash值 m = H ( M ) m=H(M) m=H(M),这里m是满足 0 ≤ m ≤ q − 1 0\le m \le q-1 0≤m≤q−1的整数。
选取随机整数K,使得满足 1 ≤ K ≤ q − 1 1\le K \le q-1 1≤K≤q−1以及 g c d ( K , q − 1 ) = 1 gcd(K,q-1)=1 gcd(K,q−1)=1
计算 S 1 = α K m o d q ; S 2 = K − 1 ( m − X A S 1 ) m o d ( q − 1 ) S_1=\alpha ^K \mod q;S_2=K^{-1}(m-X_AS_1)\mod(q-1) S1=αKmodq;S2=K−1(m−XAS1)mod(q−1)—>签名对 ( S 1 , S 2 ) (S_1,S_2) (S1,S2)
验证签名:
计算 V 1 = α m m o d q ; V 2 = ( Y A ) S 1 ( S 1 ) S 2 m o d q V_1=\alpha ^m \mod q;V_2=(Y_A)^{S_1}(S_1)^{S_2} \mod q V1=αmmodq;V2=(YA)S1(S1)S2modq
如果 V 1 = V 2 V_1=V_2 V1=V2则签名合法。
Schnorr数字签名方案
跟ElGamal数字签名方案一样,也基于离散对数;Schnorr方案将生成签名所需的消息计算量最小化(生成签名的主要工作量不依赖于消息)
参数:选取素数模 p p p,且 p − 1 p-1 p−1包含大素数因子 q q q(即p-1 mod q =0)。(一般取 p ≈ 2 1024 、 q ≈ 2 160 p\approx2^{1024}、q\approx2^{160} p≈21024、q≈2160);选择整数 α \alpha α,使得 α q = 1 m o d p \alpha^q=1\mod p αq=1modp。选取随机整数s作为私钥;计算公钥 v = α − s m o d p v=\alpha^{-s}\mod p v=α−smodp
签名:选取随机整数 r r r,并计算 x = α r m o d p x=\alpha^r \mod p x=αrmodp。(与消息M无关,可以预处理进行);
将x附在消息后面计算哈希, e = H ( M ∣ ∣ x ) e=H(M||x) e=H(M∣∣x);计算 y = ( r + s e ) m o d q y=(r+se)\mod q y=(r+se)modq。输出 ( e , y ) (e,y) (e,y)。
验证:计算 x ′ = a y v e m o d p x'=a^yv^e\mod p x′=ayvemodp;验证是否 e = = H ( M ∣ ∣ x ′ ) e==H(M||x') e==H(M∣∣x′)
数字签名标准DSS
(Digital Signature Standard)签名标准是1991年8月由美国NIST公布,1994年5月19日的正式公布,并于1994年12月1日采纳为美国联邦信息处理标准。
DSS为ElGamal和Schnorr签名方案的改进,其使用的算法记为DSA(Digital Signature Algorithm)。DSS利用了Hash函数(如SHA-2/3)和DSA算法
RSA签名标准则利用了Hash函数(如SHA-2/3 ) 和RSA算法
DSA使用的是仅提供数字签名功能的算法,虽然是公钥算法但是不能提供加密或密钥交换;DSA是建立在离散对数困难性上的
由于离散对数的困难性,攻击者从r恢复出k或者从s恢复出x都不可行
如果k暴露了,则攻击者可以从签名中恢复出签名私钥
如果对两个不同的消息使用了同样的k进行签名(如何发现?),攻击者也可以恢复出签名私钥,这是对Sony Playstation (PS3)的攻击
RSA概率签名方案
基于RSA的数字签名方案被广泛应用于包括金融在内的各类应用当中。其中,RSA概率签名方案(RSA-PSS)被推荐为最安全的一种。
组成:掩码产生函数、签名操作、验签操作
掩码生成函数MGF是一个伪随机函数,根据安全的Hash函数来构造任意长度的消息摘要或者Hash值,输出固定长度的值。
签名:由M生成固定长度的消息摘要,称为消息编码(EM);
也使用了伪随机数(这里称为盐),因为每次使用时盐值都不同,所以两次签名的结果也不同,增加了签名方案的安全度;
验证时将签名S作为无符号的非负二进制整数s,然后将消息转换为编码后的消息EM的形式再进行验证;
ECC签名算法ECDSA
本质上包含四个基本元素:全局域参数、公钥私钥、待签名的消息哈希值、签名包括2个整数(r、s)验签包括一个输出值v,与r进行比较验证。
全局参数:椭圆曲线 E q ( a , b ) E_q(a,b) Eq(a,b),基点 G G G,点 G G G的阶 n n n(满足 n G = O nG=O nG=O的最小正整数,也是曲线上点的个数)
公私钥对:私钥:随机整数 d d d,公钥: Q = d G Q=dG Q=dG
签名:选取随机整数k;计算 P = k G = ( x , y ) , r = x m o d n , ( r ≠ 0 ) ; e = H ( m ) ; s = k − 1 ( e + d r ) m o d n , ( s ≠ 0 ) P=kG=(x,y),r=x\mod n,(r\not =0);e=H(m);s=k^{-1}(e+dr)\mod n,(s\not =0) P=kG=(x,y),r=xmodn,(r=0);e=H(m);s=k−1(e+dr)modn,(s=0)—>(r,s)(这里选取的哈希函数是SHA,摘要长度为160位)
验证:计算 w = s − 1 m o d n ; u 1 = e w ; u 2 = r w w=s^{-1}\mod n;u_1=ew;u_2=rw w=s−1modn;u1=ew;u2=rw解点 X = ( x 1 , y 1 ) = u 1 G + u 2 Q , ( X ≠ 0 ) X=(x_1,y_1)=u_1G+u_2Q,(X\not =0) X=(x1,y1)=u1G+u2Q,(X=0)
v = x 1 m o d n v=x_1\mod n v=x1modn当且仅当v=r时接受签名
其他类型的签名
盲签名:签名者不知道所签署文件的内容,核心:不可追踪
群签名:一组人拥有签名的权利,每个人的签名等效
门限签名:一组人中只有达到规定数目人的同意,才能产生签名
代理签名:签名人临时将签名权交由代理人行使
属性签名:签名的权限随身份(属性)改变而调整
多重签名:多个人的会签