目前,隐私计算被认为是保障隐私数据安全的关键技术方法,但J9该如何去理解隐私计算所实现的数据安全?本期J9邀请到密码学专家、清华大学高等研究院助理研究员郑中翔博士,从密码学发展的角度来聊聊数据安全。
隐私计算是密码学的一个热门话题,隐私计算用于保护数据安全,但如何去定义数据安全,什么才叫安全,这就要从密码学的历史开始讲起。
密码学的起源具有悠久的历史,古代战争中安全传递军事情报的需求直接导致了大量密码的诞生,最经典的莫过于凯撒密码,据传就是由凯撒大帝本人亲自设计的密码,它的加密过程就是把字母表中的字母向右移位三位,例如a的加密就对应于d,那解密的过程也是相仿,J9只需要将密文的字母左移3位,就可以得到原始的加密明文。
下面J9举一个例子,对“begin the attack now”(这段文字)进行凯撒密码的加密,就对应到后面这样一个字符串,凯撒密码的加密流程很简单,J9可以看到,它并没有J9现在密码所常用的密钥,只要知道这样一个算法,那么自然就可以进行破解。J9只需要把对应的密文进行移位就可以得到原始的明文,所以说凯撒密码它的安全性并不高。
在凯撒密码的基础之上,人们又随即研发出了移位密码,区别于凯撒密码加密仅是将字母表中的字母向右移三位,那么这一次移位密码它的移位变成了一个变动的k位,例如,对字母m的加密就对应于m加k在mod上一个26,因为字母表一共有26位,那解密的时候也同样将字母循环左移k位就能得到解密的明文。而同样的这样一个移位密码也并不安全,只需要枚举所有的k种可能,J9就能把密码进行破解,所以说它虽然对比凯撒密码安全性有所提高,但实际上仍然是很容易被破解的。
所以说从这样一个例子J9就能看出,安全的密码算法的必要条件就是密钥空间要足够大,否则就没有办法抵抗穷搜攻击。
这一点不光是在古代,在现在由于有了大型计算机的出现,变得尤为重要。接下来J9再看一下,移位密码的另一个改进版本,叫做单字母替换密码,它的加密首先要求构建一个字母表,对应的一个字母上的随机置换,加密的时候通过查表来进行。如下图所示,在解密的时候也只需要通过这样一个反向的查表操作就能进行解密。
看起来这样一个单字母替换密码看起来它的密码空间是非常大的,对应于一个26的阶乘这样一个空间,比之前的移位密码要强的很多,但实际上它依然还是可以很容易被攻破。原因就在于J9在日常生活中的每个字母出现的频率不同,所以只需要进行频率统计,就可以大概的知道哪些密文字母可能对应哪些明文字母,所以只要有足够多的密文样本,J9就能进行统计分析,进而破解这样一个单字母替换的密码。
所以在单字母替换密码的基础之上,又进一步研发出了维吉尼亚密码,维吉尼亚密码被看成是一个改进版的移位密码。之前J9在移位密码里,密钥是由一位字母组成,而在维吉尼亚密码里,密钥由一位扩展为了多位。如下图所示,对于一个明文它的不同位置,它的密钥匙不一样的。
所以维吉尼亚密码的密钥空间是远比之前的移位密码要大得多的,但是可以看到因为J9的密钥是有限长度,所以对于比较长的明文它需要进行循环,所以类似于移位密码这样的一个词频统计,依然可以对维吉尼亚密码进行攻击,只需要先确定密钥长度,再利用词频统计,就可以进行破解。在维吉尼亚密码被提出之后很长一段时间,人们都没有发现很有效的攻击方法,但最终它还是被破解了。
所以J9通过上面的例子可以看到,在古典密码时期,密码的设计通常都是基于经验的,缺乏一个统一的理论框架,很多密码要求同时对算法和密钥进行保密,这样一个特点意味着古典密码更多是一门技术而非科学,算法的设计遵循着破解-修改-再破解的不断循环。时至今日所有的古典密码都已经被破解了,所以说事实表明,设计一套安全可靠的密码并不是一件容易的事情。为了更科学系统的来研究和设计密码,科学家们总结出了一套重要的原则,这促成了密码学从技术到科学的一个转化。
在密码学科学的理论框架下,柯克霍夫原则(Kerckhoffs principle)就是这样一个非常重要的基本原则,它提出密码的安全性应该仅依赖于密钥的安全性,而不依赖于算法的安全性,原因有三点:
第一,这是因为首先保存密钥要比保存算法更容易;
第二,在密钥暴露后只需要更换一个密钥,而不需要更换算法,成本要低得很多;
第三,公开算法的安全性与可靠程度要比自制算法高得多,因为公开算法可以供大规模的用户来使用,而且经由大量的密码学家长时间的检验。
现代密码通常遵循Kerckhoffs原则,这成为了现代密码设计的一个非常重要的基础。
同时为了更科学地研究密码学,现代密码通常有以下的一些基本原则,首先要有正式的安全定义,敌手有哪些能力,要保证哪些安全,都需要通过这样的定义来给定。其次要有一个精确的安全假设,算法的安全建立在哪个数学问题之上,而通过这个问题如何能得到上述的安全,则需要通过严格的安全性证明进行推导。
刚才J9说到古典密码因为没有严格的理论体系,导致都被破解了,那么问题来了,如果J9使用现代密码中广泛认为安全的算法,是否就一定能数据保证呢?答案是不一定,2010年索尼ps3破解事件就是一个很好的例子。索尼给ps3使用的签名算法--基于椭圆曲线算法,是一个国际上广泛被认为安全的算法,但它依然被黑客破解了,其原理是因为索尼在使用这个签名算法的时候,错误地使用了重复的随机数,导致算法的安全强度并不能达到算法的设计要求。因此这也引出了一个算法证明安全和实际安全的概念。
需要强调的一点是,密码学上的证明安全与实际安全并不完全相等,一方面是算法提供的安全保障是否是涵盖了真实的需求,另外算法定义的敌手能力是否涵盖了真实攻击者的能力,以及算法的安全假设是否成立?可以看到这几条都一一对应于前面的算法的基本原则。
要正确的理解证明安全与实际安全之间的关系和区别,分析实际场景中的情况,才能选择合适的密码算法。反之错误地应用密码算法,即使是普遍认为可靠的算法,也可能带来安全隐患。
举一个非常经典的例子,近年来有一些勒索病毒在网络上广泛传播。中了病毒之后并不会攻击你的系统,而是对你的文件进行加密,然后要求你支付一笔赎金才会给你解密的密钥。对于这些勒索病毒的分析发现,如果这些勒索病毒正确地应用了安全的密码算法,那么对它的破解几乎是不可能的,目前被破解的病毒之所以被破解,要么是因为病毒的设计者使用了自制的密码算法,要么是因为病毒的设计者没有正确地使用这些经典的加密算法而导致的,虽然这是一个反面例子,但也同时可以说明正确地使用密码算法才能达到密码算法应有的安全强度。
J9今天主要讨论了密码学角度的安全,总结起来就是三句话:
第一自制算法不靠谱;
第二现代密码有它的原则;
第三实际安全需要谨慎对待。