安全协议设计与分析(2)

上节讲了一些,基本是概念,更多的靠理解

本节开始简单讲讲密码学的相关知识,主要是讲一下密码学一些思想是如何应用在协议中的,不会涉及太详细的操作,具体的内容建议去别的博客上速查一下


密码学与网安协议

密码学原理

网络安全协议设计与分析这门课≈ TCP/IP 各层加密部署+密码学+攻防设计:

底层基础:密码学安全原则、密码算法的正确使用规范(你说的加密原则);

中间核心:在网络分层架构下,不同协议层如何设计加密、认证、密钥协商、防攻击机制(各层加密方案);

课程主线:安全协议的整体设计方法论 + 形式化安全分析 + 漏洞攻防。

简单概括: 密码学是「工具箱」,各层加密是「工具箱用在哪个位置」,这门课教你怎么合理选工具、放在网络哪一层、设计一套不会被攻破的交互流程,还要用专业方法证明这套流程是安全的。

为了简单回顾这个流程,我们回顾密码学的一些思想,协议要保证安全,我的理解是要在TCP/IP中充分的应用密码学的加解密相关流程。

网络安全四大核心安全要素

通信面临四类攻击,对应四大安全目标:

拦截 :攻击者截获消息 → 机密性:仅授权接收方可读信息

篡改 :攻击者修改传输消息 → 完整性:数据未被非法修改

伪造 :攻击者冒充身份发送消息 → 可鉴别性(身份认证):确认通信对方真实身份

抵赖 :通信双方否认收发行为 → 不可抵赖性:无法否认发送 / 接收操作

总之,要解决的问题是:

我有消息要发送给你而不想被别人看见,也不想你看见错误的消息

由于网络中间不可信,我们默认中间的黑客几乎全知全能,除了无法直接暴力破解密码手眼通天,可以截获信息,可以篡改加密后信息伪造给你,可以把我发给你的信息多发好几份假装是我发了多份,也可以扣留其中一部分,而你需要保证准确无误的接受这些信息,保证顺序对,数量对,还要保证不对了能够纠错并让我知道中间除了差错。这里屏蔽了绝大多数网络的分层和细节,更像是纯密码的东西。

密码学速览

关于密码学,我在知乎有专门的栏目介绍:

https://www.zhihu.com/column/c_1979621472831034688

需要的自取,然而本课程要求没有那么细致,我们只领悟一下其中的思想

现代密钥密码的算法公开,安全仅依赖密钥保密,分为对称密码、非对称(公钥)密码

对于对称密码算法(单密钥),规定符号:

加密: 解密:

其中M:明文,C:密文,K:共享密钥,收发双方密钥完全相同

符号 英文全称 中文释义
M Message / Plaintext 明文
C Ciphertext 密文
E Encryption 加密函数
K Key 密钥
P Plaintext 明文(M 的替代写法)
D Decryption 解密函数

然而困难在于,前面我们也说过,中间是不稳定的,我如何保证加解密过程只让你指导而让别人不知道呢?因为在对称加密中,即使我加密了自己的密钥,这个密钥的密钥传输依然是明文传输的,依然不安全

因此我们需要非对称,公钥私钥可以理解为,我给几乎所有人都寄出了带同样的锁的盒子,你可以把东西锁在里面后传给我,锁坚不可摧因此不能被打破,但只有我自己有钥匙,发送盒子的过程是安全的,任何人都可以获得,但由于只有我拥有这把钥匙,因此只有我能解锁并知道你给我寄了什么东西,其他人即使有盒子也无法得知别人发的,只知道自己发送的东西。

加密有不少用的是大素数不可暴力破解的特性,靠传统电脑穷举不可行,现在的量子计算机有一定的能力做破解,但毕竟不在本课程讨论范围就不赘述了。

非对称加密的效率很低,通常对称加密和非对称加密算法会结合一起使用

至此,保密解决了,还有篡改和窃取等。

为了让信息按顺序发送,我们在发送前加个编号X,收到了则让对面发个"已收到X,这是第Y条信息"的信息,这样两边的编号都不会出错,TCP里三次握手四次挥手有这部分内容,加个序号就知道自己第几条信息已发送未接收。

至于中间人可能的篡改,我们则考虑用消息摘要等,我们以哈希函数为例

假如一个片段为X,Hash(X)=y,我们公布y,发送信息X,如果中间人稍加篡改,那么获得的hash(X')=y'会与y有巨大的差异,并且通过y还原出X的难度是巨大的,如此在收到消息后对映射后的序列做简单比对就可以知道是否数据变异或者被篡改过。类似的MD5等算法本质上做的也是接近的工作。

上面的论述告诉了我们,我们通过非对称加密让消息能够不被第三人轻易破解的方式加密传输,加入编号保证了顺序正确性(毕竟会分片),并且通过公布校验值保证接收者能够自行校验是否正确。

密码学视角看网安协议

前面只是讲了个大概,很多细节没有详细展开,结合网安协议做更多的分析。

对称加密

对称加密难点是安全交换共享密钥,我们介绍两类对称密码:序列密码和分组密码,由于待加密信息太长一般都会分成若干片因此会分块处理。

序列密码(流密码)

逐位 / 逐字节加密明文;密钥流由伪随机发生器生成

运算:

解密异或相同密钥流恢复明文

分组密码(块密码)

明文切分固定长度分组,每组用同一密钥独立加密。

特性:明文 / 密文空间等长;存在数据扩展 / 压缩两类变体

设计要求:

① 分组长度≥64 位,抵御明文穷举

② 密钥空间足够大,消除弱密钥

③ 算法实现扩散 + 混淆 ,抵抗统计与数学攻击

④ 软硬件高速实现,差错传播范围小

其中,扩散 指的是明文特征分散到全部密文,抵御统计分析。混淆指的是明文、密钥、密文关系非线性复杂化

经典对称密码算法

算法 密钥长度 开发方 说明
DES 56 位 IBM/NIST 早期政府标准,现已不安全
3DES 3×56 位 IBM 三次迭代 DES,提升安全
CAST 40~256 位可变 北方通信 运算速度优于 DES
RC2/RC5 可变长度 Ron Rivest(RSA) 商用专利算法
AES 128/192/256 位 Joan Daemen、Vincent Rijmen 现代主流分组加密标准

对称密钥分发方案:通信一方生成密钥,物理线下交付对方,可信第三方生成密钥,线下分发给双方。使用旧密钥加密新密钥,线上传输更新,可信第三方中转分发(Kerberos 协议 ),结合 DH 密钥交换算法协商会话密钥

非对称加密

1976 年 由Diffie&Hellman 提出,也就是上面提到那个DH。

密钥成对生成:公钥 PK(公开分发)、私钥 SK(本地保密)

数学特性:私钥计算上不可行,这些前面讲过就不赘述了。

两种核心使用场景

加密(保障机密性) A 用 B 的公钥加密明文,B 仅能用自身私钥解密

数字签名(认证 + 防抵赖) A 用自身私钥加密消息摘要,所有人可用 A 公钥验证签名合法性

算法 设计者 核心用途 安全依赖
RSA RSA 公司 加密、数字签名、密钥协商 大整数质因数分解难题
DSA NSA 仅数字签名 离散对数难题
DH Diffie&Hellman 密钥交换 离散对数,支持前向保密

混合加密

非对称加密运算效率极低,工程中组合使用:发送方随机生成对称会话密钥 ,使用接收方公钥加密会话密钥(非对称加密,密文为密钥密文)

使用会话密钥加密业务明文(对称加密,速度快),同时传输「密钥密文 + 业务密文」

接收方私钥解密得到会话密钥,再解密业务数据

攻击

  1. 密码攻击模型

唯密文攻击:仅持有密文,尝试破解密钥

已知明文攻击:持有多组明文 - 对应密文对

选择明文攻击:攻击者可自主选定明文获取对应密文

选择密文攻击:攻击者可自主选定密文获取对应明文

  1. 机密性安全等级

语义安全 攻击者无法从密文获取任何明文额外信息;给定两份明文与一份密文,攻击者猜对对应明文概率不高于 1/2;可抵抗选择明文攻击。

不可延展性 攻击者无法修改现有密文生成另一组有效明文的密文;安全强度高于语义安全,可抵抗选择密文攻击;密钥建立协议常用该安全标准。

完整性(防篡改)

完整性定义

ISO 7498-2:数据未被非法修改、乱序、丢失、重放、插入、篡改的安全属性。 两类保护维度:单数据单元完整性、数据流序列完整性(需序列号 / 时间戳辅助)

实现机制

单向哈希函数(Hash)

公式:

特性:任意长度输入 → 固定长度输出(128/160/256bit),又称数字指纹、摘要

安全属性 :

① 无碰撞性:很难找到两段不同明文输出相同哈希值;碰撞理论存在,仅暴力可寻找

② 单向隐藏性:仅通过哈希值无法逆向推导原始输入;前提:输入空间足够大、分布均匀

常用算法:MD5、SHA1、SHA256

基础应用:口令存储、简易完整性校验

哈希的相关碰撞等内容其实出现数据结构的相关部分,忘记了可以自行去查找

消息鉴别码 MAC / HMAC

普通 Hash 无密钥,攻击者可篡改消息后重新生成摘要;MAC 引入共享密钥解决该问题。

MAC:收发双方共享密钥,计算摘要时绑定密钥,仅持有密钥方可校验完整性

HMAC(RFC2104):带密钥哈希消息认证码,兼容所有 Hash 算法,广泛用于 SSL、IPSec

Hash 与 MAC 区别

Hash:无密钥,任何人可计算摘要,无法防伪造

MAC/HMAC:依赖共享密钥,仅合法通信方可校验,同时提供完整性 + 基础身份认证

可鉴别性(身份认证)

定义:实体认证,确认通信对等方真实身份,区分实体身份、数据来源,是系统访问第一道防线。

数字签名(身份认证基础)

流程:

发送方对明文计算 Hash 摘要

使用自身私钥 加密摘要,生成数字签名

明文 + 签名一并发送

接收方:

① 使用发送方公钥 解密签名,得到原始摘要

② 对收到明文重新计算 Hash 摘要

③ 两份摘要对比一致则证明:消息未篡改、发送者身份真实

学了前面的密码学思想就可以理解,这是个把哈希,非对称加密结合起来的过程,因为思想是相同的,因此具体如何实现就很好懂了,主要看明白哪些文件是要加密的,哪些文件是要校验的,自己思考一下流程应该不难

三大作用:

报文鉴别:验证发送方身份

数据完整性:证明消息传输无修改

不可抵赖:第三方可核验签名,发送方无法否认

数字证书 CA(解决公钥伪造问题)

这雷霆插图是个动画,凑合着看吧

问题:中间人替换公钥攻击

攻击者替换目标公钥,使用自身私钥签名,接收方无法分辨公钥归属。

CA 认证流程:

用户向可信 CA 提交身份信息 + 自身公钥申请证书

CA 核验用户身份,使用CA 私钥 加密「用户信息 + 用户公钥」生成数字证书

用户通信时附带数字证书发送

接收方使用内置CA 根公钥解密证书,提取合法用户公钥,再验证数字签名

数字证书包含字段:版本号、序列号、签名算法、签发机构、有效期、持有人信息、持有人公钥、CA 签名摘要

说人话:自己保留私钥,公钥放进 CA 证书里对外公开,所有人都能拿到你的公钥。

你本地生成一对公私钥:|

私钥(Private Key):永远留在你自己设备,绝不外传、不上传给 CA,只有你自己持有保管。

公钥(Public Key):可以公开,你把公钥 + 个人 / 网站信息打包,发给 CA 申请证书。

CA 用自己的CA 私钥对你提交的公钥、身份信息做数字签名,生成 X.509 CA 数字证书。 证书里存放的就是:你的公钥 + 身份信息 + CA 的签名。

证书可以公开分发(比如 HTTPS 网站返回给浏览器),任何人拿到你的证书,就能提取出你的公钥。

HTTPS 证书应用:

客户端发起 HTTPS 请求,服务器返回网页密文 + 服务器数字证书

浏览器内置可信根 CA 列表,校验证书合法性

校验失败场景:证书域名不匹配、签发机构不受信任、证书过期,浏览器弹出安全警告

数字签名 vs 数字证书

数字签名:证明消息由某人发送、未篡改 ,依赖公钥可信前提

数字证书:由权威 CA 背书,证明公钥真正属于目标用户,解决公钥伪造中间人攻击

举个例子说明

这个过程本质上依旧是用摘要+公私钥的方式做无法抵赖的验证

不可抵赖性

定义:ISO 7498-2:通信实体无法否认参与全部 / 部分通信行为;分为发送抵赖、接收抵赖。

攻击场景:

发送抵赖:发送方否认发送消息

接收抵赖:接收方否认收到消息

身份冒充:伪造他人身份发送消息

数据篡改:修改消息内容后转发

总之,要保证每个可能的中间行为都能被有效记录,未被认证记录的行为都可能是恶行逆施。

如果说前面讲的是对信息盖公章,发送接收双方做身份证,那么不可抵赖性可以理解为对对行为签合同,合同没有不认。

实现方案:

依托数字签名 + 第三方公证机制:

发送方对消息签名,同步发送公证方留存发送凭证

接收方收到消息后签名回执,同步发送公证方留存接收凭证

发生抵赖时,公证方出示带签名凭证作为有效证据

底层依赖公钥密码体系,签名绑定唯一身份,无法伪造、否认

我思来想去觉得合同这个比喻不完全恰当,主要在于,你干的事情要有客观的公正记录让你无法抵赖,你没干的事情也要客观公正记录让你无法冒充,目前找不到更贴切的比喻,就这么凑合看吧。

我们可以用菜市场买东西双方为了"你有没有付钱"起争执最后找市场公证处调监控来辅助理解。

如果有冒充信息的也可进行比对


上面把收发双方的行为和信息等在混沌的网络中用密码学的方式讲了一下加解密的具体流程,实际上操作会复杂一些,协议本质上我的理解是面对复杂的网络环境对密码学的工程化实现

类比一下相当于你知道深度学习的参数训练是怎么回事,公式你都会写,但要想准确高效的在显卡上实现就可能需要cuda这样的算子,里面包括优化,各种奇奇怪怪的边界问题等。

反正大概是这个意思,主要领悟这个思想

接下来我们用一个具体的例子来加以理解:零知识证明

零知识证明

由于我一般是公式多的东西放知乎,代码多的东西放csdn,所以如果想看详细一些的可以参考在这个:https://zhuanlan.zhihu.com/p/1994100885077389881

应用在网安协议场景下就是,我有证书,我需要向你保证我接受你发的信息是合理合法的,然而我不能给你看我的证书,我需要通过双方都接受的一定的计算告诉你《我的确有》,但你即使知道我有也不能看到里面的细节。

这里面依旧应用非对称加密,先看大概的模型:

这个我们结合刚才开门这个例子,如果房间里有若干个东西比如苹果香蕉梨,我每次都不看你的钥匙而是让你打开门给我拿出其中一个水果,如果你每次都能拿出我要你取出的水果而不是胡乱给一个,那么你靠瞎猜给出我要的水果的概率就很低,多重复几次我就基本可以认为,你确实能打开们拿钥匙。

你承诺你有钥匙,我向你发起挑战,这里我的输入为《拿水果X》,你打开门拿出对应地水果相当于相应,如果能对的上,重复数次即可大概率相信你确实有这个本事打开门,而我自始至终看不到钥匙。

与传统证明相比,只看挑战和相应,而不看证明过程,从而减少了窃取证明本身的可能性

(我最开始时研究形式化证明的,这个证明我觉得更多的可以理解为凭证,跟我们做数学题里那个又臭又长的证明还是有很大区别的)

简单看看定义,这也是下面简称ZKP来源

在协议体系里,这个过程可以大概简化为如图所示:

前面我为什么会提及形式化证明呢?因为完备的数学描述长这样:

我知道这东西看起来费劲,所以说点人话:

你要向我做证明,就要保证我能从你的证明中获得的《证明本身的相关信息》尽可能少,同时证明本身还要防止《瞎猜猜中》的可能性,为此可能需要多次测试,降低可能性

下面,我们从简单到复杂,举几个例子大概说明

首先为了回顾,简单过一下RSA相关知识

RSA加密算法原理-CSDN博客

加密与解密算法(一):RSA算法_rsa加密算法-CSDN博客

想要详细看公式和推导的看看这个https://zhuanlan.zhihu.com/p/1993667956652152470

不过我觉得没什么必要,回顾一下公钥私钥过程即可

把原理看一下就差不多了,前面我们也提到大素数难以破解的特性,采用幂是为了提升计算难度,求模是群论的一些要求,目的是让计算结果限制在特定范围内,把公式和结果看一下即可

Q-G零知识证明协议

这里P是有概率做欺骗的,也就是每次可能猜中一半,但是学过数理统计的应该知道,一次造假简单,一直造假困难

因此多轮验证可以极大降低盲猜的可能性

整数分解问题

计算过程类似rsa,结果验证类似QG问题,如果多次正确那么错误概率极低

离散对数问题

道理同理

具体的流程如下:

如果m次检验都成功,则V接受证明

安全多方计算

这个我认为没必要与零知识证明并列,本质上是双方零知识证明的一种延申

为此,这里有几个例子,当然我的水平不足以给各位讲的很明白,直接抛砖引玉

百万富翁问题

安全多方计算之一:什么是安全多方计算_多方安全计算-CSDN博客

安全多方计算之二:一文搞懂百万富翁问题-CSDN博客

这个博主我觉得写的很好,推荐看看

百万富翁问题是两方安全计算典型场景:两人需要对比财富大小,但不信任彼此、也不信任第三方,不能明文传输资产。

依靠 Paillier 加法同态加密实现密文下加减运算,一方生成公私钥,双方加密各自财富,在密文上计算财富差值,再叠加随机掩码隐藏真实差额;仅密钥持有者能解密,最终只输出财富大小关系,全程不泄露双方真实财富;若需抵御恶意虚报,搭配零知识证明校验输入真实性。

最终的结果是,我们只能知道大小,但却不知道具体的数值,从而规避了推测对手财富的可能性。

流程大概是这样,这里虽然是两个人,但本质上不是单方证明,而是多方相互提供加密后的信息然后获得自己想要的那部分,而无法窥探别人信息的具体细节

此为 n 个参与方以安全的方式计算其输入的约定的函数的问题,其中安全意味着保证输出的安全性以及参与者的输入的隐私性,即使有一些玩家作弊,要有对应的检测手段,这是算法本身需要考虑的问题

密码学家晚餐问题

这个问题本质是多方匿名布尔判断

具体来说,三个人吃法,目前账单已经付了,但不知道是:

A:是三人中的其中一人付的

B:是NSA付的

三人只想知道是AB中的哪一种情况,但又不能透露是具体谁买的单

实际上无论几个人都只需要相邻两人抛一枚硬币即可

这个系统能保证隐蔽性,但却不存在纠错机制,也就是如果这里面有人撒谎则结果可能不正确

平均工资问题

这个问题比起前面多了一定的纠错机制,更有参考意义

假如四个人想要知道四人平均工资是多少,但同理不能知道别人的工资是多少,我们可以用零知识证明的机制,让几个人交换加密后的工资信息,求和平均后获得结果

由于零知识证明特性,私钥公钥本身能够做一定的验证,多轮响应后如果有人试图隐瞒自己的真实工资,那么校验结果就会不一样,借用前面QG的相关理念,多次教研不上大概率说明有人在说谎,从而具有一定的纠错

让我们来看看平均工资隐私计算(加法秘密共享 + VSS+Σ 协议防作弊)的过程

假定一共有n 个参与者 的私有工资 (大素数有限域,避免溢出),目标:计算,要求:不泄露任意,可检测 + 定位作弊者。

步骤 1:加法秘密共享(SS)分片

每个参与者对自己的秘密工资 做 n 份分片:随机选取 个域内随机数:,第 n 份分片由等式约束生成:

显然满足: 将分片发送给参与者

步骤 2:VSS 可验证承诺(防事后篡改,定位作弊基础)

基于椭圆曲线生成每个分片的多项式承诺(Pedersen 承诺):

为群生成元,为随机遮蔽数,所有全网公开。 任何人收到 后可验证: ,若不成立,则直接判定,发送恶意分片,锁定作弊者。

步骤 3:单人零知识证明(Σ 协议,证明分片合法,防止虚报工资)

需要公开证明:,满足

Σ 协议三轮公式(交互式防撒谎,多轮压缩逃逸概率)

  1. 承诺阶段 Commit:选取随机遮蔽值 t,计算承诺: ,全网公开 Com。

  2. 挑战阶段 Challenge:所有验证方联合生成随机挑战

  3. 响应阶段 Response:,验证方校验:

其中诚实方一定通过校验;

如果尝试欺骗,那么单次作弊成功概率;连续执行 k 轮,逃逸概率,趋近于 0。

定位逻辑:每位参与者独立提交一组,只要的证明验证失败,直接定位为撒谎者

步骤 4:本地聚合分片

对每个参与者 ,收集所有人发给自己的分片,本地求和: ,所有 全网公开。

步骤 5:重构总工资与平均工资

总工资:

,平均工资:

作弊检测与容错公式说明

分片篡改作弊,则 ,当场锁定发送方

虚报工资作弊,则的 Σ 协议验证失败,锁定

阈值安全:采用阈值 VSS,最多容忍 t 人合谋作恶,剔除恶意节点后用剩余诚实分片重构正确总和。

说人话:

每人把自己工资拆成 4 份随机碎片,分别发给其余的人

同时给每份碎片做数字承诺上锁防篡改,每个人用零知识证明自证碎片之和等于本人真实工资

一旦验证失败就能锁定撒谎者

所有人把收到的碎片各自求和并公开,全部公开值相加得到工资总和,除以人数算出平均工资

全程只能看到聚合结果,无法获知他人单独工资。

比特承诺与数字承诺

安全多方计算之四:比特承诺-CSDN博客

MPC系列-零知识证明和比特承诺_用承诺验证mpc计算过程-CSDN博客

这几个部分不是重点,简单了解一下即可

上述平均工资拆分加随机值的情况能够让求平均值本身经过几个人的校验,因此单一碎片信息的欺骗会导致信息对不上,从而又概率断定某人在撒谎

小结

本文从密码学讲起一路讲到协议里最常见的一些加密的相关思想,主要在于理解

希望对各位的理解有帮助。下节讲做更深入的讲解协议的一些内容

协议类型 公钥 / 公开参数 私钥 / 秘密值 核心计算作用
RSA 身份认证 pk、密文c、随机m sk 加密、解密,证明持有私钥
整数分解 ZKP 模数n、、 素因子p,q 模幂、模平方根,证明掌握 n 的分解
离散对数 ZKP g,p,y,commit,c 离散对数x(永久私钥)、临时w 承诺、响应、幂等式校验,通用隐私证明
哈希比特承诺 承诺值com msg、nonce 锁定秘密,防止篡改
相关推荐
Chockmans10 小时前
春秋云境CVE-2021-42897(保姆级教学)
计算机网络·安全·web安全·网络安全·安全威胁分析·春秋云境·cve-2021-42897
四月天431 天前
web安全-SSTI(服务器模板注入)
笔记·学习·web安全·网络安全
菩提小狗1 天前
每日安全情报报告 · 2026-07-04
网络安全·漏洞·cve·安全情报·每日安全
菩提小狗2 天前
每日安全情报报告 · 2026-07-03
网络安全·漏洞·cve·安全情报·每日安全
中云DDoS CC防护蔡蔡2 天前
短信验证码被攻击怎么办
运维·经验分享·http·网络安全·微信
北域码匠2 天前
RIPEMD-128哈希算法深度解析
c#·密码学·哈希算法·加密算法·消息摘要·ripemd-128·原生实现
菩提小狗2 天前
每日安全情报报告 · 2026-07-01
网络安全·漏洞·cve·安全情报·每日安全
忡黑梨2 天前
安装 Claude Code(使用 DeepSeek API)
网络·网络安全
零零信安19 天前
零零信安荣登数世咨询《新质·数字安全专精百强(2026)》暗网情报领域,彰显专业实力与创新引领
安全·网络安全·数据泄露·暗网·零零信安