可证明安全初步(Provable Security Basics)

Speecher: Bingsheng Zhang

这一系列的课程,为了介绍一些基础,弥补一些上密码学课和看论文的Gap。

历史上的密码学是art,就像鲁班锁,看着很精妙,但是没有证明。

1970s以来,逐渐发展成Science。

定义和模型一直在改,但是方法论和安全性证明是一样的。


传统的应用:

  • 机密性(加密)
  • 完整性(MAC)
  • 验证(签名)

现代的原语:

  • 区块链
  • FHE
  • ZK
  • SMPC
  • ABE
  • functional encryption
  • indistinguishability obfuscation

现代密码学的核心准则:可证明安全。主要分为三步:

  • 准确地定义威胁模型,即:什么是安全?
    • "什么是安全"的正式模型和定义,比如敌手能做什么、不能做什么...
  • 提出构造
    • 算法、协议、scheme
  • 写一个正式的proof(在这系列课程中,基本就是reduction)
    • 在什么样的威胁模型下,如果某个假设成立,那么构造是安全的(除了极少数的,比如one-time-pad,都会有假设,即使one-time-pad,也会对随机性有假设)。
    • 假设的说明要清晰、没有歧义。

最后我们会得到四个东西:

  • 安全性定义
  • 假设
  • 协议
  • 证明

可证明安全最后也可能不安全:你的假设可能被攻破、威胁模型可能和实际不同(就像你锁了门,但是没关窗)。

1976:DH密钥协商(HTTPS-TLS-DH),这一次我们将部分涉及DH的安全性。为什么DH是安全的?基于什么(假设)是怎么样安全的?

1977:RSA(比如用于电子护照的签名)。

我们以DH介绍可证明安全的初步。

Zhang:一般自己别造假设,follow一些经典假设就够了,否则,虽然也叫可证明安全,但是会被challenge,因为自己对密码学领域的理解并没有那么牛逼。但是,密码学界的一些新突破,比如Gentry(2009)的FHE,就假设了理想格,给了一个构造。但是分析这个假设就可以出三大密。

Textbook RSA 是不安全的

Textbook RSA:就是RSA在课本里呈现的形态,选个 P , Q P,Q P,Q,乘起来、再构造公钥私钥blabla。

Textbook RSA它并不是一个加密算法,而是一个带陷门的one-way permutation。

几年前,有人发现QQ浏览器用的Textbook RSA进行加密,于是写了一篇文章批判一番。

后期,很多学校课程都在说Textbook RSA在各种情况下是不安全的。那RSA怎么用呢?

比如说,加PKCS1.5的padding。RSA本身不是公钥加密算法,

我们给明文加padding,再做一个trapdoor one-way permutation,这就成了一个加密算法。

至于这个算法怎么安全,比如CPA/CCA安全,这就看具体的padding方法和proof。

Warm-up:单向函数(One-way function)

密码学中最基础的一个假设:假设单向函数存在。

实际上,我们不知道单向函数是不是真的存在。

(更事实上地,整个现代密码学的基础就基于假设)

函数 f : { 0 , 1 } n → { 0 , 1 } m f: \{0,1\}^n \rightarrow \{0,1\}^m f:{0,1}n→{0,1}m是单向的,如果有:

  1. ∀ x , f ( x ) \forall x, f(x) ∀x,f(x)是多项式时间可计算的。
  2. 难以反向:对于所有的概率多项式时间(probabilistic polynomial-time, PPT)算法 A \mathcal A A,有
    P [ I n v e r t A , f ( n ) = 1 ] < ϵ ( n ) P[Invert_{\mathcal A, f}(n) = 1] < \epsilon(n) P[InvertA,f(n)=1]<ϵ(n)
    (换句话说,玩下面这个Game时,赢的概率可以忽略)

其中 ϵ \epsilon ϵ是一个negligible函数, n n n在此定义为安全参数。

其中, I n v e r t A , f ( n ) Invert_{\mathcal A, f}(n) InvertA,f(n)是一个game,包含以下四步:

  1. 选择随机 x ← { 0 , 1 } n x \leftarrow \{0,1\}^n x←{0,1}n
  2. 计算 y = f ( x ) y=f(x) y=f(x)
  3. 获取 x ′ ← A ( 1 n , y ) x' \leftarrow \mathcal A(1^n, y) x′←A(1n,y)(给敌手 y y y和安全参数,让它选择 x ′ x' x′)
  4. 当且仅当 f ( x ′ ) = y f(x') = y f(x′)=y时返回1(win)

关于game:

game有一个challenge(考官)和一个adversary(考生)。考官出一些题来考试(play game),通过表现来判断考试是否通过。

为什么说game是考试呢?因为规定了能力(考生能看见什么不能看见什么)、时间(多项式时间)etc


注意一些细节:

  • A \mathcal A A不要求回答一个完全正确的 x x x,只要回答一个原像 x ′ x' x′就OK。
  • x x x要在足够大的域里选(安全参数规定的域里选)。

一个等价的定义:

P x ← { 0 , 1 } n [ A ( 1 n , f ( x ) ) ∈ f − 1 ( f ( x ) ) ] ≤ ϵ ( n ) P_{x \leftarrow \{0,1\}^n}[\mathcal{A}(1^n, f(x)) \in f^{-1}(f(x))]\leq \epsilon(n) Px←{0,1}n[A(1n,f(x))∈f−1(f(x))]≤ϵ(n)

但是绝大多数的game很难这么简洁地写,因为很多game的操作很复杂,在一行里写清楚可能性不大。


一些练习。假设 f ( x ) f(x) f(x)是一个安全的单向函数,那么

  • f ( m ) f(m) f(m)能不能做 m m m的一个one way commitment?

不能。它的问题是: f ( x ) f(x) f(x)是单向函数的话,要求 x ← { 0 , 1 } n x \leftarrow \{0,1\}^n x←{0,1}n,但是这里 m m m没说是uniformly random的。比如石头剪刀布,plaintext的选项只有三种可能性,我们不会拿 m m m做commitment,因为它就没有hiding的性质------试一试 f ( 剪刀 ) f(剪刀) f(剪刀)、 f ( 石头 ) f(石头) f(石头)、 f ( 布 ) f(布) f(布)就什么都知道了。

在微信对话框里如何在不引入可信第三方的情况下相互(公平地)玩石头剪刀布?这就要用到commitment。

  • f ( m ∣ ∣ r ) f(m||r) f(m∣∣r)是不是 m m m的一个commitment?其中 r ← { 0 , 1 } 256 r \leftarrow \{0,1\}^{256} r←{0,1}256、 m ∣ ∣ r m||r m∣∣r是concatenate操作。答案是否定的。根据前面game的定义,不能exactly找到 x x x,但是这个game没说不能精确找到其中的哪些位。

同样的scheme,你用不同的假设(比如把上述game中的one-way function 换成 random oracle),有的时候能做出来,有的时候做不出来。


离散对数问题(一般基于一个group generator G \mathcal G G)

这个 G \mathcal G G,你给它一个安全参数,它就生成一个群并返回。

但是在现实中不是这么用的。你自己生成一个security group,审稿人不一定认。现实中大家一般用公开的group,比如椭圆曲线。

设 G \mathcal G G是一个通用的、多项式时间的、群生成算法。那么向 G \mathcal G G 传入安全参数 1 n 1^n 1n,生成一个循环群 G \mathbb G G(乘群),输出 G \mathbb G G的阶 q q q, q q q的位数是 n n n,一个生成元 g ∈ G g \in \mathbb G g∈G。

离散对数假设 D L o g A , G ( n ) DLog_{\mathcal{A,G}}(n) DLogA,G(n)如下:

  1. 生成 ( G , q , g ) ← G ( 1 n ) (\mathbb G, q, g) \leftarrow \mathcal G(1^n) (G,q,g)←G(1n)
  2. 随机选取 h ← G h \leftarrow \mathcal G h←G(这一步隐含这个群应该是efficiently samplable,当然不这么做也行,可以选取一个 y y y,返回 g y ← G g^y \leftarrow \mathcal G gy←G)
  3. 采样 x ← A ( G , q , g , h ) x \leftarrow \mathcal A(\mathbb G, q, g, h) x←A(G,q,g,h)
  4. 当且仅当 g x = h g^x = h gx=h时返回1

我们说DL问题(关于 G \mathcal G G)是困难的,如果对于所有的PPT 算法 A \mathcal A A:
∣ P [ D L o g G , A ( n ) = 1 ] − 1 / q ∣ ≤ ϵ ( n ) |P[DLog_{\mathcal{G, A}}(n) = 1] - 1/q| \leq \epsilon(n) ∣P[DLogG,A(n)=1]−1/q∣≤ϵ(n)

其中:

  • 1 / q 1/q 1/q是默认的取胜概率(即瞎猜)。
  • 为什么加绝对值呢?因为全猜错也是一种本事(

问题:(非交互式的,Non-Interactive)DH密钥交换(DiffieHellmanKeyExchange)(NIKE)是安全的吗?

这个问题正确的问法是:DHKE在假设X下是Y安全的吗?(这里,我们认为NIKE和DHKE是一个东西)。

于是有三个任务:

  1. 正式定义非交互式KE的安全性(即Y安全)
  2. 确定X
  3. 基于归约给出证明(X成立则达到Y安全性)

首先,如下图所示,我们来简要地看下DH的过程。记左为Alice,右为Bob,那么最基础版本DH的步骤如下:

  1. 双方协商大素数 P P P和生成元 g g g,并且共同持有它们
  2. Alice生成私钥 s s s和公钥 h = g s m o d    P h = g^s \mod P h=gsmodP,将 h h h发给Bob
  3. Bob生成私钥 t t t和公钥 f = g t m o d    P f = g^t \mod P f=gtmodP,将 f f f发给Alice

此时,Alice已知 P , g , s , h , f P, g, s, h, f P,g,s,h,f,Bob已知 P , g , t , h , f P, g, t, h, f P,g,t,h,f。

  1. Alice计算密钥 k e y = f s key = f^s key=fs,Bob计算密钥 k e y = h t key = h^t key=ht

在上图中,攻击者是中间的人。攻击者能做什么?攻击者要做什么?这里假设攻击者只能看交互的信息,其他的什么都做不了(虽然实际上攻击者可以做中间人攻击)。攻击者要猜测 k e y = g s t key=g^{st} key=gst。

根据上面的intuition,我们给出下面的NIKE的Key-Recovery(KR)安全性定义:


我们要证明DH NIKE是KR安全的。

看上面的图,图里的各种线展示了一个攻击者可能攻击的途径。见问号处,给定 g s , g t g^s, g^t gs,gt,为什么到不了 g s t g^{st} gst?需要注意,它并不是DL假设能说通的。

DH文章中介绍了一个tautological assumption(永真式)------CDH,作为安全性假设。

DHKE是KR安全的,因为CDH假设。

原因如下:

定理. 如果CDH是安全的,那么DL是安全的。

证明思路. 使用反证法。如果攻击者可以破解DL,那么攻击者可以破解CDH。蕴含了一个安全性归约。

于是,下面这张图中可见的攻击方法都被封堵了:

DL的安全性由CDH安全的永真式保证,问号处的安全性由假设保证,sk处的安全性由私钥的保密性推出。

Appendix

关于PPT algorithms

相关推荐
叶落阁主14 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954483 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机3 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机3 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954483 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star3 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954483 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher5 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行7 天前
网络安全总结
安全·web安全
red1giant_star8 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全