摘要算法的应用
Hash函数
杂凑函数
消息认证码
\(tag = MAC(K,M)\)
\(V(k,m,tag)='yes'\)
通常用带密钥的Hash函数来生成消息认证码
双方通过密钥K来确定用到的Hash函数
可以在不安全的信道中同时传递数据和认证标签
\(HMAC_k(x) = H((K\bigoplus opad)||H(K\bigoplus ipad)||x))\)
公钥密码体制的应用
数字信封
解决对称密码的密钥管理问题
密码协议中用户A和B协商会话密钥K
密钥管理中心KDC分配给用户会话密钥
……
密钥封装:
- 密钥生成算法keygen:随机算法,生成A的封装密钥(私钥)、解封密钥(私钥)
- 封装函数Encaps:B基于A的封装密钥用密钥封装函数生成共享密钥K,以及共享密钥的密文,将共享密钥的密文发送给A
- 解封算法Deacps:A基于解封密钥和密文得到共享密钥K
数字签名
基础过程
A:
\(MD = Hash(M)\)
\(S = d_A(MD)\)
发送M||S
B:
从公共服务器处得到\(e_A\)
\(Hash(M)?=e_A(S)\)
实现消息完整性和不可否认性
代理签名
授权代理者代表原签名者生成有效签名
- 不可伪造性:只有获得授权才能代理
- 可验证性:能够验证确认获得许可
- 不可否认性:代理者不能否认
- 可区分性
- 不符合性:必须能够检测到时代理签名
- 可识别性:原签名者通过代理签名可确定代理人身份
群签名
群签名允许群组成员代表整个群组进行匿名签名,验证者只能确认签名来自群组,但不知道具体成员。群管理员在必要时可以揭示签名者身份。
- 匿名性:验证者无法确定具体签名者身份
- 可追踪性:群管理员可以打开签名揭示身份
- 不可伪造性:非群组成员无法生成有效群签名
- 不可连接性:无法判断两个签名是否来自同一成员
- 防陷害:成员不能伪造其他成员的签名
电子投票、竞标
盲签名
签名者不知道消息具体内容
不可伪造性、不可抵赖性、盲性、不可跟踪性
签密算法
构造模式:
- 加密再签名encrypt-then-sign(EtS)
- 签名再加密sign -then- encrypt (StE)
- 签名且加密sign -then- encrypt (S&E)
\(Σ(𝐺, 𝑆𝐶,𝐷𝑆𝐶)\)
1.密钥生成算法G
2.加密算法SC
3.解密算法DSC
签名再加密sign -then- encrypt (StE)
\(SC_{StE}(...) := c \leftarrow E(pk_R, (m, \sigma))\)
1.发送者先用自已的私钥\(sk_S\)对消息\(m\)生成签名\(σ\)
2.然后用接收者的公钥\(pkR\)将消息和签名一起加密,得到密文cc
典型应用:PGP安全电子邮件等
加密再签名encrypt-then-sign(EtS)
加密再签名 - Encrypt-then-Sign (EtS)
\(SC_{EtS}(...) := (c, \sigma)\),其中 \(c \leftarrow E(pk_R, m)\), \(\sigma \leftarrow S(sk_S, c)\)
- 发送者先用接收者的公钥\(pk_R\)加密消息\(m\),得到密文\(c\)
- 然后用自已的私钥\(sk_S\)对密文\(c\)生成签名\(\sigma\)
安全性通常被认为优于StE。接收者可以先验证签名,确认密文来源和完整性,如果无效则无需解密,避免了不必要的计算,并能更早地抵抗拒绝服务攻击
签名是对密文进行的,对于第三方来说,无法直接验证明文的来源
典型应用:IPSec协议
签名且加密 - Sign-and-Encrypt (S&E)
SCS1算法
参数与密钥生成
- 选择大素数\(p\)和\(q\),满足 \(q \mid (p-1)\)
- \(g\) 是 \(Z_p^*\) 中的一个 \(q\) 阶生成元
- 用户A的密钥对:私钥 \(x_a\),公钥 \(y_a = g^{x_a} \mod p\)
- 用户B的密钥对:私钥 \(x_b\),公钥 \(y_b = g^{x_b} \mod p\)
- 使用Hash函数\(h\)和带密钥的Hash函数\(KH\),以及对称加密算法\((E, D)\)
签密过程(A)
对于消息\(m\):
- 随机选择整数 \(x \in [1, q]\)
- 计算共享密钥: \(k = (y_b)^x \mod p\)
- 将\(k\)分裂为两个密钥:\(k_1\)(用于对称加密)和\(k_2\)(用于MAC)
- 计算认证码: \(r = KH_{k_2}(m)\) 或 \(r = h(k_2, m)\)
- 计算签名参数: \(s = x / (r + x_a) \mod q\)
- 加密消息: \(c = E_{k_1}(m)\)
- 输出签密密文: \((c, r, s)\)
解签密过程(B)
收到 \((c, r, s)\) 后:
- 恢复共享密钥: \(k = (y_a \cdot g^r)^{s \cdot x_b} \mod p\)
(恢复的\(k\)与发送方计算的\(k\)相等) - 同样将\(k\)分裂为\(k_1\)和\(k_2\)
- 解密消息: \(m = D_{k_1}(c)\)
- 验证认证码:检查 \(KH_{k_2}(m) \stackrel{?}{=} r\)
- 如果相等,则接受消息\(m\)
- 否则,拒绝