做开发的工程师们应该或多或少都接触过随机数,可能认为它就是一个随机生成的数字嘛,使用时也很简单,只要调用开发语言提供的函数即可。但实际上随机数后面还是有着比较复杂但也有趣的知识点的。

根据一般定义,随机数应该具有以下三个性质:随机性,不存在统计学偏差,是完全杂乱的数列,即分布均匀性和独立性;不可预测性,不能从过去的随机数数列推测出下一个出现的数;不可重现性,不能重现相同的数列。

我们在平时编程开发里用到的随机数,一般都只满足第一个条件,这种只满足随机性分布的随机数,就叫做伪随机数或弱伪随机数。这是因为编程语言提供的随机数生成方法(学名叫伪随机数生成器)是靠软件算法实现的,既然是算法,那就必定遵循了一定的规律,也就有被预测的可能。像常用到的C语言的rand库和Java的java.util.Random类,就是采用了线性同余算法生成随机数。虽然名字好像不好听,但伪随机数已经满足大多数应用场景的需求了。

但对于密码学来讲,伪随机数就远远不够了。除了随机性,密码学要求的随机数还要具备不可预测性。我们把具有这两个性质的随机数叫做密码学安全的伪随机数或强伪随机数。在密码学中随机数的用途很广,主要有以下几个方面:

  • 生成密钥:无论是对称密钥还是公私钥对,生成过程中都有随机因子参与其中,以增加密钥被破解的难度;
  • 生成Nonce:Nonce是Number used once或Number once的缩写,意思是只用一次的数字。通过在数据里加入Nonce,哪怕是对同样的明文加密或签名,都可以保证每一次的加密或签名结果都不相同,以防止重放攻击,这一点对于身份验证系统尤其有意义。所谓重放攻击就是指攻击者截获了你提交的验证信息,然后将信息原封不动的提交给验证系统,冒充你进行身份验证。
  • 加盐:加盐都是Nonce的拓展应用,基本原理也是在加密时向明文掺入随机数因子,以增加加密结果的不可预测性。在密码学里,有这样一个基本原则:加密结果尽量不要保留原数据的规律。举个例子:对称加密都是采用分组加密模式,也就是将原文数据分成组,对每一组进行加密,最后将得到的多组密文合并起来。下图中最左边是原图,中间就是用对称分组加密的方式生成的密文。可以看出,虽然作为分组的原图中每一块区域的都加密了,但颜色一致的区域加密后的数据也是一样的,组合成的密文图像还是带有原图的规律,我们依然可以看出原图的大体内容。针对这个问题,可以在分组数据中加入随机数,使得即使是同样的数据,加密后的结果也不一样。最右边就是经过上述处理后加密的结果,可以看出加密后图像已完全没有任何规律可循了。对称加解密的初始化向量或非对称加解密中的Padding都属于这种加盐应用。

  • Blinding:与加盐的原理类似,只不过是针对密文。话说有一种RSA攻击方式叫做时序攻击,基本方法就是攻击者根据解密所花费的时间确定私钥,比如这一位私钥为0时,解密花1ms,私钥为1时,解密要花10ms,攻击者通过构造不同密文,统计解密花费的时间,理论上可以推算出私钥。针对这种攻击,可以先将密文与随机数进行合并,再送给私钥解密,这样就无法通过时间推算出私钥了。这种方法叫Blinding。
    综上所述,密码学就是利用了随机数的随机性和不可预测性,提高密钥和加解密过程的复杂性和不可预测性,以增加被攻破的难度。

那么,密码学安全的伪随机数或强伪随机数如何生成呢?前面分析过了,靠软件算法生成是不靠谱的。科学已经证明,如果要实现不可预测性的随机数,需要借助物理规律、人品或者老天爷,比如掷钱币、骰子、滑动鼠标的轨迹、电子元件噪声、核裂变、量子理论、大气辐射等等。以它们为随机源生成的随机数,是满足密码学安全要求的。实际应用中一般是采用基于电子元件的噪声原理的随机数发生器芯片。而普通计算机使用的CPU或主板基本是没有这种随机数发生器功能的,因此,在密码学的应用中,随机数发生器芯片成了USBKey的标配,安全的运算,不能没有它的参与。你看,又一次回归到了“私钥永远不出KEY”的金科玉律。

所谓“有一利必有一弊”,强随机数虽然安全,但缺点就是运算速度太慢。我们做过一个实测,在同一台PC主机和生成程序的情况下,采用USBKey生成1000组,每组128KB的随机数,共计耗时约12个小时;采用软件函数库生成同样数量的随机数,只用了不到一分钟。

最后聊聊真随机数,真随机数就是除了随机性和不可预测性外,还需具有不可重复性,也就是产生的随机数列,不可能再次出现。但是在给定边界条件下,是不存在真随机数的,因为随机数范围有边界,那计算出的随机数列必然有重复。不过如果边界条件十分复杂且难以捕捉,我们也可以认为它是真随机数。很多伪随机数列从局部看,都展现了完美的随机性,但如果你把这个随机数列拉长,就会发现它的分布也是有规律的。而真随机数,就是把数列拉的无限长,也是没有任何规律所循。这也就是测试一个随机数发生器质量时,样本数据量要足够大的原因。

其实说到这,不可避免地出现了一个根本问题:世界上到底有没有真正的随机数?前面说过,随机数的产生有赖于物理现象的随机性,但我们现在认为随机的物理现象,是不是只是因为人类认识不够,还没有发现其真正规律?也就是说,这个世界真的是充满了不可预知的各种混沌,还是有一只我们看不见的手在操纵着(爱因斯坦老先生说过:上帝不掷骰子)?幸亏我们讨论的是密码学,不是哲学,这个问题顶多想想就好了。虽然真正的随机数可能不存在,但是有密码学能够用的随机数就已经很好了。

密码学的骰子——随机数相关推荐

  1. 密码学安全强随机数生成器_强密码学简介

    密码学安全强随机数生成器 让我惊讶的一件事是,大多数开发人员都不熟悉强大的加密技术. 在我的职业生涯中,我已经看到过各种各样的错误,这些错误会导致数据泄漏,可猜测的密码,不幸的泄露甚至更糟. 令人高兴 ...

  2. 计算机掷骰子吗?关于随机数的一些细节

    在计算机领域,随机数是一个十分重要的机制,除了模拟客观世界的随机现象,有一些场景本身就需要随机数,比如 AES 对称机密算法中需要一个随机数作为密钥,以及 TCP 连接"三次握手" ...

  3. 序列密码体制——密码学笔记(三)

    一.密码学中的随机数 许多密码系统的安全性都依赖于随机数的生成,例如DES加密算法中的密钥,RSA加密和数字签名中的素数. 序列密码的保密性完全取决于密钥的随机性. 如果密钥是真正的随机数,则这种体制 ...

  4. 【Java】深入理解Java随机数

    随机数 根据密码学原理,随机数的随机性检验可以分为三个标准: 统计学伪随机性.统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,"10""01 ...

  5. 应用密码学(张仕斌)第五章

    序列密码体制 引言Vernam(弗纳姆)密码技术 1917年美国电话电报公司的GilbertVernam为电报通信设计了一种十分方便的密码技术.后来称之为Vernam密码技术. 它是一种代数密码技术: ...

  6. 关于钱包的基础密码学

    通过区块链,人类历史上首次通过技术彻底.纯粹地保障「私有财产神圣不可侵犯」. 让人沉思,让人兴奋的一段话. 可在这背后的基础技术「密码学」是如何工作,以及保障数字资产的安全呢?无论你是爱好者亦或投资客 ...

  7. python掷骰子实验报告_python-模拟掷骰子,两个筛子数据可视化

    """ 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...

  8. python编写掷骰子小游戏

    from random import * count=0#金币数 #玩游戏消耗5金币 #玩一局赠送一金币 #赢一局奖励2金币,输了不奖励 x=0#记录游戏局数 flag=True while flag ...

  9. 如何生成随机的字母数字字符串?

    我一直在寻找一种简单的 Java算法来生成伪随机的字母数字字符串. 在我的情况下,它将用作唯一的会话/密钥标识符,在"超过500K+世代中"可能"是唯一的(我的需求实际上 ...

最新文章

  1. css3绘制环形_HTML5 + CSS3 gt;gt;gt; 015
  2. 关于拆分活动页为独立仓库的一点思考
  3. Intellij IDEA 创建Web项目并在Tomcat中部署运行
  4. Python列表之for循环应用
  5. beego-安装(window版)
  6. python bottle框架 重定向_Python的web框架bottle静态文件的路径
  7. 通过Spring Boot使用MySQL JDBC驱动程序
  8. linux源码安装apache2,CentOS7编译安装Apache2
  9. win10下VS2013+OpenCV2.4.9环境配置
  10. SQL Server中的bcp实用工具(批量复制程序)简介
  11. hbase region split 过程(翻译)
  12. Windows 95 下载
  13. 将String字符串转换为GB2312编码
  14. cousera上的华盛顿机器学习专项课程的案例学习学习经历分享
  15. Java实现对已有的PDF添加页码
  16. 2022全新玖五社区系统源码V9.8版
  17. PHP 实现递归处理数据
  18. Struts2-初学小结
  19. 一篇文章带你认识GraphQL
  20. c语言和java哪个有前途_C/C++和JAVA哪个更有前途呢?

热门文章

  1. insmod: error inserting '***.ko': -1 Invalid parameters 真正原因以及解决方法
  2. android刷机知识大全,安卓主流机型刷机基础科普 教你刷机不求人
  3. html标签之列表标签,前端开发资料分享
  4. 火爆全网的ChatGPT上手体验,文尾免费送账号!
  5. 个人博客作业Week3
  6. 输入汉字转自动转拼音 20378个词库
  7. entity 与dto 区别
  8. 海量数据处理问题汇总
  9. Android向SDCard中上传文件时报错:Failed to push items
  10. MySQL函数大全及用法示例