上一讲讲到,维基尼亚加密法的应用,有一个大的前期,就是这个钥匙能不被破解,至少钥匙的长度不被破解。
将维吉尼亚加密法升级一次变成2.0版本:钥匙变长
那么,如果这个钥匙非常长呢,长到和原文一样长呢,那么相当于用《金刚经》加密《道德经》——把他们全部换成英语字母的情况下。
举这个例子并非无厘头,因为这两部经典“书籍”的长度都是5000字左右,(5100多字),这样,是不是就会完全没有办法用频率破解法破解了呢?
其实不一定的。钥匙是《金刚经》的经文,这经文中的重复非常多,比如 “如是我闻”“须菩提”在文中出现的频率非常高,“佛说世界,非世界,是名世界”这类句式也非常多。
那么,你说,拿着《哈姆雷特》原文对《道德经》的英文版,进行加密总行了吧。也不行,因为,“and”“the”“a”“an”“he”“she”这样的连接词、冠词、人称代词到处都是,不断重复,如果要破解还是很有办法的。
那怎么办?
不要用文章或者有规律的诗文进行加密了,用随机数。
维吉尼亚加密法再升级:钥匙变成随机数
但是,什么是随机数?随机产生的数吗?什么是随机?
你在跑步或者休息的时候,打开QQ音乐或者网易云音乐,然后你点击随机播放,这就是随机数吗?
并不是的。如果有100首歌要听,而你用真正的随机播放的话,这一百首音乐,可能需要非常长的时间才能听完,因为随机播放的时候,是不会考虑这首歌是不是在十分钟前已经播放过了。苹果公司的音乐软件曾经用随机播放,然后客户抱怨这个不是很“随机”呀,然后苹果公司改了算法,变成了“循环同余随机”,就是你听到的音乐感觉是随机的,随机地听完了100首音乐。现在基本上音乐播放器都是这套规则。所以,QQ音乐或者酷狗等等音乐播放器,你选100首歌,在随机的情况下,基本上不会有太多重复。
还有一个例子,一名数学教授给学生讲概率论,让学生回去掷100次硬币,然后每次的结果需要记下来然后交给老师。教授看了学生提交的作业后,很快就知道谁是一次一次的投硬币了,谁没有。秘密就是:真正自己投掷硬币的话,好几次甚至几十次都是正面或者反面,都是有可能的,而那些不用手去做,只是在脑中思考的人会按照一定的规律交替出现正面和反面,因为看起来非常的随机。
同样的,你在键盘上乱七八糟的打字母,出来的也不是真随机,给你足够长的时间,规律就出来了。凡是软件制造的随机都是伪随机,真随机是非常少见的情况。
这样使用随机数,单次密码本的维吉尼亚加密法是可以非常安全的加密,但是,诞生之初没有人去用,因为效率太低了。
所以密码学一开始就有着效率和安全的双重要求,就和区块链暂时不好突破的所谓不可能三角“去中心化、安全、效率(可扩展性)”一样,这三样密码学的发展就占了其中两样,毕竟,区块链是密码学下的蛋。
扩展内容:
深化了解随机数和伪随机数
对于懂一些编程的朋友,会知道rand()或 random(),这两个函数就是计算机程序用来生成随机数的,这产生的随机数也是伪随机数,我们尽力的去接近随机数但是并不是真的随机数。
引出了密码学中随机数的定义(网上有很多,以下是结合wikipedia定义加一些内容让大家更容易理解):
1, 统计学上的随机性:对于机器来说,所有的信息都可以转化成0和1,也就是一段信息中,0和1的数量是接近的,但是,给你一个十位的二进制随机数,最好不可以是0000011111,为什么呢?肉眼一看就不是随机的,01 10 00 11这样的数组也数量接近,以此类推,这样的情况下,人类看上起这就是随机的。
2, 码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
3, 真随机。
也就是随机样本不可重现。这个是一个非常玄乎的东西。历史上出现过的人类,从一定程度上就是真随机的,不可能出现一模一样的人。但是这么说就太不学术了,实际上只要给定边界条件,就没有真随机数。
当然,你从网上也可以找到一些“真随机数”生成器之类的程序,去生成“真随机数”。如果将“真随机数”和“伪随机数”图像化,大概就是如下图这样。
你一眼就看出了下面这个不够“随机”呀。上面的才是“真随机数”。
事实上,从根本上来说,计算机本身并不能生成真随机数。只是高端的“伪随机数”和不高端的“伪随机数”
目前所有真随机数必须通过物理方法获得,怎么获得真随机数呢?除了google,还有一个途径。
http://www.oscca.gov.cn/
这是国家密码管理局的网站。
相当的威武霸气。大家可以偶尔上上这个网站看看。
http://www.sca.gov.cn/sca/zxfw/2017-04/25/content_1011723.shtml
这个就是网站上的真随机数生成法之一。
那么,思考一个好玩儿的问题,《复仇者联盟3》中的灭霸同志,打一个响指随机消灭了宇宙中的一半生命是“真随机”吗?
答案:不是。
因为几个原因一看就不是随机:
1, 灭霸自己要养老,养老计划就做好了,说明这个响指一打,他知道自己不会消失;
2, 很多CP是杀一个留一个,连神盾局的同事们都是一半的挂掉,如果是真随机,可以全死了,或者全活着,或者不这么有规律性;
3, 应该有个别星球的人是一个都没死的,宇宙那么多生命,说不好就有一个星球可以全活。实际上,灭霸心中所想更像是,每个星球的生命“随机”减少一半。
所以,灭霸的随机,是伪随机。.
其实很多时候,用不着那么多的真随机数,只是如果你有一千个或者几万个比特币要弄个钱包,根据“千金之子,坐不垂堂”的古训,还是要慎重一些选择钱包。
随机数是当代密码学的基础部分,本文只是粗略的介绍入门,修行在个人,大家可以一起讨论和学习。
未来讲到的更加深入的高级的加密法和数字货币知识,离不开随机数这个概念。