go标准库的学习-crypto/rand

news/2024/11/9 21:31:30

参考: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 : 128
rand Int is : 25
max Int is : 129
rand Int is : 117
max Int is : 130
rand Int is : 85
max Int is : 131
rand Int is : 62
max Int is : 132
rand Int is : 27
max Int is : 133
rand Int is : 120
max Int is : 134
rand Int is : 10
max Int is : 135
rand Int is : 27
max Int is : 136
rand Int is : 11
max Int is : 137
rand Int is : 119
max Int is : 138
rand Int is : 35
max Int is : 139
rand 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 
3
7
13
31
53
109
223
439

如果位数小于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-bit
exit 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


http://www.niftyadmin.cn/n/3166411.html

相关文章

micropython按键控制流水灯_咸鱼Micropython—PyEd 循环流水灯

咸鱼Micropython—PyEd 循环流水灯流水灯这么写只能亮一次&#xff0c;我想重复这个效果怎么来呢&#xff1f;循环流水灯目标&#xff1a;初识变量及循环。从现在开始不做箭头标识了。我们要练练眼力了(手动滑稽)创建变量创建一个变量n&#xff0c;用来存储已经运行的次数&…

python企业微信调用_Python 结合企业微信告警脚本

#!/usr/bin/env python#-*- coding: utf-8 -*-import timeimport requestsimport jsonimport osimport tracebackimport loggingclassWeChat:def __init__(self):self.CORPID ww750dfdfde43613c3#企业ID&#xff0c;在管理后台获取self.CORPSECRET rCRzAXI-r7KUZ6uL5HZYYLaqQw2…

tlias 教学过程_全方位提升授课质量,传智专修学院让学生实现快速成长

在教育行业之内&#xff0c;一直都存在这样的话语&#xff0c;“一节课的授课质量&#xff0c;对学生的价值观塑造、能力培养&#xff0c;起着关键性的作用。”确实&#xff0c;课堂是孕育人才的重要平台&#xff0c;是传授理论知识的殿堂。倘若授课质量&#xff0c;受各种因素…

mysql root 被锁_mysql查看死锁和解除锁

解除正在死锁的状态有两种方法&#xff1a;第一种&#xff1a;1.查询是否锁表show OPEN TABLES where In_use > 0;2.查询进程(如果您有SUPER权限&#xff0c;您可以看到所有线程。否则&#xff0c;您只能看到您自己的线程)show processlist3.杀死进程id(就是上面命令的id列)…

无监督学习新突破!华为美研所提出自动编码变换网络AET

深度神经网络的成功往往依赖于大量有标记的样本数据&#xff0c;但是这样的数据在许多实际场景中很难获得。为了解决这一挑战&#xff0c;无监督学习是首选方法&#xff0c;即不使用任何标记数据训练神经网络。与传统的自动编码数据&#xff08;AED&#xff09;方法不同&#x…

python自动化定位元素的方法_基于python全局设置id 自动化测试元素定位的方法分享...

背景&#xff1a;在自动化化测试过程中&#xff0c;不方便准确获取页面的元素&#xff0c;或者在重构过程中方法修改造成元素层级改变&#xff0c;因此通过设置id准备定位。一、python准备工作&#xff1a;功能&#xff1a;用自动化的方式进行批量处理。 比如&#xff0c;你想要…

docker 13 dockerfile的保留字指令

Dockerfile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成的脚本。 构建三步骤&#xff1a;1、编写dockerfile文件&#xff1b;2、docker build&#xff1b;3、docker run dockerfile内容基础知识&#xff1a; 1、每条保留字指令必须为大写字母且后面要…

单片机移频防啸叫_JDS M-9108全自动高速移频反馈抑制器 会议鹅颈话筒麦克风防啸叫...

JDS M-9108全自动高速移频反馈抑制器 会议鹅颈话筒麦克风防啸叫的详细描述&#xff1a;产品型号&#xff1a;M-9108产品说明&#xff1a;超宽频响电路技术&#xff0c;频响达20HZ-20KHZ&#xff0c;改变了人们对移频器的失真看法&#xff0c;听感上已经很难分辨&#xff0c;且由…