| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 比特币源码分析--深入理解区块链 3.高安全的随机数生成器 -> 正文阅读 |
|
[区块链]比特币源码分析--深入理解区块链 3.高安全的随机数生成器 |
????????计算机程序中使用随机数是常见的,常用来做数据校验、密码或其他安全用途。比如很多短信验证码就是6位数的随机数字。之所以一般是6位因为要考虑用户的记忆和输入方便。太长了用户记不住输入也不方便,它可以结合验证码的时效和对应的手机号码来提高安全性。但在Bitcoin中,这种有限长度的数字作为随机数,在强大的算力面前分分钟被破解。作为Bitcoin的随机数生成器(RNG)使用了大量高强度的随机数来提高系统安全,随机数的核心的应用就是钱包(wallet)系统的私钥(有关钱包系统在以后的章节中会介绍)。私钥是一个长度为64的十六进制字符串(32个字节,256位)。为了保证安全,系统必须保证随机数不被猜中而且是唯一的。对于Bitcoin这种开放、几乎人人皆可随时访问的区块链数据库,其中钱包系统的安全等级最高,它要求在现有的运算条件下对私钥的破解概率降低到几乎是零。因为一旦私钥遭破解就可以操控钱包账户的一切资金。要做到这样的高安全就必须保证随机生成的私钥有最安全的熵源。 ????????计算机中的常用的随机数我们通常称之为伪随机数(Pseudo-random),它不是真正的随机,而是按照某种统计学算法生成的。在C++语言中很多生成随机数的函数,比如:srand、rand等,但这些远不能满足Bitcoin安全的需求,这些函数几乎排除在Bitcoin能使用的函数之外。熵作为混乱程度的度量,熵源可以理解为计算随机数的数据来源。必须保证这些数据是高度混乱的、不规律的,以确保攻击者无法预测和破解。 关于熵 ????????维基百科中关于熵是这样解释的:在信息论中,熵(entropy)是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。这里,“消息”代表来自分布或数据流中的事件、样本或特征。(熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。)来自信源的另一个特征是样本的概率分布。熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量。但是在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。 比特币随机数生成器和熵源的设计 Bitcoin中随机数据生成的主要函数代码(注释有对应的文件名):
下面分别说明三种级别的随机数以及熵源设计: 1.RNGLevel::FAST 顾名思义就是比较快速生成随机数,计算时间相对短,复杂程度相对低,构造流程如下图:
????????通过上述复杂和多重混合计算,其目的是为了构造一个高度随机且无法预测的熵源种子随机数,最后通过计算熵源的512位的哈希值获得指定长度的随机值(最长64个字节)。且每一次计算都是根据上一次计算的结果再进行混合并不断累积,从而使信息熵越来越高,随机值也越趋安全。 2. RNGLevel::SLOW ????????计算时间较长,较复杂,混合的熵源比较多。如下图: 它在SeedFast的基础上增加了:
3.RNGLevel::PERIODIC ?? 系统会周期(每隔一分钟)调用RandAddPeriodic,从而不断进行哈希运算和累积熵,从而提高熵的不确定性和安全性。如下图(蓝色背景部分为代码): 它与SLOW和FAST区别是增加了SeedStrengthen,其用意是根据CPU的时钟来加熵的强度。这三种级别的算法不是独立的,而是相互关联的,?并且不断累积熵源。? 快速随机数(FastRandomContext) ??????? 相对于钱包私钥使用的随机数需要很高的密码安全特性,一般的随机数,如使用随机数来命名文件就不需要经过上述那么复杂的运算。因此Bitcoin中针对这些开发了快速随机数的算法,如下图所示: ????????? 快速随机数生成器有两个主要函数rand256和randbytes。rand256获取256位长度的随机数。randbytes获取指定字节长度的随机数(不超过64个字节数)。与上面介绍的通过熵源构造的随机数生成器RNGState不同的是,快速随机数使用了ChaCha20(一种新型的流密码算法)伪随机的密钥流(keystream)的算法。通过/src/random.cpp的代码得知,在FastRandomContext的构造函数中,通过对chacha20设定key来计算keystream。默认情况下,必须首先请求RandomSeed来获取一个key,该key通过RNGState来获取。如果用户在构造FastRandomContext时设定了key,则不需要通过定RandomSeed来获得key。Key值是ChaCha20算法计算keystream的基础(关于ChaCha20算法在后面的章节介绍)。 下面的代码是FastRandomContext的两个构造函数:
?第一个构造函数表示需要RandomSeed来设定key。第二个构造函数表明用户指定了key?。这里的uint256是一个256位32字节长度的uint8_t类型的数组。 使用SHA-512获取随机值 ????????Bitcoin系统中获取高安全随机数,其中钱包系统的256位私钥,都是通过复杂的计算和混合不同的随机数据来获得高度混乱和不可预测的熵源,并最终计算它的SHA-512来获得随机值。该随机值具有很高的密码安全性,使黑客攻击变得几乎不可能。有关SHA-512的算法在后面的章节再介绍,需注意的是快速随机数算法并不需要计算SHA-512,而是通过Chacha20算法实现的。 代码位置 关于本章随机数的相关代码主要在Bitcoin下面的文件中实现: https://github.com/bitcoin/bitcoin/blob/master/src/random.cpp |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:55:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |