主题:【原创】闲聊密码(三) 算法、密钥、随机数 -- 代码ABC
作为闲聊系列,我是一时想到什么就写点什么。除非时间紧,我不打算在每节的末尾都留个坑,所以标题中的序号只表示写作的时间顺序,每节间也没什么联系。所以我不把他们放在一个帖子下,因为那样找起来会更麻烦。
闲聊密码一链接出处
闲聊密码二 密码协议 链接出处
闲聊密码 外一篇——悲惨的DVD(上)链接出处
密码这个词有点误导,其实我想讲的是加密手段。自古以来加密/解密都依赖于某种算法。这里说的算法用正式点的定义是一个有限的机械步骤,而机械的意思也不是指带着齿轮的机器,而是指不需要智能的演化过程。智能就不再扯了,再扯就光有闲聊,没有密码了。简单来说算法就是一个由一系列明确步骤组成的方法,而这些步骤都是不需思考的动作(也就是机械步骤),比如查表、替换、换位等等。如果需要思考的话,就不叫加密而是谜语了。
纯粹依赖算法的加密手段是拙劣的,首先这些算法不容易隐藏原文的规律,密文积累多了很快就可以破译。有兴趣的话可以看看福尔摩斯系列中的跳舞小人。其次算法必须保密,一旦算法泄密整个系统就崩溃了,包括以前的所有密文也不再保密。成熟的加密方法均不依赖算法保密,他们都会让加密步骤中的某一步或几步依赖于一张表,我们通常称这些表为密码本,解密的时候要使用和加密相同的密码本才能还原明文。密码本看起来就像钥匙,只有正确的钥匙才可以打开指定的锁,所以现代的加密算法里我们把类似的东西称为密钥。密码本/秘钥是可以随时更换的,所以即使泄漏了某个秘钥,也只是泄露了使用这些秘钥加密的信息,而且更换秘钥之后就可以避免后续的泄漏。所以现在成熟的加密方法都是这种形式。而且加密的强度不能依赖算法保密已经是密码学的基本原则了。但是还是有人忽视了这一原则,DVD内容加密就是一个有趣的例子。它的解密嘲笑了那些媒体巨头雇佣的二流密码专家。(砖家叫兽不是中国特色),而后来的判决更让它成为一个笑话。有兴趣的大家可以去搜索一下。
而不依赖算法只依赖密钥保密的方法可以很轻易地做到无法破解的加密方法,当然前提是一个很难做到的条件——就是密钥不能重复而且必须是随机的。如果这个前提存在我们就有一个很简单的算法,就是将原文和密钥转成数字,按字符分组加起来就可以了。当然你可以用乘法替代加法,随便什么方法只要可逆就行。另大部分人吃惊的就是这么简单的方法就可以保证无法破解(密钥保密)。但是别忘了那个前提,不重复和随机。不重复的意思是密钥长度必须和曾经(重复,曾经)加密过的原文等长,这个好办一点。但是想一下现代的信息量相做到这点其实还是很困难的,这么长的秘钥怎么保存呢?随机就更麻烦了,也许在日常生活中我们会碰到许多随机的事情,比如六合彩的数字,但依靠这种方式生成随机数的效率不高,所以在现代加密领域中我们使用的是伪随机函数来生成随机数。写过程序的人基本都知道程序中的随机数实际上是伪随机的,如果随机函数的“种子”相同,生成出来的随机数就是一样。甚至于只要获取连续几个随机数通过破解伪随机函数的算法就可以推到出后面的伪随机数,所以我们现在计算机中看到的很多随机数,实际并不随机。
从密码扯到随机数好像有点跑题,其实并不是这样。(伪)随机数怎么生成是现代密码学中很重要的一个内容。在很多密码协议中都要用到,如果这些协议中的随机数被人破解了,系统地安全漏洞就来了。比较直接的例子是跳频通信,即收发双发的频率在通信过程中同步地进行伪随机变换,实际上暗示双发使用相同的伪随机函数来转换收发频率。如果你不知道其跳频规律那么你就无法监听或有效干扰。这种通信方式就依赖于伪随机函数的强度。在实际生活中其实我们也一直在使用类似的技术,比如公司的无线网络以及新一代的CDMA手机。虽然通信频段相同但是相互不干扰就是因为我们每个人的跳频方式不同。注意我说的是类似,实际上上述三种应用不是简单的跳频,而是码分多址技术,类似的意思是一个在频域跳,一个在时域或相位上变,所以这个专业的大牛别挑我的毛病。由于随机数的重要性,还真有人去编随机数表,这些数表来源于自然界的真随机现象,如真空管中的热噪声——扯远了。
本帖一共被 4 帖 引用 (帖内工具实现)