密码学结课后的一些想法以及总结(下)

断断续续的,为时一年的密码学也终于在今天的结课考试中告一段落,之所以在这里写下这些零碎的想法,是因为总感觉这是一个很关键的转折点。之前一年的学习主要是对密码学所涉及的数学知识以及现行加密体系的掌握,学习了部分数论,加密算法流程等。

总感现在很多的渗透中很少考虑密码学方面的漏洞,如果面对的是一个正规加密算法,我们在已知的算法漏洞,或是实际实现中所遗漏的漏洞之外,几乎不会对现行的密码体制做出任何攻击的尝试,密码学课中所讲授的各种基于密码算法的攻击方式,大多都是理论可行的范畴而身边少有例子,毕竟理论上现在计算极限是2^80但实际攻击中你来个试试。。。可能也正是此原因,总觉得我应该把当下对这些知识的理解都写下来,也许目前就是我对密码学认识最清楚的时候了,日后可能再也没有机会能这样正规,这样没有明确目的驱动去学习这样一套系统的理论性知识了。
不管怎样,所有叙事的开端都要先感谢钟神这一年的教导,您渊博的知识以及很和我胃口的讲授方式使我一直认为密码学这门课是我目前上过的最有趣的课,没有之一~~~


基于单向函数的非对称密码算法

首先描述最最基础的单项函数

我所学习的单向函数有三个

  • 基于大素数分解困难性的单向函数
  • 基于DLP离散对数问题的单向函数
    (基于一个循环群的生成元每次给定指数而生成的结果具有不确定性,在循环群上,又可以分成广义的循环群以及循环子群)
  • 基于ECC椭圆曲线的单向函数
    (和DLP很像,只是循环群是在椭圆曲线上构建的,生成元也是椭圆曲线上的一个点,同样是基于给定一个参数和生成元运算的结果具有不确定性)

相应的数论基础

  • 这种基于循环群的问题最早要追溯到原根与循环群的讲解中,在一个循环群中,由原根可以遍历出所有的元素(记得当时原根的寻找方法,欧拉公式求互素的个数什么的,学习了好长的时间,都属于数论中的基础),DLP与ECC本质上都是基于循环群中生成元生成元素的不确定性来做的。
  • 二次剩余与勒让德符号值是椭圆曲线中涉及到的概念,遍历一个椭圆曲线中所有的点方法就是拿着x值来实验,带入x后的结果就会形成形如y^2=xxmodp的形式,那么y是否有解(勒让德符号值来判断),有解下y的两个解是多少(华罗庚的一个理论中提到了部分计算方法)。实际ECC算法实施中,其实并用不到这些概念

现行的攻击方式———针对单向函数问题的降复杂度解法

  • 针对循环群的问题,如果是广义循环群的的话,可以使用基于CRT的指数溢出攻击,貌似还有数域筛?等进行攻击,复杂度与安全等级可以下降相当多
  • 针对循环子群以及ECC这种模是素数的,无法基于CRT进行拆分后的攻击,可以使用基于生日悖论的 pollard_pho算法以及BSGS大步小步法来进行计算,可以下降根号的复杂度即使安全等级下降一半

基于单向函数可以做哪些事情

hint:所有基于单项函数实现的功能,其安全强度都是所使用的单向函数的安全强度

可以基于单向函数制定一些公钥密码算法了
hint:其实基于下面的描述,我感觉公钥密码算法的大致框架就是两种:RSA与Elgamal

  • RSA是基于大整数分解这个单向函数来制定的
    但是学习了Elgamal算法后我总觉得RSA没有前者那样灵活而有趣,因为他是固定的公钥与私钥
  • Elgamal是基于DLP单向函数来制定的,其本质上就是利用DH密钥交换的key进行简单的加密操作,这个体系是发送方发送密文加公钥的,因此是非确定性加密的,即并没有明确的公钥之说
  • 基于ECC的公钥密码算法?好像并没有学习,只是在数字签名中使用到了,用法和Elgamal是差不多的

数字签名中使用的是公钥密码算法
可以感觉到就是对公钥算法的那两种框架进行了改动,使其能够完成签名、签名验证的功能

  • 使用RSA的私钥签名,公钥解密。针对RSA特点,对信息进行预处理,将x进行hash以减少长度,hash中加入salt以改善确定性加密的问题
  • 使用Elgamal的验证体系,使用私钥d与Ke签名,对方使用规定流程进行验证
  • 对Elgamal的验证体系改进后——DSA,将公钥的签名对象进行hash,将DLP基于的循环群改为循环子群以提高安全强度
  • 使用ECDSA,将循环群改为了椭圆曲线上的,相应的改变并不大

进行密钥协商

  • 通过DH密钥交换协议,我才真正认识到基于单向函数算法的优点——没有传输一点敏感数据实现了密钥的协商

公钥密码算法概览以及变动

公钥密码算法无法加密过大的东西,因此应用的场景如上面所述常用于数字签名的身份认证,密钥协商等方面。这都是众所周知的。

从你的私钥是世界上唯一独有的角度来看,我们就能很容易的理解为什么公钥密码算法可以胜任身份证明的任务

我们从密钥协商中就能看出来公钥密码算法的一种特性:数据的传递并不需要安全通道就可以完成,因此让我们从对称加密的机密性中走出来,公钥密码算法中更多的考虑的是数据的完整性与数据认证与不可抵赖性,这些在后面的数字签名以及CA中心中我们可以看到,包括后面学习的很多攻击诸如中间人攻击、重放攻击等,都是基于数据真实性的角度来说的,这是我们学习公钥密码算法后才开始着重考虑的一个方面


关于数据真实性的那些事——Hash,MAC,DS

Hash

注意不要将所采用的结构与盒函数混为一谈,王小云的攻击是在MD5盒函数上的,hash应用中的各种问题是在结构上的

可以提供的服务————消息完整性

Hash函数应当抵抗的几种攻击(攻击方式决定安全强度)

  • 不可逆性,这是肯定的
  • 抗第二原象攻击 即在指定x1下很难找到另一个x2其hash值与前者相同以实现伪造
    2^n个盒子里指定一个,选到的复杂度是2^n
  • 强碰撞攻击 即很难找到两个具有相同hash值得x1与x2
    书上的笔记给了应用的场景 攻击复杂度为2^n个盒子里,在2^n/2时就会有一个盒子里装有两个值,基于生日悖论

现行的Hash函数
MD结构
个人认为并不是MD结构被攻破了,可能只是MD5的那个盒函数找到了碰撞的方法,而且就算没有这种攻击方式,以MD5那2^60的长度也是可以实施攻击的,只是钟神上课演示的碰撞明显不是2^60的复杂度,应该采用了那种攻击方式

  • MD5(输出长度为128bit,抗强碰撞攻击强度为64bit,强碰撞攻击的碰撞算法已经给出)
  • SHA-1(输出长度为160bit,抗强碰撞攻击强度为80bit,未被攻破)
  • SHA2族 (输出长度为不同的值:SHA-224、SHA-256、SHA-384、SHA-512)

MD结构的劣势

  • 这种结构依次往里面输入x值,因此能够在最后添加一些附加值并再进行一次盒内的运算从而获得新的hash值,在含key的hash中会出现问题
  • 只有吸收x,多次吸收完后最终结果即为hash值,这样输出长度就是固定的
  • 大概目前找到了MD5盒的攻击方式,其他MD结构的盒本身并没有找到攻击方式,上述问题是MD结构本身在应用中所存在的缺陷

Keccak结构
SHA3族(SHA3-224、SHA3-256、SHA3-384、SHA3-512)
掌握SHA-3要注意以下几个方面:

  • SHA-3根据不同的安全等级来确定它的输入长度也就是分块长度,具体是什么长度决定具有什么安全等级
  • 在消息分块入盒前,有详细的填充方案

Keccak结构的优势

  • MAC中若是使用hash函数加key的方式,则使用MD结构的话,简单的将key与x组合会有问题,而是用基于Keccak结构的SHA-3的话就可以简单的组合就行了
  • Keccak使用的是海绵结构,首先将所有的x依次吸入,与MD结构不同的是此结构并不将最后一个盒的输出值作为hash结果,而是再进行盒运算以输出,这样实现了输出不同长度的hash结果

其他的补充

  • hash的基础结构都是对x进行分块,然后放入盒中,其分块长度也就是一个盒一次吸入多少的x,决定了hash的运行效率,当然盒内的设计也得要考虑

MAC

简述
简而言之,(x,MAC)的目的就是为了对x的完整性做出验证,而且要保证攻击者不能构造出其他x’的MAC码,或是不能求出修改后x’的MAC码
MAC的构建有两种思路,一是使用hash函数做出对消息的提取,然后在hash中加入key使得攻击者无法计算出x’的hash值;二是自己构建一种信息特征码的提取流程,在流程中录入所有x值,key值,最后得出的值就可以作为特征码MAC来用,又因为里面有着key,攻击者根据流程没有key而无法计算

现行的MAC方案

  • HMAC 使用制定流程将x与ke融合一块后再hash的方案
  • GMAC 基于使用CTR的加密流程,将加密中的结果,padding,key值都吸收入,最后的结果作为MAC码,同时还得到了加密后的结果

Digatal Signature

简述
数字签名基于公钥体系构建,使用私钥签名hash(x),公钥解密进行验证,因为使用私钥进行签名,所以可以证明产品的身份,每一个Android应用都会有使用了开发者私钥签名后的一段数据,来证明此产品是相应开发者所有,被人因为没有此私钥所以是无法伪造里面的数据的。

但正因为使用的公钥体系,签名的速度会很慢,因此才有了只进行信息完整性验证的MAC方案,那里面的key是双方已知的,基于对称加密。对了,DS的安全性也是基于单向函数的安全性的。

现行的DS方案

  • 基于RSA体系 使用私钥加密,公钥解密
  • 基于Elgamal体系(并没有完全采用这种体系,但是单向函数还是一样的)——原始的方案,改进后的DSA,使用ECC的ECDS

密钥分配方案与CA证书

简述
实际生产环境中,一个组织内部的通信使用密钥的话,是需要考虑专门的方案进行密钥分配的,毕竟使用对称加密的话,总密钥个数可是成O(2^n)的复杂度来增长的
如果使用对称加密方式的话,可以通过设置密钥分配中心来减少总密钥的个数,并基于MIT所研究的三头狗Kerburse建立session key的方式来保证安全性
如果使用非对称加密方式的话,密钥复杂度问题就可以完美解决,并设置CA认证中心对用户的公钥进行签名来保证安全性

更新——简述Android应用证书的结构

首先作为证书,里面是有CA中心签名的开发者的公钥的,通过CA中心的签名来保证此证书的真实性,除了公钥部分,还会有一段使用开发者私钥签名的数据,通过使用开发者公钥的验证,可以确保应用不被伪造,的确就是由掌握着私钥的开发者所发布的

对称加密的分配方案以及安全性

分配方案
通过设置密钥分配中心,使分配中心只保留与用户之间的长期密钥,在两个用户间需要通信的时候就建立sessionkey会话密钥并使用两个用户的长期密钥来发送过去
这样可使得一个组织中只保留n个数的长期密钥,越少也就会越安全,尤其是用户电脑中不会保存所有其他用户的密钥,并且新用户加入时不会影响到老用户

安全性
单纯的传输session key的话,因为没有时效性会受到重放攻击,因为没有通信双方的身份会收到攻击,因为没有验证分配中心的身份会受到攻击。Kerburse方案在通信请求者建立连接的时候使用挑战应答的方式验证了通信对方的身份,分配中心在生成的session key中加入时间戳以及通信双方的ID。这样即可提高了安全性

非对称加密的安全性

安全性
以前以为证书就是公钥,学习后才知道其实是经过CA中心签名后的用户公钥。因为单纯的公钥在发放中很容易受到伪造,也没有统一的管理策略,因此有了现在的PKI中心来统一管理证书以及CA中心来为这些证书签名以表明这些是通过验证的。具体是为哪些签名就去看书吧。