密码学的随机性与区块链随机数

本文深入探讨了密码学中随机数的重要性及其定义,强调了随机数的不可预测性和不可重复性。随机数在区块链中扮演关键角色,如在PoW和PoS共识机制中的应用。介绍了伪随机数生成器(PRNG)和真随机数生成器(HRNG)的工作原理,指出伪随机数的安全隐患,并提到了硬件随机数生成器和量子随机数生成器作为提高随机性的解决方案。文章还举例说明了随机数生成错误可能导致的安全问题,如http://blockchain.info的随机数问题,强调了熵在随机数生成中的核心地位。

随机数的核心是数的随机性。随机性是信息安全领域,尤其是密码学领域一个很关键的研究问题。在密码学中,对一个序列的随机性是这样定义的:“看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。”

背景介绍
随机数虽然看起来不起眼,但它却是信息安全的基础之一。在区块链中,随机数有很多的应用场景,例如抽奖活动、验证码、Token、密码应用场景等。

随机数的核心要义
随机数的核心是数的随机性。随机性是信息安全领域,尤其是密码学领域一个很关键的研究问题。在密码学中,对一个序列的随机性是这样定义的:“看起来是随机的,即能通过我们所能找到的所有正确的随机性检验。”

这个序列是不可预测的,即使给出产生序列的算法或者硬件设计和以前产生序列的所有知识,也不可能通过计算来预测下一个比特是什么或者计算代价很大几乎不可实现。

随机性在密码学中占有重要的地位,几乎所有的密码算法和协议都要用到一些对攻击者来说必须是秘密的数据。比如对一个密码算法来说,如果将秘密寓于密钥之中,那么密钥就是秘密,包括对称密码算法(DES、AES、IDEA 等)的密钥和非对称密码算法(RSA、DSA、Diffie-Hellman 等)的私钥等,而这些密钥必须是随机数。对于唯一已经证明了绝对安全性的一次一密系统来说,其安全性就依赖于随机的密钥。

随机数的核心要义是不可预测性,这也是对随机数最基本的底线要求。一旦随机数被人预测到,则基于随机性的安全体系将立刻崩塌。

随机数发生器
既然随机数如此重要,那么随机数生成器的地位也就不言而喻了。随机数生成器用来产生一个位序列,这个位序列的随机性就很重要。如何才能生成均匀的随机位序列呢?

掷骰子被认为是产生随机数的典型示例。统计学家 Francis Galton 在 1890 年的《自然》杂志中提出“在所有的产生随机数的事物中,我认为没有什么能够超越骰子了。” 在摇骰子的过程中,骰子在容器中不断地翻滚、互相撞击,以各种形式和角度与容器壁发生碰撞,在容器中的位置和形态在外界看来都是不可预知的,各种偶发因素一起参与摇骰子的过程中,比如容器哪怕只发生一次晃动,外界都不可能知道里面到底是什么形态。

迄今为止发现最早的骰子(4 个面)来自中东的一座公元前 24 世纪的坟墓里。公元前 1100 年的中国,一些“先知”利用火烧龟壳产生的随机龟裂对未来做预测。又过了几个世纪,在中国诞生了易经占卜法,利用 49 蓍草法进行占卜,其操作的分裂过程很类似于抛硬币。

真伪随机生成器
随机数生成器有真随机和伪随机之分。

只满足“随机数的核心要义”中所讲的随机性要求的其实是伪随机数生成器。伪随机数生成器是一个确定性算法,用一个长度为 k 的二进制序列作为输入,算法就能产生长度为 m(m>>k)的随机数序列,伪随机生成器的输入称为生成器的种子。

实际上,伪随机数生成器产生的随机数并不是真的随机。伪随机数生成器具有周期性,其产生的随机数序列总会产生重复,不过如果生成器的周期足够长(至少要远远大于可能采集的随机数的长度),那么这个随机数生成器产生的局部的随机序列也就和真随机序列看起来没有什么区别了。

真随机数生成器在满足“数的随机性”以及“序列不可预测”这两个要求之外,还要满足第三个要求:

这个序列不能重复产生,即使在完全相同的操作条件下用完全相同的输入对序列发生器操作两次,也将得到两个完全不同的、毫不相关的位序列。

满足了这三个要求的随机数生成器,其产生的随机数是不可重现的,即使是你自己也无法再次产生同样的随机数。

伪随机数生成器 PRNG(Pseudo Random Number Generator)
伪随机数生成器是由冯诺依曼在 1946 年创造的。他的基本思想是从一个随机数种子开始,对其平方,然后取中间值。接下来重复对得到的数取平方并取中间值的过程,就会得到一个具有统计意义属性的随机数序列了。这也就是广为人知的平方取中法。

然而,冯诺依曼的方法并没有经得住时间的考验,因为不论从什么随机种子开始,序列最终都会落入某个短循环序列,比如:8100,6100,4100,8100,6100,4100……。序列中的数字是依赖于前一个数字的这种生成函数,上面的重复循环问题是不可避免的。但是如果说这个循环间隔非常非常大,对实际应用并不会产生影响,那会怎样呢?

1949 年,数学家 D.H.Lehmer 利用线性同余生成器(LCG)实现了这一思路。这种随机生成器发明之初非常流行。一个开发者 Paul Houle 说道:“它在很多情况下已经很好用了,但是不能使用它来做保密使用”。

目前看到的大部分库

源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方法获得曲线**: - 插值方法:依据关键帧信息,选用插值方法(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值