您的位置:首页 > 其它

可证明安全思想简介

2017-09-27 14:57 99 查看
最近正在研究基于属性的非对称加密,一开始看了B.Waters等一些大牛的文章,里面对算法的安全性证明让人很是头疼。后来我也找了几篇国内的博士论文,还有其他学者的文章,看得多了好像找到了一些思路。今天就来总结一下关于可证明安全的思想。

首先,不管加密算法有着什么样稀奇古怪的,或者标新立异的功能,最终都逃不开一个关键问题——算法是否安全呢?面对这个问题,光是说说算法绝对安全之类的话那是肯定不行的,必须得有一个严格的证明过程。那么怎样才能给出一个可靠的证明呢?

我们知道,加密算法的基础就是数学,尤其是数论知识。因此对于攻击者来说,加密算法不可破解这个命题就必然对应于某个核心的数学问题对他来说不可解。幸运的是,在数现有的数论知识里,前人已经为我们总结出了许多不可解的难题。比如Computational Diffie-Hellman Assumption等等。这些数学难题利用现有的知识是无法找到多项式时间的算法的,你也可以理解为随着难题里某个参数的变化,解决这个难题的时间和计算量都是成指数级增长的。目前在安全领域,这些数学难题已经可以视为一种公理化的存在,所以在证明一个加密算法是否安全的时候,就可以将这个加密算法规约到某个具体的数学难题上来。那么该如何给出一种形式化的规约呢?请看下面。

如果你坚信你的算法是安全的,那么久大胆给出一个你认为正确的定理,这个定理的形式是这样的:如果解答某个数学难题是困难的,那么破解这个算法就是困难的。接下来你就要开始证明你的定理的了,证明思路是一种反证法思路:假设破解这个算法不困难,如果推导出解答某个难题也不困难,这与这个数学难题的难解性相矛盾了,那么就表示该假设不成立,则证明了这个算法是安全的。

具体的证明方法如下:

设计4种角色:

1. 算法敌手,目的是破解加密算法;

2. 算法挑战者,代表加密算法接受算法敌手的挑战;

3. 难题敌手,目的是破解数学难题,手段是假装成算法挑战者,通过与算法敌手的互动借助其实力破解数学难题;

4. 难题挑战者,代表数学难题接收难题敌手的挑战。

假定这个算法敌手在多项式时间内能以不可忽略的优势破解算法,设破解所需的时间为t(k),优势为ε(k)。现在将某种难题嵌入到设计的算法当中(这是设计证明过程的关键,也是难点所在,如果有可能后面会单独开一篇来讲解),难题敌手充当算法挑战者欺骗算法敌手,使算法敌手认为在进行真实的攻击,并利用算法敌手的破解结果来解答难题。互动的流程如下:

1. 难题挑战者首先生成难题的参数并发送给难题敌手,难题敌手伪装成算法挑战者,根据数学难题参数进一步构造算法的公钥参数并发送给算法敌手;

2. 算法敌手发起询问,这个询问根据不同的安全级别(选择明文攻击/选择密文攻击)包括密钥生成询问、加密询问或解密询问,包括难题敌手采用某些设计好的诡计返回询问结果,这些询问结果可能是
8854
真实的,可能是随机,但算法敌手绝对分辨不出来;

3. 算法敌手发起挑战,发送两段等长的明文给难题敌手,难题敌手随机选择其中一段明文,进行加密并返回给算法敌手;

4. (可选,如果是针对自适应的攻击就加上这个过程)算法敌手再次发起询问,询问内容和之前一样;

5. 算法敌手猜测密文加密的明文是哪一个,或者直接计算出明文是什么,随后难题敌手利用算法的结果做出难题的解答,并最终返回给难题挑战者。

 

这一互动过程结束后,需要说明如果互动过程顺利结束,那么以上的模拟对于算法敌手来说是完备的,即对算法敌手来说无法区分该过程和真实的加密算法的区别。

 

然后根据条件,给出解答难题的优势ε'(k)与破解算法的优势ε(k)的关系,以及解答难题所需的时间t'(k)与破解算法所需时间t(k)的关系。

 

如果给出了明确的数学关系,表示解答难题也不难,这与定理的条件相矛盾,也就表示证明之初的假设不成立,所以破解算法是困难,即算法是安全的。

最终给出定理:如果解答某个难题是困难的,那么破解这个算法就是困难的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: