点击蓝色

关注我们

前言

本文是本系列的第四篇,由于侧重点是对密码学中的安全性问题进行分析,所以不会对密码学基础的核心概念进行阐述,如果阅读本系列文章时不明白所涉及的术语时请参考国内大学的推荐教材,如《密码学原理与实践》《深入浅出密码学》,如果只是感兴趣而并非要深入了解,只阅读《图解密码技术》也就够了。

Diffie-Hellman

迪菲-赫尔曼密钥交换/协商(英语:Diffie–Hellman key exchange,缩写为D-H) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

D-H函数

DH密钥协商协议的核心操作是DH函数,其涉及通信双方从Zp*群中随机选择两个私有值,记做a、b,通过a计算公共值A= g^a mod p,通过b计算

B= g^b mod p

然后双方将公共值与自己的私有值结合,这里的关键在于结合后的值是相同的,即

得到的g^ab称为共享秘密,将其传递给密钥派生函数KDF,以生成对称密钥。

这看起来非常简单,但是这只是表面的,事实上这并不容易

一方面,并不是任意素数p或者基数g都可以奏效,比如某些g会导致将共享秘密g^ab限制在一小部分范围内,但实际上我们希望它的可能取值范围与Zp*一样。

p应该满足(p-1)/2结果也是素数,这样才可以保证该群没有使DH更容易被攻破的更小子群。

D-H问题

使用DH计算共享秘密时,我们关心的不仅是DLP问题,更关注特定于DH的问题,分别是CDH和DDH。

CDH

CDH即computational Diffie-Hellman,计算DH问题,给定g^a和

g^b,但是不知道a或b时,

求出g^ab

这个问题的出发点是为了确保攻击者即使拿到了双方的公共值,也不知道共享秘密。

如果可以解决DLP,自然可以解决CDH;但是解决CDH,不一定能解决DLP,事实上可以解决CDH的最快方法是用NFS(numer field sieve,数域筛选法)求解DLP

DDH

DDH即decisional Diffie-Hellman,这个难度假设比CDH更强,如假设在给定公共值的2048比特情况下,攻击者可以计算共享秘密的前32比特,但是无法计算所有2048比特。此时虽然攻击者不知道完整的g^ab,但是它还是知道共享秘密的一部分信息,这有助于攻击者造成破坏。

为了确保攻击者无法得到关于

g^ab的任何信息,只需要将其与随机的群元素区分开即可,这种问题就称之为DDH。给定公共值和某个随机数c,在公共值和g中二选一(概率均为1/2),

DDH问题确定g^ab是否被选中。

如果DDH很难,那么CDH也会很难,就无法获得g^ab的任何信息;如果可以解决CDH,那么就可以解决DDH.DDH不如CDH难,但是DDH是密码学中的主要假设,也是被研究最多的一种。

共享秘密用作密钥

通信双方在完成DH会话交换时,会得到共享秘密g^ab,但是,我们要注意,这是作为派生会话密钥的输入,其本身并不是密钥!

我们知道密钥看起来应该是随机的,其本身每个比特为0、1的概率是相同的,但是g^ab做不到这一点,因为它不是随机字符串。这里容易混淆的一点是:随机的群元素与随机的比特字符串本质上是不一样的。

举个例子,设乘法群Z13*={1,2...12},使用g=2作为生成元,根据g^i可以扩展成所有

Z13*的值,如果g的指数是随机的,那么会获得

Z13*的随机元素,但是将对应元素编码为4比特字符串时就不是随机的了

此时的随机的概念要求所有比特位为0或1的概率相同

但是在Z13*中,有7个值的最高比特位为0,只有5个值的最高比特位为1,所以这个比特位为0的概率为7/12,约为0.58,而不是0.5.

不安全的群参数

CVE-2016-0701是OpenSSL的一个漏洞,其利用的就是不安全的D-H参数,当用户使用不安全的DH群参数(即不安全的素数p)时,会引发风险。

给定素数p,所有DH操作都在其对应的乘法群Zp中发生,Zp包括小的子群.问题在于,在加密协议中如果较大的群中存在较小的子群是非常危险的,因为此时会将共享秘密限制在较小的可能值集合内。更进一步地,攻击者可以构造DH指数x,当其与受害者的公钥g^y结合时,会暴露有关私钥y的信息,从而可能让其完全泄露。

椭圆曲线

曲线选择

椭圆曲线的安全性在于它使用的群的阶(即曲线的点数),加法公式以及其参数的选取原因。

椭圆曲线有很多,但不是所有的都适用于加密,在选择时要仔细选择曲线方程y^2=

x^3+ax+b中的系数a和b,否则得到的曲线可能是不安全的,一般而言,有如下要求:

1.群的阶不能等于一些小数的乘积,否则会很容易求解ECDLP

2.由于当Q=P时,加法公式与其他情况不同,所以做加法时需要权衡,当攻击者可以区分相同点之间的加法和不同点之间的加法时,可能会泄露关键信息。如果曲线对所有点的加法都使用同一个公式,那么它可能是安全的

3.如果曲线的设计者不解释选择参数a,b的原因,那么曲线可能是不安全的,因为我们并不知道a,b是否是较弱的参数。

常用的曲线有NIST曲线以及Curve25519

NIST曲线

NIST的5条曲线工作在模素数上,称为素数曲线,这是最常见的,其中最常用的是P-256,这是对256比特数

进行模运算的曲线,其对应的方程为

但是NIST曲线的系数选择是由NSA指定的,他们并没有说选b的理由,所以这可能是不安全的。

Curve25519


这是由Daniel J.Bernestein设计的,是目前最高水平的 Diffie-Hellman函数,适用于广泛的场景。Curve25519是一个椭圆曲线提供128位安全性,设计用于椭圆曲线Diffie-Hellman(ECDH)密钥协商方案。它是最快的ECC曲线之一。给定一个用户的32字节密钥,curve25519计算该用户的32字节公钥。给定该用户的32字节密钥和另一个用户的32字节公钥,curve25519计算一个32字节的共享密钥提供给这两个用户使用。然后可以使用这个秘密对两个用户进行身份验证和信息加密。其方程形式为

其中486662是满足作者设定的安全准则的最小整数。

其应用十分广泛,包括Chrome,OpenSSH等。

随机性差

与传统的Diffie-Hellman比起来,椭圆曲线使用的参数更多,更容易受到参数误用的风险,也就更容易受到攻击。

我们知道在ECDSA的签名过程中求s=(h+rd)/k mod n时,使用的k是秘密随机的,所以由此产生的签名也是随机的。

如果相同的k被重用去对第二个消息进行签名,那么攻击者可以通过生成的两个值s1=(h1+rd)/k,s2=(h2+rd)/k,得到s1-s2=(h1-h2)/k,从而有k=(h1-h2)/(s1-s2),当k已知时,通过下式可以恢复私钥d

无效曲线攻击

根据椭圆曲线的特点,如果无法验证输入点,那么ECDH就无法正常工作,因为给出点P+Q的坐标的加法公式中没有涉及曲线的系数b,加法公式只依赖于点P和点Q的坐标和系数a,这会导致什么问题呢?

对两个点做加法时,可能其中一个点不在正确的曲线上,即可能加的是另一个只有系数b不同的曲线上的点,这样的话,加法不是在曲线上进行的,攻击者由此就可以发动攻击。

举个例子,设Alice和Bob正在进行ECDH,并在曲线和基点G上达成一致。Bob将其公钥dBG发送给Alice,但是Alice不在约定的曲线上发送自己的公钥dAG,而是发送了另一条曲线上的一个点(而这条曲线非常如,并且对于Alice选择的点P,求解ECDLP很容易,换句话说,Alice选择了一个阶数很低的点,其有一个较小的k,是的kP=O)。而Bob并不知情,通过该公钥计算共享秘密dBP,对他进行哈希,并使用得到的密钥进行加密,并将其发送给Alice。但是,Bob在计算dBP时,不知不觉中计算了较弱的曲线,由于P的阶较低,于是P点落在原本选择的高阶的群的一个小的子群中,导致dBP也在这个小子群中,从而让攻击者在知道P的阶数的情况下有效地确定共享秘密dBP。

一个典型的例子是CVE-2019-9836,研究人员发现SEV椭圆曲线(ECC)实现容易受到无效曲线攻击。在启动命令中,攻击者可以发送不在官方NIST曲线上的小顺序ECC点,并迫使SEV固件将小顺序点乘以固件的专用DH标量。另外这篇学术论文也可供参考《Practical Invalid Curve Attacks on TLS-ECDH》

后量子密码学

量子加速

当一个问题用量子计算机比用经典计算机能更快求解时 ,就称之为量子加速。比如在经典计算机中,要在无序列表中找到某个索引,平均需要n/2次操作。但是存在一种量子算法,只需要√n次操作即可,这比n/2小了几个数量级,比如n=1000000,那么n/2=500000,√n=1000。

我们一般使用时间复杂度来量化算法之间的差异,其用O()符号表示,以上面这个例子为例,经典算法的量级为O(n),而量子算法的运行时间在O(√n)量级,它们之间的差异是平方指数,我们称之为二次加速。

事实上,量级计算还可以实现指数加速,即一个任务在经典计算机上需要指数级时间,如O(2^n),而在量子计算机上只需要多项式复杂度即可,即O(n^k)。因为在密码学中,我们通常把指数时间与不可能联系起来,而多项式时间意味着可实现,所以指数加速对密码学带来的冲击是非常大的。

指数加速的典型代表就是Simon问题:

给定一个方程:

密码学的安全性浅析-4相关推荐

  1. 密码学的安全性浅析-3

    前言 本文是本系列的第三篇,密码学的安全性浅析-1 密码学的安全性浅析-2由于侧重点是对密码学中的安全性问题进行分析,所以不会对密码学基础的核心概念进行阐述,如果阅读本系列文章时不明白所涉及的术语时请 ...

  2. 密码学的安全性浅析-2

    点击蓝字 关注我们 密码学的安全性浅析-1 分组密码 分组密码是一种对称密钥算法.它将明文分成多个等长的模块,使用确定的算法和对称密钥对每组分别加密解密.分组加密是极其重要的加密协议组成,其中典型的如 ...

  3. 密码学的安全性浅析3

    前言 本文是本系列的第三篇,由于侧重点是对密码学中的安全性问题进行分析,所以不会对密码学基础的核心概念进行阐述,如果阅读本系列文章时不明白所涉及的术语时请参考国内大学的推荐教材,如<密码学原理与 ...

  4. 密码学的安全性浅析4

    前言 本文是本系列的第四篇,由于侧重点是对密码学中的安全性问题进行分析,所以不会对密码学基础的核心概念进行阐述,如果阅读本系列文章时不明白所涉及的术语时请参考国内大学的推荐教材,如<密码学原理与 ...

  5. HMAC算法安全性浅析

    HMAC算法安全性浅析 HMAC,全称为"Hash Message Authentication Code",中文名"散列消息鉴别码",主要是利用哈希算法,以一 ...

  6. python模拟上传图片_用python创建自己的等离子图片模拟

    python模拟上传图片 For today's recreational coding exercise, we will investigate plasma physics with parti ...

  7. xmlhttprequest 跨域_跨域资源共享(CORS)安全性

    跨域资源共享(CORS)安全性 背景 提起浏览器的同源策略,大家都很熟悉.不同域的客户端脚本不能读写对方的资源.但是实践中有一些场景需要跨域的读写,所以出现了一些hack的方式来跨域.比如在同域内做一 ...

  8. python 密码学计算_python 密码学示例——理解哈希(Hash)算法

    Hash 是密码学安全性的基石,它引入了单向函数(one-way function)和指纹(fingerprint)的概念.即: 对于任意输入,都可以产生相同的.唯一的输出值 输出值中不包含输入值的任 ...

  9. 烤仔TVのCCW丨密码学通识(二)什么是“安全的加密”

    大家好,欢迎收看 CCW. 上期视频,烤仔为大家介绍了密码学的基础知识以及一些长期存在的误区.本期烤仔将继续密码学话题,探讨什么是安全的加密? 判断一个加密算法安不安全,首先要来看看有哪些攻击方式可能 ...

最新文章

  1. 安装和使用Oracle VM VirtualBox中的要点,注意事项和遇到的问题
  2. 深度丨走向人工智能时代,百度的延承和蜕变
  3. dNet命令行编译命令CSC使用详细图解
  4. 多线程:保证三个线程依次按顺序执行?newSingleThreadExecutor!!!
  5. HTML5如何学?学HTML5要注意什么?
  6. 7.Android的学习(活动的生命周期以及小例子)
  7. Linux系统编程6:入门篇之如何拿下gdb调试器?来和我一起调试一个程序
  8. python寻峰算法_现代法谱估计(1)Yule Walker 方程法MATLAB及Python实现
  9. lsof u mysql wc l_lsof命令详解
  10. 纳维-斯托克斯方程:行到水穷处,坐看云起时
  11. BMFont字体编辑器的使用
  12. 如何推广自己的新网站
  13. 用matplotlib中的FuncAnimation()实现GDP世界排名动态图
  14. 理解敏捷价值观(学习敏捷笔记)
  15. 4 Kubernetes资源-Pod控制器(2)
  16. 去除word转pdf时的图片黑边
  17. 高性价比的“小985”院校推荐!认可度超高
  18. Kaggle数据竞赛记录 - Steel Defect Detection
  19. [fyne] build constraints exclude all Go files in
  20. 打印标签时如何解决打印偏移

热门文章

  1. 都是做游戏,为嘛国内外出来的产品相差这么大?
  2. 最全前端资源---快过来 最新鲜的资源这里都有
  3. python计算机视觉--全景图像拼接
  4. UWB,可以应用到生活中的方方面面
  5. Kafka | Java 消费者是如何管理TCP连接的? | 极客时间
  6. Xilinx Zynq实现任意波形发生器仿真
  7. python中column什么意思_DataFrame属性和column有什么区别
  8. extern、struct等关键字
  9. 【315】备份全盘和备份C盘的区别
  10. C++如何实现二进制数据存储为灰度图