可证明安全初步(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) xA(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))f1(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 gG

离散对数假设 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 hG(这一步隐含这个群应该是efficiently samplable,当然不这么做也行,可以选取一个 y y y,返回 g y ← G g^y \leftarrow \mathcal G gyG
  3. 采样 x ← A ( G , q , g , h ) x \leftarrow \mathcal A(\mathbb G, q, g, h) xA(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的步骤如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8D7wDGAi-1690098418516)(image.png)]

  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)安全性定义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n92YEHgd-1690098418517)(image-1.png)]


我们要证明DH NIKE是KR安全的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaPOMtfw-1690098418517)(image-2.png)]

看上面的图,图里的各种线展示了一个攻击者可能攻击的途径。见问号处,给定 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uP3uL4TC-1690098418518)(image-4.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 axios数据请求封装

Vue3 axios数据请求封装 环境&#xff1a;vue3tsvite 首先在项目目录下安装axios 运行 npm install axios 成功后在package.json文件会显示。 目录&#xff1a; request.ts文件代码&#xff1a; import axios from axiosconst request axios.create({baseURL:https://api.…

20230721 Essex UK, Dongbing Gu 公开讲座--机器人前沿

个人主页&#xff1a; https://www.essex.ac.uk/people/GUDON81301/dongbing-gu 机器人领域任务的特点&#xff1a;dull, dirty, dangerous tasks in remote spaces 机器鱼&#xff1a; 实时港口环境监测 机器鱼群探索算法 化学传感器 水面声呐定位系统/SLAM/通信问题 Robotic …

SpringBoot中使用测试框架MockMvc来模拟HTTP请求测试Controller接口

场景 Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用&#xff1a; Java中进行单元测试junit.Assert断言、Mockito模拟对象、verify验证模拟结果、Java8中lambda的peek方法使用_assert java8_霸道流氓气质的博客-CSD…

【MySQL】centos 7下MySQL的环境搭建

从本期博客开始我们正式进入到数据库的学习&#xff0c;在学习数据库时所用到的工具是Linux环境下的MySQL 目录 一、检查环境中是否装有MySQL 二、获取MySQL官方yum源 三、配置MySQL官方yum源 四、一键安装MySQL 五、启动mysql服务 六、登录MySQL 七、修改mysql配置文件…

智慧园区电力监控解决方案

1、概述 电力监控系统实现对园区变电站、配电房内断路器、变压器、柴油发电机以及其它重要设备进行监视、测量、记录、报警等功能&#xff0c;并与保护设备和远方控制中心及其他设备通信&#xff0c;实时掌握园区变电站和配电房运行状况&#xff0c;快速排除故障&#xff0c;保…

redis中使用bloomfilter判断元素是否存在

一 bloomfiler的作用 1.1 bloomfilter的作用 由一个初始值为0的bit数组组成&#xff0c;和多个hash函数构成&#xff0c;用来判断集合中是否存在某个元素。 一个很长的二进制数组&#xff08;00000000&#xff09;一系列随机hash算法映射函数。主要用于判断一个元素是否存在…

【C++】类和对象-封装

1.属性和行为作为整体 2.示例2-设计学生类 3.访问权限 4.class和struct的区别 5.成员属性设置为私有 6.设计案例1-立方体类 在main函数前重新补上isSame函数 在Cube类里面添加issamebyclass&#xff0c;利用成员函数判断两个立方体是否相等 自己写的代码&#xff1a; #in…

(四)RabbitMQ高级特性(消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列

Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ高级特性&#xff08;消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列 文章目录 RabbitMQ高级特性&#xff08;消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列消费端限流利用限流…

jenkins

Gitlab添加钩子 测试钩子 添加完成后&#xff0c;下面会出现钩子选择。点击test中的&#xff0c;push event。 出现successful&#xff0c;既添加成功。 如果添加失败&#xff0c;报错&#xff0c;更改Network

智能安全配电装置应用场景有哪些?

安科瑞 华楠 一、应用背景 电力作为一种清洁能源&#xff0c;给人们带来了舒适、便捷的电气化生活。与此同时&#xff0c;由于使用不当&#xff0c;维护不及时等原因引发的漏电触电和电气火灾事故&#xff0c;也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电…

妙记多 Mojidoc PC端(Mac 端+windows端)Beta版本正式上线!

你们呼唤了无数次的妙记多 Mojidoc PC客户端 Beta版本正式上线啦&#xff01; 感谢300位妙友积极参与内测&#xff0c;给予了我们很多非常有效的意见和建议&#xff01;我们会根据用户反馈不断优化和修复相关功能&#xff0c;在此感谢妙友们一直以来的支持&#xff5e; PC端拥…

Spring(10) 生成和替换Banner启动图案

目录 1.背景2.推荐网站3.如何集成到spring项目中4.效果展示 1.背景 我们在启动 Spring 项目的时候经常会看到一个 Spring 字样的启动图案。如下所示&#xff1a; 如果我们也想根据我们的内容生成这样的图案&#xff0c;应该怎么操作呢&#xff1f; 2.推荐网站 可以生成这种图…

Qt Core学习日记——第四天QMetaEnum(下)

类定义&#xff1a; 成员变量就只有QMetaObject *mobj和uint handle&#xff0c;handle同样用于计算在qt_meta_stringdata_XTest的位置 成员函数&#xff1a; 接下以test类进行函数讲解 test.h #pragma once #include <qobject.h> #include <QFlags> class X…

C语言非常道 6.4习题解答

关于 #include “stdarg.h” 相关知识小结&#xff1a; 函数&#xff1a;tppedef va_list char * ; va_list al; va_start(al, fmt) 使 al 指向变参函数中最后一个已知参数&#xff08;从右往左数的第一个已知参数&#xff09; va_arg(两个参数&#xff09;&#xff0c;第一个…

SpringBoot中配置文件的加载

springboot 启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件 file:./config/(项目根目录config文件夹下的配置文件) file:./(项目根目录下的配置文件) classpath:/config/(resources目录config文件下的配置文件) classpat…

【Android】Ubuntu20.04编译Android 13并用模拟器运行

前言 一直好奇Android系统是怎么定制的&#xff0c;直到亲自走一遍Android系统编译流程才发现并没想象的复杂。 这就跟app开发一样&#xff0c;Google官方其实都提供了平台、文档、IDE及一些工具&#xff0c;咱们只要按照官方提供的指南来操作就行了。 如果Android没有提供这…

中文输入法开发-关键代码

续上篇介绍了嵌入式Linux下中文输入法&#xff0c; 嵌入式Linux下开发中文输入法_嵌入式输入法_小刚学長的博客-CSDN博客 本篇继续介绍核心关键功能 展现效果图如下&#xff1a; 1、如何跟应用关联起来&#xff0c;比如说&#xff0c;希望当LineEdit 输入状态激活后&#xff0…

一文看懂FIFO!

什么是FIFO&#xff1f; FIFO: First in, First out 代表先进的数据先出 &#xff0c;后进的数据后出。 为什么需要FIFO&#xff1f; FIFO存储器是系统的缓冲环节&#xff0c;如果没有FIFO存储器&#xff0c;整个系统就不可能正常工作。 FIFO的功能可以概括为 &#xff0…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

java根据模板导出word

java根据模板导出word 日常开发中&#xff0c;常常会遇到各种各样的表格进行导出&#xff0c;比较好的办法就是提前弄好word模版&#xff0c;再通过遍历的方式进行导出文档 1、制作word模版 模版编写 内容替换 目标下面模版进行多页展示 将word转换成xml 将xml格式化 再将x…