博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go标准库的学习-crypto/rand
阅读量:7081 次
发布时间:2019-06-28

本文共 3758 字,大约阅读时间需要 12 分钟。

参考:https://studygolang.com/pkgdoc

导入方式:

import "crypto/rand"

rand包实现了用于加解密的更安全的随机数生成器。

Variables 

var Reader io.Reader

Reader是一个全局、共享的密码用强随机数生成器。在Unix类型系统中,会从/dev/urandom读取;而Windows中会调用CryptGenRandom API。

举例说明该如何使用Reader:

package main import(    "fmt"    "encoding/base64"    "crypto/rand"    "io")//sessionId函数用来生成一个session ID,即session的唯一标识符func sessionId() string {    b := make([]byte, 32)    //ReadFull从rand.Reader精确地读取len(b)字节数据填充进b    //rand.Reader是一个全局、共享的密码用强随机数生成器    if _, err := io.ReadFull(rand.Reader, b); err != nil {         return ""    }    fmt.Println(b) //[62 186 123 16 209 19 130 218 146 136 171 211 12 233 45 99 80 200 59 20 56 254 170 110 59 147 223 177 48 136 220 142]    return base64.URLEncoding.EncodeToString(b)//将生成的随机数b编码后返回字符串,该值则作为session ID}func main() {     fmt.Println(sessionId()) //Prp7ENETgtqSiKvTDOktY1DIOxQ4_qpuO5PfsTCI3I4=}

 

func Int

func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)

返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic。

举例:

package main import(    "fmt"    "crypto/rand"    "math/big")func main() {     //从128开始,这样就能够将(max.BitLen() % 8) == 0的情况包含在里面    for n := 128; n < 140; n++ {        b := new(big.Int).SetInt64(int64(n)) //将new(big.Int)设为int64(n)并返回new(big.Int)        fmt.Printf("max Int is : %v\n", b)        i, err := rand.Int(rand.Reader, b)        if err != nil {            fmt.Printf("Can't generate random value: %v, %v", i, err)        }        fmt.Printf("rand Int is : %v\n", i)    }}

返回:

bogon:~ user$ go run testGo.go max Int is : 128rand Int is : 25max Int is : 129rand Int is : 117max Int is : 130rand Int is : 85max Int is : 131rand Int is : 62max Int is : 132rand Int is : 27max Int is : 133rand Int is : 120max Int is : 134rand Int is : 10max Int is : 135rand Int is : 27max Int is : 136rand Int is : 11max Int is : 137rand Int is : 119max Int is : 138rand Int is : 35max Int is : 139rand Int is : 83

 

func Prime

func Prime(rand io.Reader, bits int) (p *big.Int, err error)

返回一个具有指定字位数的数字,该数字具有很高可能性是质数。如果从rand读取时出错,或者bits<2会返回错误。

举例:

package main import(    "fmt"    "crypto/rand")func main() {     for n := 2; n < 10; n++ {        p, err := rand.Prime(rand.Reader, n) //n代表位数,比如3为2位,127为7位        if err != nil {            fmt.Printf("Can't generate %d-bit prime: %v", n, err)        }        if p.BitLen() != n { //返回p的绝对值的字位数,0的字位数为0            fmt.Printf("%v is not %d-bit", p, n)        }        if !p.ProbablyPrime(32) { //对p进行32次Miller-Rabin质数检测。如果方法返回真则p是质数的几率为1-(1/4)**32;否则p不是质数            fmt.Printf("%v is not prime", p)        }        fmt.Println(p)    }}

返回:

bogon:~ user$ go run testGo.go 37133153109223439

如果位数小于2的话,会报错:

package main import(    "fmt"    "crypto/rand"    "log")func main() {     p, err := rand.Prime(rand.Reader, 1) //n代表位数,比如3为2位,127为7位    if err != nil {        log.Fatal(err)    }    fmt.Println(p)}

返回:

bogon:~ user$ go run testGo.go 2019/02/23 12:31:37 crypto/rand: prime size must be at least 2-bitexit status 1

 

func Read

func Read(b []byte) (n int, err error)

本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err == nil时,返回值n == len(b)。

因为本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数,所以最上面的那个生成session ID的例子等价于:

package main import(    "fmt"    "encoding/base64"    "crypto/rand")//sessionId函数用来生成一个session ID,即session的唯一标识符func sessionId() string {    b := make([]byte, 32)    //rand.Reader是一个全局、共享的密码用强随机数生成器    n, err := rand.Read(b);    if err != nil {         return ""    }    fmt.Println(b[:n]) //[154 94 244 2 147 96 148 6 13 27 3 52 231 127 160 159 40 47 84 116 79 87 160 217 185 216 47 143 101 107 219 178]    return base64.URLEncoding.EncodeToString(b)//将生成的随机数b编码后返回字符串,该值则作为session ID}func main() {     fmt.Println(sessionId()) //ml70ApNglAYNGwM053-gnygvVHRPV6DZudgvj2Vr27I=}

 

转载于:https://www.cnblogs.com/wanghui-garcia/p/10421659.html

你可能感兴趣的文章
.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计
查看>>
.NET服务安装、卸载、启动、停止、判断是否存在
查看>>
基于深度学习的推荐系统综述 (arxiv 1707.07435) 译文第一、二章
查看>>
自定义抖动表单
查看>>
vue的组件通信
查看>>
iOS开发之让列表滚回最顶端最佳实践
查看>>
让开发变得更简单 | 阿里云中间件推出全新开发者服务
查看>>
HTML与CSS布局技巧总结
查看>>
elk(日志监控系统搭建),elastic search,kibana,logstash,filebeat搭建
查看>>
现场剪光缆!ATEC上支付宝模拟自断一半服务器,26秒一切恢复正常
查看>>
世界上最流行的编程语言恰恰也是大多数黑客的首选武器
查看>>
hadoop,spark,Zookeeper,,, 这些名字都是怎么来的呢?
查看>>
(5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
查看>>
“六面魔方”里的浪潮
查看>>
聚焦理论—《可以量化的管理学》
查看>>
如何给网站配置SSL证书(https)
查看>>
学习导航
查看>>
独家 | 如何改善你的训练数据集?(附案例)
查看>>
Linux学习(十):查看文件系统(dumpe2fs)
查看>>
用SQL命令查看Mysql数据库大小
查看>>