密码学中经典算法及应用
一、加密算法理论基础
1.1 背景
密码学相关安全技术在整个信息技术领域的重要地位无需多言。如果没有现代密码学和信息安全的研究成果,人类社会根本无法进入信息时代。
实际上,密码学和安全领域所涉及的知识体系十分繁杂,下边将介绍密码学中的部分基础知识,包括:Hash算法和数字摘要、加密算法等理论知识。
1.2 Hash算法与数字摘要
1.2.1 Hash算法
Hash(称为哈希或散列)算法是非常基础也非常重要的计算机算法,它能将任意长度的二进制明文串映射为较短的(通常为固定长度的)二进制串(Hash值),并且不同的明文很难映射为相同的Hash值。
对于一个优秀的Hash算法应当实现以下四点特性:正向快速、逆向困难、输入敏感及冲突避免。同时在更多的场景下,也往往会要求算法对于任意长度的输入内容,可以输出定长的Hash值结果。
Hash算法在性能方面一般都是计算敏感型。这意味着计算是瓶颈,主频越高的CPUHash算法运行速度就越快。因此可以通过硬件加速来提高Hash计算的吞吐量,如采用FPGA来计算MD5值。也有一些Hash算法不是计算敏感型的。如scrypt算法,计算过程需要大量的内存资源,不能通过简单的增加CPU来获得Hash性能的提高。
1.2.2 数字摘要
顾名思义,数字摘要是对数字内容进行Hash运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是Hash算法的最重要的一个用途。利用Hash函数的抗碰撞性特点,数字摘要可以解决确保内容未被篡改过的问题。
在实际应用中我们可以在提供下载服务的网站上附上源文件的MD5值等Hash结果,用户下载文件后可以通过计算文件的MD5值来验证文件的完整性。
1.2.3 Hash攻击与防护
Hash算法并不是一种加密算法,不能用于对信息的保护。但Hash算法常用于对口令的保存上。例如用户登录网站需要通过用户名和密码来进行验证。如果网站后台直接保存用户的口令明文,一旦数据库发生泄漏后果不堪设想。大量用户倾向与在多个网站选用相同或相关联的口令。
利用Hash的特性,后台可以仅保存口令的Hash值,这样每次比对Hash值一致,则说明输入的口令正确。即便数据库泄漏了,也无法从Hash值还原口令,只能通过穷举测试。
当然,我们同时也要意识到这种方法的缺陷,并在实际项目中尽量避免。若用户设置的口令强度不够,只是一些常见的简单字符串,例如password,123456等。有人专门搜集了这些常见口令,计算对应的Hash值,制作成字典。这样通过Hash值可以快速反查到原始口令。这一类型以空间换时间的攻击方式包括字典攻击和彩虹表攻击(只保存一条Hash链的首尾值,相对字典攻击节省存储空间)等。
为了防范这一类攻击,一般采用加盐(salt)的方法。保存的不是口令明文的Hash值而是口令明文再加上一段随机字符串(即“盐”)之后的Hash值。Hash结果和“盐”分别存放在不同的地方,这样只要不是两者同时泄漏,攻击者就很难破解了。
1.3 加解密算法
1.3.1 加解密算法分类
加解密算法是密码学的核心技术,从设计理念上可以分为量大基本类型,即对称加密与非对称加密。对称加密是一种加解密的密钥相同,计算效率高,加密强度高的加密算法。需要提前共享密钥,因此相对容易泄漏(比如:传输过程中被窃听)。因此对于对称加密在分发密钥时,需要借助Diffie-Hellman协议或非对称加密方式来实现。其代表算法有:DES、3DES、AES、IDEA等;非对称加密是一种加解密的密钥不相关,无需提前共享密钥的加密算法,但是相对来说其计算效率低,同时仍然存在中间人攻击可能,典型代表算法有:RSA、ElGamal和椭圆曲线系列算法(代表应用:比特币)。
对称加密从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据作为基本加密单位,应用最为广泛。后者则每次只对一个字节或字符进行加密处理,且密码不断变化,只用在一些特定领域如数字媒介的加密等。
对称加密算法适用于大量数据的加解密过程;不能用于签名场景;并且往往需要提前分发好密钥。
非对称加密是现代密码学历史上一项伟大的发明,可以很好地解决对称加密中提前分发密钥的问题。在非对称加密算法中,加密密钥和解密密钥是不同的,分为公钥和私钥。私钥一般需要通过随机数算法生成,公钥可以根据私钥生成。公钥一般是公开的,他人可以获取的;私钥一般是个人持有,他人不能获取。
非对称加密算法的优点是公私钥分开,不安全的通道也可以使用。但是在处理速度(特别是生成密钥和解密过程)往往比较慢,一般比对称加解密算法慢2~3个数量级;同时加密强度也往往不如对称加密算法。
1.3.2 加解密系统基本组成
现代加解密系统的典型组件一般包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自生是固定不变的,并且一般是公开可见的;密钥则是最关键的信息,需要安全地保存起来,甚至通过特殊硬件进行保护。一般来说,对同一种算法,密钥需要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。其基本过程如图1.3.1所示:
图1.3.1 加解密过程图解
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。
解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
根据加解密过程中所使用的密钥是否相同,算法可以分为对称加密(又称公共密钥加密)和非对称加密(又称公钥加密)。两种模式适用于不同的需求,恰好形成互补。某些时候可以组合使用,形成混合加密机制。
并非所有加密算法的安全性都可以从数学上得到证明。公认的高强度的加密算法和实现往往经过长时间各方面充分实践论证后,才被大家所认可,但也不代表其绝对不存在漏洞。自行设计和发明未经过大规模验证的加密算法是一种不太明智的行为。即使不公开算法加密过程,也很容易被攻破,无法在安全性上得到保障。
实际上,密码学实现的安全往往是通过算法所依赖的数学问题来提供,而并非通过对算法的实现过程进行保密。
二、加密算法现实应用
我们已经详细的了解了加密算法中的两大分类:对称加密算法与非对称加密算法。同时对其加解密的过程有了详细的了解。下面我们开始讨论加密算法在实际操作中可能遇见的问题及其在现实中已经成熟应用的产品。
2.1 加密算法存在的问题
2.1.1 选择明文攻击
在非对称加密中,由于公钥是公开可以获取的,因此任何人都可以给定明文,获取对应的密文,这就带来选择明文攻击的风险(判断加密内容是否为准备好的明文)。
为了规避这种风险,现有的非对称加密算法(如RSA、ECC)都引入了一定的保护机制。对同样的明文使用同样的密钥进行多次加密,得到的结果完全不同,这就避免了选择明文攻击的破坏。
在实现上可以有多种思路。一种是对明文先进行变形,添加随机的字符串或标记,再对添加后结果进行处理。另一种是先用随机生成的临时密钥对明文进行对称加密,然后再对对称密钥进行加密,即混合利用多种加密机制。
2.1.2 混合加密机制
混合加密机制同时结合了对称加密和非对称加密的优点。
先用计算复杂度高的非对称加密协商出一个临时的对称加密密钥(也成为会话密钥,一般相对所加密内容来说要短得多),然后双方再通过对称加密算法传递大量的数据进行快速的加解密处理。
典型的应用案例是现在常用的HTTPS协议。HTTPS协议正在替换掉传统的不安全的HTTP协议成为最普遍的Web通信协议。
HTTPS在传统的HTTP层和TCP层之间通过引入Transport Layer Security/Secure SocketLayer(TLS/SSL)加密层来实现可靠的传输。
采用HTTPS建立安全连接(TLS握手协商过程)的基本步骤如图2.1所示:
图2.1 HTTPS建立连接过程图例
1)客户端浏览器发送信息到服务器,包括随机数R1、支持的加密算法类型、协议版本、压缩算法等。注意该过程为明文。
2)服务端返回信息,包括随机数R2、选定加密算法类型、协议版本以及服务器证书。注意该过程为明文。
3)浏览器检查带有该网站公钥的证书。该证书需要由第三方CA来签发,浏览器和操作系统会预置权威CA的根证书。如果证书被篡改作假(中间人攻击),很容易通过CA的证书验证出来。
4)如果证书没问题,则客户端用服务端证书中的公钥加密随机数R3(又叫PreMasterSecret),发送给服务器。此时,只有客户端和服务器都拥有R1、R2和R3信息,基于随机数R1、R2和R3,双方通过伪随机数函数来生成共同的对称会话密钥MasterSecret。
5)后续客户端和服务端的通信都通过对称加密算法(如ASE)进行保护。
可以看出,该过程主要功能是在防止中间人窃听和篡改的前提下完成会话密钥的协商。为了保障前向安全性,TLS对每个会话连接都可以生成不同的密钥,避免某次会话密钥泄漏之后影响了其他会话连接的安全性。需要注意,TLS协商过程支持加密算法方案较多,要合理地选择安全强度高的算法,如DHE-RSA、ECDHE-RSA和ECDHE-ECDSA。
2.1.3 离散对数与Diffie-Hellman密钥交换协议
Diffie-Hellman(DH)密钥交换协议是一个经典的协议。使用该协议可以在不安全信道完成对密钥的协商,以便后续通信采用对称加密。
DH协议的设计基于离散对数问题。离散对数问题是指对于一个很大的素数p,已知g为p的模循环群的原根,给定任意x,求解X=g^x mod p是可以很快获取的。但在p、g和X已知的前提下,逆向求解x目前没有多项式时间实现的算法。该问题同时也是ECC类加密算法的基础。
DH协议的基本交换过程如下:
1) Alice和Bod两人协商密钥,先公开商定p,g;
2) Alice自行选取私密的整数x,计算X=g^x mod p,发送X给Bob;
3) Bob自行选取私密的整数y,计算Y=g^y mod p,发送Y给Alice;
4) Alice根据x和Y,求解共同密钥Z_A=Y^x mod p;
5) Bob根据X和y,求解共同密钥Z_B=X^Y mod p;
实际上,Alice和Bob计算出来的结果将完全相同,因为在mod p的前提下,Y^x=(g^y)^x=g^(xy)=(g^x)^y=X^y。而信道监听者在已知p、g、X、Y的前提下,无法求得Z。
2.2 消息认证码与数字签名
消息认证码和数字签名技术通过对消息的摘要进行加密,可用于消息防篡改和身份证明问题。
2.2.1 消息认证码
消息认证码全称是“基于Hash的消息认证码”。消息验证码基于对称加密,可以用于对消息完整性进行保护。
基本过程为:对某个消息利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。该HMAC值持有方可证明自己拥有共享的对称密钥,并且也可以利用HMAC确保消息内容未被篡改。
典型的HMAC(K,H,Message)算法包括三个因素,K为提前共享的对称密钥,H为提前商定的Hash算法(一般为公认的经典算法如SHA-256),Message为要处理的消息内容。如果不知道K或H的任何一个,则无法根据Message得到正确的HMAC值。
消息认证码一般用于证明身份的场景。假定信道是安全的,只要对方能够将自己加密后的消息正确的解密并且发送过来,就可以证明对方的身份。
消息认证码使用过程中主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息来自某个确切的身份。反之,如果采用非对称加密方式,则可以追溯到来源身份,即数字签名。
2.2.2 数字签名
与在纸质合同上签名确认合同内容和身份证明类似,数字签名基于非对称加密,既可以用于证实某数字内容的完整性,又同时可以确认来源(或不可抵赖)。
一个典型的场景是,Alice通过信道发给Bob一个文件(一份信息),Bob如何获知所收到的的文件即为Alice发出的原始版本?Alice可以先对文件内容进行摘要,然后用自己的私钥对摘要进行加密(签名),之后同时将文件和签名都发给Bob。Bob收到文件和签名后,用Alice的公钥来解密签名得到数字摘要,与收到文件进行摘要后的结果进行比对。如果一致,说明文件确实是Alice发过来的(别人无法拥有Alice的私钥,否则解密后的结果会有不同),并且文件内容没有被修改过(摘要结果一致)。若比对不一致,则可能是文件被篡改或者文件不是Alice发送过来的。
知名的数字签名算法包括DSA和安全强度更高的ECSDA等。
除普通的数字签名应用场景外,针对一些特定的安全需求,产生了一些特殊数字签名技术,包括盲签名、多重签名、群签名与环签名等。
盲签名中,签名者需要在无法看到原始内容的前提下对信息进行签名。可以实现对所签名内容的保护,防止签名者看到原始内容;另一方面,盲签名还可以实现防止追踪,签名者无法将签名内容和签名结果进行对应。典型的实现包括RSA盲签名算法等。
多重签名即n个签名者中,收集到至少m个的签名,即认为合法。其中n是提供的公钥个数,m是需要匹配公钥的最少签名个数。多重签名可以有效地被应用在多人投票共同决策的场景中。例如双方进行协商,第三方作为审核方。三方中任何两方达成一致即可完成协商。
群签名即某个群组内一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。其中需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名群成员身份的风险。
环签名属于一种简化的群签名。签名者首先选定一个临时的签名者集合,集合中包括签名者自生。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在签名中。环签名在保护匿名性方面有很多的用途。
2.3 数字证书
对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。理论上任何人可以公开获取到对方的公钥。然而这个公钥有没有可能是伪造的呢?传输过程中有没有可能被篡改掉呢?一旦公钥自生出了问题,则整个建立在其上的安全体系的安全性将不复存在。
数字证书机制正是为了解决这个问题,它像日常生活中的一个证书一样,可以证明所记录信息的合法性。比如证明某个公钥是某个实体(如组织或个人)的,并且确保一旦内容被篡改能被探测出来,从而实现对用户公钥的安全分发。
根据所保护公钥的用途,可以分为加密数字证书和签名验证数字证书。前者往往用于保护用于加密信息的公钥;后者则保护用于进行解密签名进行省份验证的公钥。两种类型的公钥也可以同时放在同一证书中。
一般情况下,证书需要由证书认证机构来进行签发和背书。用户也可以自行搭建本地CA系统,在私有网络中进行使用。
2.4 Merkle树结构
Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。广泛运用于P2P系统中,如下图2.2所示:
图2.2 Merkle树结构图
其主要特点如下:
1)最下面的叶子节点包含储存数据或其哈希值;
2)非叶子节点(包括中间节点和根节点)都是它两个孩子节点内容的哈希值;
进一步地,默克尔树可以推广到多叉树的情形,此时非叶子节点的内容为它所有的孩子节点内容的哈希值。
分层次的哈希值记录的特点,让默克尔树具有了一些独特的性质。例如底层任何数据的变动都会传递到根节点。这意味着树根实际上代表了对底层所有数据的“数字摘要”。其主要应用场景有:
1、 快速比较大量数据
对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同。否则必然存在不同。
2、 快速定位修改
一旦发现某个节点如Root的数值发生变化,沿着根节点出发向着差异路径寻找,最多通过O(lgn)时间即可快速定位到实际发生改变的数据块
3、 零知识证明
以上图为例,如何向他人证明拥有的某组数据(D0……D3)中包括给定某个内容D0而不暴露其他任何内容。
很简单,构造如图所示的一个默克尔树,公布N1、N5、Root。D0拥有者通过验证生成的Root是否跟提供的值一致,即可很容易检测D0存在。整个验证过程中验证者无法获知其他内容。
2.5 布隆过滤器
布隆过滤器是一种基于Hash的高效查找结构,能够快速(常数时间内)回答“某个元素是否在一个集合内”的问题。
布隆过滤器因为其高效性大量应用于网络和安全领域,例如信息检索(BigTable和HBase)、垃圾邮件规则、注册管理等。
2.5.1 基于Hash的快速查找
在布隆过滤器值钱,先来看基于Hash的快速查找算法。在签名的讲解中我们提到,Hash可以将任意内容映射到一个固定长度字符串,而且不同内容映射到相同串的概率很低。因此,这就构成了一个很好的“内容—>索引”的生成关系。
试想,如果给定一个内容和储存数组,通过构造Hash函数,让映射后的Hash值总不超过数组的大小,则可以实现快速的基于内容的查找。但是令人遗憾的是,当映射后的值限制在一定范围(如总数组的大小)内时,会发现Hash冲突的概率会变高,而且范围越小,冲突概率越大。很多时候,存储系统的大小又不能无限扩张,这就造成算法效率的下降。为了提高空间利用率,后来人们基于Hash算法的思想设计出布隆过滤器结构。
2.5.2 更高效的布隆过滤器
布隆过滤器采用多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1.进行查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入,如图2.3所示。
图2.3 布隆过滤器示例图
布隆过滤器相对单个Hash算法查找,大大提高了空间利用率,可以使用较少的空间来表示较大集合的存在关系。
实际上,无论是Hash算法,还是布隆过滤器,基本思想是一致的,都是基于内容的编址。Hash函数存在冲突,布隆过滤器也存在冲突。这就造成了两种方法都存在着误报的情况,但绝对不会漏报。
布隆过滤器在应用中误报率往往很低,例如,在使用七个不同Hash函数的情况下,记录100万个数据,采用2M大小的位串,整体的误判率将低于1%,而传统的Hash查找算法误报率接近10%。
2.6 同态加密
同态加密是一种特殊的加密算法,运行对密文进行处理得到仍然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。从抽象代数的角度讲,保存了同态性。
同态加密可以保证实现处理者无法访问到数据自身的信息。如果定义一个运算符π,对加密算法E和解密算法D,满足:
E(XπY)=E(X)πE(Y)
则意味着对于该运算满足同态性。
同态性来自代数领域,一般包括四种类型:加法同态、乘法同态、减法同态和除法同态,则意味着是代数同态,称为全同态,同时满足四种同态性,则称为算数同态。
对于计算机操作来讲,实现了全同态意味着对于所有处理都可以实现同态性。只能实现部分特定操作的同态性,成为特定同态。
同态加密在云计算和大数据的时代意义十分重大。目前虽然云计算带来了包括低成本、高性能和便捷性等优势,但从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心地使用各种云服务了,同时各种数据分析过程也不会泄漏用户隐私。加密后的数据在第三方服务处理后得到加密后的结果,这个结果只有用户自身可以进行解密,这个过程第三方平台无法获知任何有效的数据信息。
另一方面,对于区块链技术,同态加密也是很好的互补。使用同态加密技术,运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大地提高了隐私安全性。
目前全同态加密方案主要包括三种类型:基于理想格的方案、基于整数上近似GCD问题的方案、基于带扰动学习问题的方案(接近实时多方安全计算需求)。
2.7 其他问题
2.7.1 零知识证明
零知识证明是这样一个过程,证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断是正确的。
目前认为零知识证明一般至少应当满足三个条件:
完整性:真实的证明可以让验证者成功验证;
可靠性:虚假的证明无法让验证者保证通过验证,但允许存在小概率的例外;
零知识:如果得到证明,无法从证明过程中获知除了所证明信息之外的任何信息。
参考文献
[1]区块链技术指南[EB/OL]. https://www.gitbook.com/book/yeasy/blockchain_guide/details.
[2]陈暄.云计算下的一种数据加密存储算法的研究[J].电脑知识与技术,2017,13(14):56-58+69.
[3] 吴文玲.认证加密算法研究进展[J].密码学报,2018,5(01):70-82.
[4] 韩芳.云计算环境下混合加密算法研究[J].网络安全技术与应用,2015(05):140-141.
posted on 2018-04-07 21:42 tianxia2s 阅读(1303) 评论(0) 编辑 收藏 举报