
文档教程知识库【免费下载链接】CS-Xmind-Note计算机专业课408思维导图和笔记计算机组成原理第五版 王爱英数据结构王道计算机网络第七版 谢希仁操作系统第四版 汤小丹项目地址https://gitcode.com/gh_mirrors/cs/CS-Xmind-Note点击查看免费下载本文以 信息安全五——消息认证、数字签名及PGP.md 为核心系统讲解消息认证Message Authentication、散列函数Hash Function、数字签名Digital Signature与 PGP 邮件加密体系四大主题。读者读完本文后将掌握鉴别系统的组成与三类鉴别函数、MAC 与 HMAC 的构造原理、散列函数的七项安全需求与生日攻击推导、RSA / ElGamal / DSA 三种签名算法的完整流程与数学证明以及 PGP 从会话密钥生成到密钥环管理的端到端工作机制可直接用于 408 信息安全课程复习与网络安全工程实践。本文属于 CS-Xmind-Note 仓库信息安全系列的第五讲。整个系列以斯托林斯《密码编码学与网络安全第六版》为教材骨架前四讲分别覆盖了信息安全概述、密码学基本概念与经典密码体制、对称密码体制DES/AES/分组密码工作模式与公私钥密码体制RSA/ElGamal/Diffie-Hellman。本篇在前四讲的基础上把保密confidentiality与鉴别/认证authentication两个概念彻底分离开来形成一条从消息认证到数字签名再到 PGP 综合应用的完整知识链。一、消息认证概念、目的与鉴别模型1.1 什么是消息认证消息认证Message Authentication是一个证实收到的消息来自可信的源点且未被篡改的过程。它回答两个问题消息真的是来自声称的发送者吗消息在传输或存储过程中有没有被改动这与加密是本质不同的两个目标加密解决别人看不懂保密性消息认证解决别人改不了、冒充不了、抵赖不了真实性与完整性。1.2 鉴别的目的鉴别Authentication的主要目的有二信源识别验证信息的发送者是真正的发送者而不是冒充者完整性验证验证信息在传送或存储过程中未被篡改、重放或延迟。注意这里把重放replay和延迟delay也纳入完整性范畴——攻击者即使不能读懂消息也可以把旧消息原样重放以制造混乱因此一个完整的鉴别方案通常还要配合时间戳、序号等防重放机制。1.3 鉴别系统的组成一个单纯鉴别系统的模型由三部分组成发送方的鉴别编码器、接收方的鉴别译码器以及双方共享的鉴别函数。鉴别编码器和鉴别译码器可以抽象为鉴别函数Authentication Function。一个安全的鉴别系统必须满足三个条件接收者能够检验和证实消息的合法性、真实性和完整性消息的发送者和接收者不能抵赖即不可否认性除了合法的消息发送者其他人不能伪造合法的消息。要构造这样的系统首先要选好恰当的鉴别函数由该函数产生一个鉴别标识authenticator / tag然后在此基础上设计合理的鉴别协议Authentication Protocol使接收者能够完成消息的鉴别。1.4 鉴别函数的三大分类可用来做鉴别的函数分为三类类别原理输出消息加密函数Message Encryption用完整信息的密文作为对信息的鉴别整段密文消息鉴别码 MACMessage Authentication Code公开函数 密钥产生一个固定长度的值作为鉴别标识定长 MAC 值散列函数Hash Function公开函数将任意长的信息映射成固定长度的信息定长散列值三类函数的地位并不相同加密函数和 MAC 都依赖密钥散列函数本身是公开的、无密钥的。散列函数通常作为压缩器嵌入 MAC 与数字签名方案中HMAC、DSA/SHA 组合都是典型例子因此本文后面的内容实际围绕散列函数 密钥/私钥的组合展开。二、基于加密的消息认证加密认证用完整信息的密文作为对信息的鉴别称为加密认证。它分为对称密码体制与公钥密码体制两条路线。2.1 对称密码体制的加密认证在对称密码体制下发送者 A 与接收者 B 共享同一密钥 K。A 用 K 加密明文 M 得到密文 C 并发送B 用 K 解密。只要解密成功且语义合理B 就能相信消息来自持有 K 的 A 且未被篡改——因为只有共享密钥 K 的双方能产生和恢复该密文。参见对称密码体制笔记中对 DES/AES 及 ECB、CBC、CFB 等工作模式的讲解其中 CFB、OFB 等流式工作模式天然适合对逐块到达的消息提供完整性保护。对称加密认证的主要限制是密钥必须通过安全信道预先共享且共享密钥的两方之间无法相互区分——A 可以否认自己发过消息因为 B 也能用同样的密钥构造密文所以对称加密认证不能提供数字签名意义上的不可否认性。2.2 公钥密码体制的加密认证公钥密码体制下情况变得微妙用公开密钥加密明文只能提供保密而不能提供认证。因为任何人都能用 A 的公钥加密接收者无法据此判断发送者身份为了提供认证发送者 A 用私钥对明文进行加密任意接收者都可以用 A 的公钥解密。由于只有 A 能够产生该密文其它任何一方都不能产生该密文因此这种方式既提供了认证也提供了数字签名从效果上看A 已经用私钥对明文进行了签名必须注意只用私钥加密不能提供保密性——任何人只要有 A 的公开密钥就能对该密文进行解密。由此引出三个重要结论保密性与真实性是两个不同的概念。根本上信息加密提供的是保密性而非真实性两者不能混为一谈加密代价大公钥算法代价更大。对长消息整体做公钥运算在计算上不可接受鉴别函数与保密函数的分离能提供功能上的灵活性。理由包括广播的信息难以使用加密信息量大某些信息只需要真实性、不需要保密性。正是基于这些考量实际系统普遍采用散列函数压缩 少量数据签名的组合而不是对整条消息做私钥加密。三、消息认证码 MAC 与 HMAC3.1 MAC 的基本原理消息认证码Message Authentication Code本质上是带密钥的散列函数适用于通信双方基于共享的同一密钥来认证彼此之间交互的信息。MAC 函数将密钥和数据块作为输入产生一个 hash 值作为 MAC 码。设 M 是变长的消息K 是仅由收发双方共享的密钥则 M 的 MAC 由如下函数生成$$MAC C_k(M)$$其中 $C_k(M)$ 是定长的。发送者每次将 MAC 附加到消息中一并发送接收者用同一密钥重新计算 MAC 并对消息进行认证。如果收到的 MAC 与本地计算得出的 MAC 相同则接收者可以认为消息未被更改过消息来自与他共享密钥的发送者。3.2 MAC 与加密函数的区别MAC 函数类似于加密函数但二者有一个关键区别MAC 函数不需要可逆性——它只要求给定密钥和消息能算出一个定长值加密函数必须是可逆的——必须能从密文还原明文。由于不需要满足可逆性约束认证函数比加密函数更不易破解设计空间更大、性能也更好。3.3 MAC 的边界与 HMAC需要强调因为收发双方共享同一个密钥上述 MAC 过程只提供认证而不提供保密也不能提供数字签名。接收者能确认消息来自持有该密钥的另一方但无法向第三方证明是哪一方发的——这是对称体制的固有局限。用散列函数来构造 MAC 是常见做法HMACHash-based MAC为其中之一。HMAC 的核心思想是把密钥经过两次填充后与消息混合再送入公开的散列函数如 SHA-256迭代计算从而把一个无密钥的公开散列函数改造成带密钥的 MAC。HMAC 的安全性不依赖于底层散列函数的碰撞抵抗强度在特定条件下且实现简单、性能高因此在 TLS、IPsec 等协议中被广泛采用。四、散列函数概念、安全需求与生日攻击4.1 基本概念散列函数Hash Function以一个变长的报文作为输入产生一个定长的散列码作为输出有时也称报文摘要message digest$$h H(M)$$其中 M 是变长的消息h 是定长的散列值消息摘要。散列函数又称杂凑函数是对不定长输入产生定长输出的特殊函数。散列函数 H 是公开的。典型用法是散列值在信源处被附加在消息上接收方重新计算散列值来保证消息未被篡改。关键安全注意由于函数本身公开传送过程中对散列值需要另外的加密保护——如果没有对散列值的保护篡改者可以在修改消息的同时修改散列值从而使散列值的认证功能失效。这正是裸散列只能检测意外损坏、不能抵抗恶意篡改的原因。4.2 散列函数的基本用法用法一消息认证。用散列函数做消息认证的核心模式是把散列值与消息一起或以某种受密钥保护的方式传送接收方重算散列值并与收到的值比对。常见的几种组合方式包括散列值用对称密钥加密等价于带密钥的 MAC、散列值与消息一起用对称密钥加密同时提供保密与认证、散列值用发送方私钥加密即数字签名。用法二数字签名。先用散列函数压缩消息再对短小的散列值做私钥运算签名。散列函数的无碰撞性保证了签名的有效性——签名短、运算快且因为找不到另一条消息有相同摘要签名无法被移植到别的消息上。用法三其他应用。包括单向口令文件系统只保存口令的散列值不保存明文口令、入侵检测和病毒检测为系统文件建立散列指纹比对发现被篡改的文件、构建随机函数或伪随机函数等。4.3 两个简单的 Hash 函数为理解散列函数的最小工作原理教材给出两个简化模型分组对应位异或把消息分成若干等长分组逐位异或XOR所有分组得到定长的散列值。它实现简单但对分组重排不敏感异或满足交换律安全性很弱移位分组对应位异或对每个分组先做循环移位再异或使散列值依赖分组的相对位置抗重排能力比简单异或略强。这两个例子说明散列函数的本质工作是把整个消息的结构信息压缩进一个定长值压缩方式越能体现消息内部次序与每一位的贡献抗碰撞能力越强。4.4 散列函数的安全需求重点散列函数的目的是为文件、消息或其他的分组数据产生指纹。用于消息认证的散列函数 H 必须具有如下性质输入长度可变H 能用于任何大小的数据分组输出长度固定H 都能产生定长的输出效率对于任何给定的 xH(x) 要相对易于计算抗原像攻击单向性对任何给定的散列码 h寻找 x 使得 H(x)h 在计算上不可行抗第二原像攻击弱抗冲突对任何给定的分组 x寻找不等于 x 的 y使得 H(x)H(y) 在计算上不可行抗强碰撞攻击强抗冲突寻找任何的 (x, y) 使得 H(x)H(y) 在计算上不可行伪随机性H 的输入输出满足伪随机性测试标准。这些性质的工程含义可以逐条对应第 1、2 条要求具有实用性——任意长输入都能得到定长输出第 2、3 条合起来是单向性质——给定消息可以产生散列码而给定散列码在计算上不可能反推出对应的消息第 4 条保证给定一个消息的散列码不能找到与之相同的另外的消息即防止伪造第 5 条是对生日攻击方法的防御能力。4.5 弱无碰撞与强无碰撞从攻击者 Oscar 的视角可以更精确地描述碰撞抵抗。Oscar 以一个 x 开始先计算 z h(x)并企图找到一个 x 满足 h(x)h(x)。若他做到这一点x 也将是有效消息。为防止这一点要求函数 h 具有无碰撞特性定义 1弱无碰撞散列函数 h 称为弱无碰撞的是指对给定消息 x∈X在计算上几乎找不到不等于 x 的 x∈X使 h(x)h(x)定义 2强无碰撞散列函数 h 被称为强无碰撞的是指在计算上几乎不可能找到任意的相异的 x、x使得 h(x)h(x)。注意强无碰撞自然蕴含弱无碰撞。弱无碰撞只防御针对特定 x 找替身的攻击强无碰撞要防御任意两条消息撞在一起的攻击难度更高也是现代散列函数设计如 SHA-256追求的目标。4.6 生日攻击为什么 64 位散列码不安全假定使用 64 位的散列码是否安全答案是否定的。考虑这样的场景采用传输加密的散列码 不加密的报文 M对手需要找到 M 使得 H(M)H(M)以便用替代报文欺骗接收者。一种基于生日悖论的攻击可以做到这一点。生日问题一个教室中最少应有多少学生才使至少有两人具有相同生日的概率不小于 1/2推理过程如下假定一年按 365 天计算每人生日等概率n 个人生日各不相同的概率为$$\frac{365 \times 364 \times 363 \times \cdots \times (365-n1)}{365^n}$$因而 n 个人中至少有两个人生日相同的概率为$$P 1 - \frac{365 \times 364 \times 363 \times \cdots \times (365-n1)}{365^n}$$若要使 P ≥ 0.5n 23 即可在 64 人的班级中至少两人生日相同的概率约为 0.997n46 时P ≈ 94.15%。把生日悖论推广到散列函数给定一个散列函数有 n 个可能的输出m 位n 2^m输出值为 H(x)。如果产生 k 个随机输入 y要使至少存在一个输入 y 使得 H(y)H(x) 的概率大于 0.5k 必须多大对单个 yH(y)H(x) 的概率为 1/nH(y)≠H(x) 的概率为 1-(1/n)产生 k 个随机值 y它们两两不匹配的概率等于每个个体不匹配概率的乘积即 $[1-(1/n)]^k$因此至少有一个匹配的概率为 $1 - [1-(1/n)]^k \approx 1 - [1 - k/n] k/n$要概率等于 0.5只需 $k n/2 2^{m-1}$更一般地对长度为 m 位的散列码共有 $2^m$ 个可能的散列码。若要使任意的 x、y 有 H(x)H(y) 的概率为 0.5只需 $k 2^{m/2}$。结论散列码的有效安全强度只有其比特长度的一半。64 位散列码只需约 $2^{32}$ 次尝试就能以 50% 的概率找到碰撞这在现代计算机上轻而易举。这也是为什么现代散列函数至少要 160 位如 SHA-1也已告急乃至 256 位SHA-256输出。4.7 散列函数的结构Merkle 迭代结构现代散列函数普遍采用 Merkle 于 1989 年提出的迭代结构Merkle-Damgård 结构Ron Rivest 于 1990 年提出的 MD4 即基于此该结构几乎被所有 hash 函数使用。具体做法把原始消息 M 分成一些固定长度的块 $Y_i$最后一块做填充padding并使其包含消息 M 的长度设定初始值 $CV_0$chaining value重复使用压缩函数 f$CV_i f(CV_{i-1}, Y_{i-1})$最后一个 $CV_i$ 即为 hash 值。这种分组 链式压缩的框架使得一个只能处理固定长度输入的压缩函数 f可以安全地处理任意长度的消息并且每一比特的变化都会通过链式传播影响最终摘要。4.8 MD5 算法历史脉络Merkle 于 1989 年提出 hash function 模型Ron Rivest 于 1990 年提出 MD41992 年MD5RFC 1321由 MIT 的 Ron Rivest 开发。MD5 的技术要点MD5 把数据分成512-bit 块处理MD5 的 hash 值是128-bit在最近数年之前MD5 是最主要的 hash 算法美国标准 SHA-1 以 MD5 的前身 MD4 为基础该算法以任意长度的报文作为输入产生一个 128 bit 的报文摘要作为输出输入按 512 bit 的分组处理。MD5 小结MD5 使用小数在前little-endian的字节序约定Dobbertin 在 1996 年找到了两个不同的 512-bit 块它们在 MD5 计算下产生相同的 hash——这宣告了 MD5 不再满足强抗碰撞需求结论MD5 不是足够安全的不宜用于需要抗碰撞的认证与签名场景MD5 在线查询破解服务已经非常成熟通过彩虹表等预计算手段常见弱口令的 MD5 可被秒查这进一步说明 MD5 摘要不能作为口令等敏感数据的保险箱。MD5 的 32 位与 16 位编码MD5 通常是 32 位的十六进制编码而在不少地方会用到 16 位的编码——16 位就是从 32 位 MD5 散列中把中间 16 位提取出来。以明文admin为例16 位7a57a5a743894a0e32 位21232f297a57a5a743894a0e4a801fc3可以看到16 位摘要正是 32 位摘要中间的 16 位7a57a5a743894a0e。这种截取中间位的做法只是为了缩短显示长度并不会提升安全性反而进一步缩小了散列空间。4.9 SHA 算法族SHA-512 的逻辑对应 FIPS 180 系列的安全散列算法步骤 1 附加填充位消息长度填充到与模 1024 同余 896步骤 2 附加长度最后附加 128 位——用一个 128 位无符号整数表明消息的长度初始化 Hash 缓冲区Hash 函数的中间结果和最终结果保存在 512 位的缓冲区中缓冲区用 8 个 64 位寄存器a、b、c、d、e、f、g、h实现以 1024 位的分组128 个字节为单位处理消息输出最终摘要。SHA Summary要点回顾密码散列函数的应用消息认证Message authentication、数字签名Digital signatures以及其他应用需求与安全密码散列函数的安全需求、暴力攻击Brute-force attacks、密码分析Cryptanalysis基于密码分组链的散列函数Hash functions based on cipher block chaining安全散列算法Secure Hash Algorithm, SHASHA-512 逻辑、SHA-512 轮函数SHA-3采用海绵结构The sponge construction与 SHA-3 迭代函数 f与 Merkle-Damgård 结构的 MD5/SHA-1/SHA-2 有本质区别。与 MD5 相比SHA 家族输出更长SHA-1 为 160 位SHA-256 为 256 位SHA-512 为 512 位抗生日攻击的安全余量更大是当前实际部署的主流选择。五、数字签名体制5.1 为什么需要数字签名数字签名Digital Signature是一种防止源点或终点抵赖的鉴别技术。需要理解消息认证的边界消息认证保护双方之间的数据交换不被第三方侵犯但它并不保证双方自身的相互欺骗。假定 A 发送一个认证信息给 B双方之间的争议可能有多种形式B 伪造一个不同的消息但声称是从 A 收到的A 可以否认发过该消息B 无法证明 A 确实发了该消息。现实例子股票交易指令亏损后抵赖——交易者下指令买入亏损后声称我没下过这个指令此时需要数字签名来提供不可否认性non-repudiation。5.2 数字签名应满足的条件一个数字签名至少应满足以下几个条件依赖性数字签名必须依赖于要签名报文的比特模式类似于笔迹签名与被签文件的不可分离性唯一性数字签名必须使用对签名者来说是唯一的信息以防伪造和否认可验证数字签名必须是在算法上可验证的抗伪造伪造一个数字签名在计算上不可行——无论是通过以后的数字签名来构造新报文还是对给定的报文构造一个虚假的数字签名类似笔迹签名的不可模仿性可用性数字签名的产生、识别和证实必须相对简单并且其备份在存储上是可实现的。5.3 数字签名的类别按不同维度划分以方式分直接数字签名direct digital signature、仲裁数字签名arbitrated digital signature以安全性分无条件安全的数字签名、计算上安全的数字签名以可签名次数分一次性的数字签名、多次性的数字签名。5.4 普通数字签名算法RSA 签名RSA 签名的基本流程假设 A 的公钥私钥对为 ${KU_a \parallel KR_a}$$$S_A E_{KR_a}(M)$$即 A 用自己的私钥 $KR_a$ 对消息 M 加密得到签名 $S_A$。接收者用 A 的公钥 $KU_a$ 解密即可验证。RSA 直接对整条消息签名存在明显问题速度慢——公钥运算开销大信息量大——签名与消息等长第三方仲裁时必须暴露明文信息因此实际方案都用散列函数先压缩消息再签名hash 函数的无碰撞性保证了签名的有效性。5.5 签名与加密的组合签名提供真实性authentication加密提供保密性confidentiality签名加密提供真实性保密性。在 A→B 方向上有两种实现方式先签名后加密$E_{KUb}{M \parallel Sig_A(M)}$——先用自己的私钥签名再用 B 的公钥整体加密先加密后签名${E_{KUb}(M) \parallel Sig_A(E_{KUb}(M))}$——先用 B 的公钥加密再对密文签名。方式 2 存在三个问题发生争议时B 需要向仲裁者提供自己的私钥才能解开 $E_{KUb}(M)$ 验证签名对应的明文这破坏了 B 私钥的保密性安全漏洞攻击者 E 截获消息把 $Sig_A(E_{KUb}(M))$ 换成 $Sig_E(E_{KUb}(M))$让 B 以为该消息来自 E签名被剥离重贴保存信息多除了 M 和 $Sig_A(E_{KUb}(M))$还要保存 $E_{KUb}(M)$因为 $KUb$ 可能过期事后仲裁需要保留加密版本。因此实践中更倾向于方式 1先签名后加密或者干脆采用签名 单独加密的分离设计。5.6 ElGamal 签名方案ElGamal 签名方案由 T. ElGamal 于 1985 年提出其变体用于 DSS 中安全性依赖于有限域上离散对数的困难性与 RSA 依赖大整数分解不同参见公私钥密码体制笔记中的 DLP 基础。构造参数全局参数p 是一个大素数g 是 $Z_p$ 中乘法群 $Z_p^*$ 的一个生成元私钥参数x 是用户的私钥$x \in Z_p^*$公钥参数y 是用户的公钥$y g^x \bmod p$算法中还常使用一个随机数 k。签名过程给定要签名的明文 M生成一个随机数 k$k \in Z_p^*$计算 r$r g^k \bmod p$计算 s$s (H(M) - xr)k^{-1} \bmod (p-1)$到此签名结果为 $(r, s)$把消息和签名结果 $(M, r, s)$ 发给接收者。认证过程取得发送方的公钥 y预查合法性若 $1 \le r \le p-1$继续否则签名不合法计算 $v_1 y^r r^s \bmod p$计算 $v_2 g^{H(M)} \bmod p$比较 $v_1$ 和 $v_2$如果 $v_1 v_2$表示签名有效否则无效。证明正确性推导先对 s 进行处理$$s (H(M) - xr)k^{-1} \bmod (p-1)$$两边乘以 k$$ks (H(M) - xr) \bmod (p-1)$$移项得$$H(M) xr ks \bmod (p-1)$$考察认证过程中的等式 $v_2 g^{H(M)} \bmod p$$$v_2 g^{xrks \bmod (p-1)} \bmod p (g^x)^r (g^k)^s \bmod p$$$$v_2 y^r r^s \bmod p v_1$$因为 $v_2 v_1$所以该算法成立。注意证明中利用了费马小定理的推论指数模 $p-1$ 约化以及 $g^k \bmod p r$ 的定义。5.7 DSS / DSA数字签名标准数字签名标准DSS由美国国家标准与技术研究所NIST公布的联邦信息标准FIPS 186定义其核心算法称为数字签名算法DSA。FIPS 186-3 的最新版本包括三个算法DSA基于离散对数基于 RSA 的数字签名算法RSA-PSS椭圆曲线的数字签名算法ECDSA。与 RSA 不同DSA 算法是一种签名方案但不能用于加密或密钥交换。DSA 的安全性建立在离散对数的困难性上。DSS 的参数与算法细节如下全局公开密钥分量p素数其中 $2^{L-1} p 2^L$$512 \le L 1024$且 L 为 64 的倍数——即比特长度在 512 到 1024 之间长度增量为 64 比特q(p-1) 的素因子其中 $2^{159} q 2^{160}$比特长度为 160g$g h^{(p-1)/q} \bmod p$其中 h 是一整数$1 h (p-1)$。用户私有密钥x随机或伪随机整数其中 $0 x q$。用户公开密钥$y g^x \bmod p$。用户每个报文的密钥k随机或伪随机整数其中 $0 k q$。签名$$r (g^k \bmod p) \bmod q$$$$s [k^{-1}(H(M) xr)] \bmod q$$签名 $(r, s)$。验证$$w (s)^{-1} \bmod q$$$$u_1 [H(M)w] \bmod q, \quad u_2 (r)w \bmod q$$$$v [(g^{u_1} y^{u_2}) \bmod p] \bmod q$$测试$v r$ 则签名有效。符号约定M要签名的消息H(M)使用 SHA-1 生成的 M 的散列码M、r、s接收到的 M、r、s 版本验证方用自己的计算与收到的签名比对。DSS 的特点DSS 的签名比验证快得多签名中只有少数模幂运算验证中涉及更多的公开参数运算具体快慢关系取决于实现教材结论是签名侧计算量显著低于验证侧DSS不能用于加密或者密钥分配是纯签名方案$s^{-1} \bmod q$ 要存在须满足 $s \ne 0 \bmod q$如果 $s \equiv 0 \bmod q$ 发生接收者可拒绝该签名并要求重新构造该签名——实际上 $s \equiv 0 \bmod q$ 的概率非常小若 p 为 512 位、q 为 160 位则 DSS 的签名只需两个 160 位分量即仅 320 位——相比 RSA 签名与模长等长如 1024 位DSS 的签名要短得多。5.8 特殊数字签名算法不可否认的数字签名一般数字签名由发送方 A 将消息加密后送给接收方任何一个只要知道 A 公钥的人都可以对此签名进行验证。不可否认签名则具有新颖特性没有签名者的合作接收者就无法验证签名在某种程度上保护了签名者的利益。例如软件开发者可利用不可否认的数字签名保护他们的软件使得只有付了钱的顾客才能验证签名并相信开发者仍然对软件负责。群签名算法群中各个成员以群的名义匿名地签发消息也称为团体签名。例如在投标中所有投标公司组成一个团体每个公司都用群签名方式对标书签名。群签名具有如下特性只有群成员能代表所在的群签名接收者能验证签名所在的群但不知道签名者需要时可借助于群成员或者可信机构找到签名者可追踪性。盲签名算法假定请求签名者 A、签名者仲裁者B。盲签名就是要求 A 让 B 签署一个文件而不让 B 知悉文件的内容仅仅要求以后在需要时 B 可以对他所签署的文件进行仲裁。应用场景包括电子货币、电子选举。盲签名的基本思想求签名者把明文消息做盲变换得到 MM 隐藏了明文 M 的内容把 M 给签名者仲裁者进行签名得到签名结果 S(M)最后求签名者取回 S(M)采用逆盲变换处理得到 S(M)即为 M 的签名。流程可概括为消息 → 盲变换 → 签名 → 接收者 → 逆盲变换。盲签名协议中常采用分割-选择Cut-and-Choose技术可以使签名者 B 知道他签署的是哪方面的信息但仍然保留盲签名的特征。经典例子是反间谍人员化名的签名反间谍组织的成员身份保密甚至机构头目也不知道机构头目要给每个成员一个签字文件文件内容是持有该文件的人具有外交豁免权。文件中必须使用反间谍组织成员的化名同时机构头目也不能对任意的文件签名假定成员为 A机构头目是签名者 B。这个场景正是盲签名内容盲化 条件受控特性的直观体现。六、PGPPretty Good Privacy6.1 PGP 概述PGPPretty Good Privacy由Phil Zimmermann编写提供可用于电子邮件和文件存储应用的保密与鉴别服务。其设计理念包括支持版本多PGP 支持各种系统平台和不同商业版本选择众所周知的算法避免算法的安全性争议公钥加密包括 RSA、DSS、Diffie-Hellman对称加密包括 CAST-128、IDEA、3DES、AES以及 SHA-1 散列算法适用性强既可用于机构也可用于个人可自主使用不由政府或标准化组织所控制。6.2 PGP 安全服务PGP 提供的安全服务由一组久经考验的算法组合而成安全服务采用的算法数字签名DSS/SHA 或 RSA/SHA消息加密CAST-128 或 IDEA 或 3DES Diffie-Hellman 或 RSA数据压缩ZIP邮件兼容Radix 64 转换这种对称加密消息 公钥加密会话密钥 散列签名 压缩 文本编码的分层组合是 PGP 的核心架构思想。6.3 PGP 运行流程中的符号约定在描述 PGP 流程前先明确符号$K_s$session key一次性会话密钥$K_{Ra}$、$K_{Ua}$用户 A 的私钥和用户 A 的公钥EP、DP公钥加密和公钥解密EC、DC常规加密和常规解密H散列函数Z用 ZIP 算法数据压缩R64用 radix64 转换到 ASCII 格式。6.4 PGP 的五步处理流程步骤 1认证签名。SHA-1 生成消息的 160 位 HASH 码SHA-1 和 RSA 结合提供了一个高效的数字签名方案DSS/SHA-1 作为可选替代方案。步骤 2加密保密 鉴别同时运用。发送方生成消息 M并为该消息生成一个随机数作为会话密钥用会话密钥加密 M采用 CAST-128、IDEA 或 3DES用接收者的公钥加密会话密钥RSA并与消息 M 结合。接收方用自己的私钥解密恢复会话密钥用会话密钥解密恢复消息 M。这就是著名的混合加密hybrid encryption公钥算法只保护短小的会话密钥消息本体由快速的对称算法保护兼顾了安全与性能。步骤 3数据压缩。压缩的位置发生在签名后、加密前因为压缩之前生成签名所以验证时无须压缩验证的是压缩前消息的摘要也避免了压缩算法的多样性问题在加密前压缩压缩的报文更难分析去除了明文冗余增加了密码分析的难度对邮件传输或存储都有节省空间的好处。步骤 4E-mail 兼容性。加密后是任意的 8 位字节而很多邮件系统需要 ASCII 正文组成的块因此需要转换到 ASCII 格式Radix 64将 3 字节输入转换到 4 个 ASCII 字符并带 CRC 校验属盲目转换——即输入流即使是 ASCII算法也会将其转换不判断内容。步骤 5分段与重组。Email 常常受限制于最大消息长度一般限制在最大 50000 字节更长的消息要进行分段每一段分别邮寄PGP 自动分段并在接收时自动恢复签名只需一次在第一段中。6.5 PGP 消息的传送与接收PGP 消息的整体格式由若干部分拼接而成签名部分含时间戳、消息摘要、KeyID 等、会话密钥部分含 KeyID 与加密的会话密钥、消息部分压缩并加密后的数据。接收方按照相反顺序先取会话密钥部分中的 KeyID 定位自己的私钥恢复会话密钥解密得到压缩数据解压后得到消息与签名再用发送方的公钥验证签名。发送消息的格式自内向外可以概括为原始消息 M对 H(M) 用发送方私钥签名得到签名部分将 (消息 || 签名) 用 ZIP 压缩用随机会话密钥 $K_s$ 以 CAST-128/IDEA/3DES 加密压缩后的数据用接收方公钥加密 $K_s$连同两个 KeyID 一起作为会话密钥部分整体经 Radix 64 转换为 ASCII必要时分段发送。6.6 PGP 密钥需求PGP 使用四种类型的密钥一次性会话的常规密钥公钥私钥基于口令短语的常规密钥用于加密保护私钥环。这些密钥存在三种独立需求需要一种生成不可预知的会话密钥的手段需要某种手段来标识具体的密钥一个用户拥有多个公钥/私钥对用于更换、分组等。每个 PGP 实体需要维护一个文件保存其公钥私钥对私钥环和一个文件保存通信对方的公钥公钥环。6.7 会话密钥的生成以 CAST-128 为例以 CAST-128 为例说明 PGP 如何生成 128 位的会话密钥128 位的随机数由 CAST-128 自己生成。输入包括一个 128 位的密钥和两个 64 位的数据块作为加密的输入使用CFB密码反馈方式CAST-128 产生两个 64 位的加密数据块这两个数据块的结合构成 128 位的会话密钥作为明文输入的两个 64 位数据块是从一个 128 位的随机数流中导出的这些数基于用户的键盘输入——键盘输入的时间和内容用来产生随机流。因此如果用户以他通常的步调敲击任意键将会产生合理的随机性。这体现了 PGP 的设计哲学不依赖昂贵的硬件随机源而是把用户敲键节奏这种难以预测的物理事件作为熵来源。CFB 模式的相关细节可参考对称密码体制笔记中对 CFB 工作模式的讲解。6.8 密钥标识符 KeyID一个用户有多个公钥/私钥对时接收者如何知道发送者用的是哪个公钥来加密会话密钥有三种候选方案将公钥与消息一起传送——浪费空间将一个标识符与一个公钥关联对一个用户做到一一对应——管理上带来负担PGP 给每个公开密钥指定 KeyIDKeyID 由公开密钥的最低 64 比特组成包括 64 个有效位$(K_{Ua} \bmod 2^{64})$。PGP 数字签名同样也需要 KeyID接收者需要知道用哪个公钥验证签名。6.9 密钥环KeyID 对于 PGP 非常关键——两个 keyID 包含在任何 PGP 消息中分别提供保密定位解密私钥与鉴别定位验证公钥功能。由于一个节点上可能保存大量密钥需要一种系统化的方法存储和组织这些 key 以保证使用。PGP 在每一个节点上提供一对数据结构私有密钥环存储该节点拥有的公钥/私钥对公开密钥环存储本节点知道的其他用户的公钥。6.10 私有密钥环私有密钥环中每个条目包含以下字段时间戳密钥对生成的日期/时间密钥 ID公开密钥的低 64 位即 KeyID私有密钥密钥对的私有部分该字段被加密保护用户 ID该字段的典型值是用户的邮件地址用户也可为每个密钥对选择不同的名字。注意私有密钥字段是加密存储的——PGP 用基于口令短语的常规密钥对其加密这样即使私钥环文件泄露攻击者也无法直接使用私钥必须破解口令短语。6.11 公开密钥环公开密钥环中每个条目包含UserID公钥的拥有者。多个 UserID 可以对应一个公钥公钥环可以用UserID 或 KeyID 索引。6.12 PGP 报文传输过程发送方签名阶段从私钥环中得到私钥利用 userid 作为索引PGP 提示输入口令短语恢复私钥解密私钥环中的私钥字段构造签名部分。加密阶段PGP 产生一个会话密钥并加密消息PGP 用接收者 userid 从公钥环中获取其公钥构造消息的会话密钥部分。6.13 PGP 报文接收过程接收方解密消息PGP 用消息的会话密钥部分中的 KeyID 作为索引从私钥环中获取私钥PGP 提示输入口令短语恢复未加密的私钥PGP 恢复会话密钥并解密消息。验证消息用消息的签名部分中的 KeyID 作为索引从公钥环中获取发送者的公钥PGP 恢复被传输过来的消息摘要PGP 对接收到的消息重新做摘要并与上一步的结果作比较——一致则签名有效。6.14 公钥管理问题PGP 的信任短板由于 PGP 重在广泛地在正式或非正式环境下应用没有建立严格的公钥管理模式因此存在信任与认证的安全缺口。典型攻击场景如果 A 的公钥环上有一个从 BBS 上获得的、B 发布的公钥但已被攻击者 C 替换这时就存在两条信任通道C 可以向 A 发信并冒充 B 的签名A 以为是来自 BA 与 B 的任何加密消息 C 都可以读取。这暴露了 PGP 的先天局限密钥分发与公钥真实性验证不依赖集中式 CA而是依赖信任网web of trust与用户自行核验。密钥指纹核验、密钥签名相互签名以担保真实性等机制就是为缓解这一短板而设计的。七、总结一条贯穿全篇的主线回顾全文可以提炼出一条清晰的主线消息认证解决消息是谁发的、有没有被改第三方攻击靠的是鉴别函数——加密、MAC 或散列函数散列函数是把任意长消息压成定长指纹的公开函数其七项安全需求中最关键的是单向性与抗碰撞性而生日攻击把有效强度削减到一半因此散列码必须足够长≥160 位;数字签名解决双方互相抵赖不可否认性本质是私钥签署消息摘要RSA基于大整数分解、ElGamal/DSA基于离散对数、以及不可否认签名、群签名、盲签名等变体构成了完整的签名算法谱系PGP是把上述所有机制组合成可用产品的经典范例混合加密对称加密消息 公钥加密会话密钥、SHA-1RSA/DSS 签名、ZIP 压缩、Radix 64 编码、KeyID 双密钥环管理五步流程环环相扣。信息安全系列笔记在仓库中以 信息安全/README.md 为总入口前四讲分别奠定安全概述与安全服务、密码学与经典密码体制、对称密码体制、公私钥密码体制的基础本篇第五讲则完成了从保密到鉴别、从鉴别到签名、从签名到综合应用的收尾。建议读者将本篇与第四讲中的 RSA、ElGamal 数学基础对照阅读两者共享离散对数与大整数分解两条安全基石能够更完整地理解现代密码系统的设计逻辑。赞分享文档教程知识库【免费下载链接】CS-Xmind-Note计算机专业课408思维导图和笔记计算机组成原理第五版 王爱英数据结构王道计算机网络第七版 谢希仁操作系统第四版 汤小丹项目地址https://gitcode.com/gh_mirrors/cs/CS-Xmind-Note点击查看免费下载相关推荐FastStream消息签名数字签名与消息完整性验证FastStream消息签名数字签名与消息完整性验证 在分布式系统和微服务架构中消息的完整性和真实性验证是确保系统安全的关键环节。FastStream作为现后端消息队列微服务上一篇Triton GPU共享技术高效实现多模型共存的专业解决方案下一篇imgproxy图像处理管道设计预处理、处理与后处理阶段创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考