正在阅读:从零到壹学习密码学:随机数从零到壹学习密码学:随机数

2018-06-27 15:07 出处:其他 作者:佚名 责任编辑:liukaiping

  黎跃春:孔壹学院创始人兼CEO,国内区块链布道先行者,通信和信息技术培养工程区块链高级授课专家。

  从零到壹学习密码学为一个系列,一共20讲,包括初识密码学、Hash 函数、对称加密算法、数字签名、椭圆曲线加解密、公钥基础设施( PKI )、零知识证明、随机数等,为大家详尽的介绍密码学的学习过程。今天我们将为大家介绍从零到壹学习密码学第二十讲:随机数。话不多说,马上开启我们的密码学学习之旅。

  随机数的应用场景

  下面的场景中就会用到随机数

  生成密钥

  用于对称密码和消息认证码。

  生成密钥对

  用于公钥密码和数字签名。

  生成初始化向量(IV )

  用于分组密码的CBC、CFB和OFB模式。

  生成nonce

  用于防御重放攻击以及分组密码的CTR模式等。

  生成盐

  用于基于口令的密码( PBE)等。

  随机数的分类

  随机数主要分为以下三类:

  弱伪随机数

  强伪随机数

  真随机数

  随机数的分类是根据随机数的性质进行的分类。随机数的性质分为以下三类:

  随机性一不存在统计学偏差,是完全杂乱的数列

  不可预测性一不能从过去的数列推测出”下一个出现的数

  不可重现性一除非将数列本身保存下来,否则不能重现相同的数列

  密码技术中所使用的随机数,仅仅具备随机性是不够的,至少还需要具备不可预测性才行。

  GoLang 中的伪随机数

  在 GoLang 中,我们可以通过 math/rand 包里的方法来生成一个伪随机数:

  package mainimport ( "fmt" "math/rand")func main() { fmt.Println(rand.Int()) // => 134020434}

  你会发现运行的结果一直是 134020434,怎样才能显示不同的结果,需要了解一下“随机种子”的概念。

  随机种子

  伪随机数,是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。

  那么自然,在计算伪随机数时假如使用的开始值不变的话,那么算法计算出的伪随机数的数序自然也是不变的咯。

  这个“开始值”,就被称为随机种子。

  可以通过 rand.Seed 方法设置随机种子,如果不设置,则默认值显示为 1,为了保证每次伪随机数生成器工作时使用的是不同的种子,通常的做法是采用当前时间作为种子。

  package mainimport ( "fmt" "math/rand" "time")func main() { rand.Seed(int64(time.Now().Unix())) fmt.Println(rand.Intn(100)) }

  真随机数

  如果我们的应用对安全性要求比较高,需要使用真随机数的话,那么可以使用 crypto/rand 包中的方法。

  package mainimport ( "crypto/rand" "fmt" "math/big")func main() { result, _ := rand.Int(rand.Reader, big.NewInt(100)) fmt.Println(result)}

关注我们

最新资讯离线随时看 聊天吐槽赢奖品