参考: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, )
//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 := ; n < ; 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 :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :

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 := ; n < ; 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() { //对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 

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

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

返回:

bogon:~ user$ go run testGo.go
// :: crypto/rand: prime size must be at least -bit
exit status

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, )
//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=
}

go标准库的学习-crypto/rand的更多相关文章

  1. go标准库的学习-crypto/md5

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...

  2. go标准库的学习-crypto/sha1

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...

  3. go标准库的学习-crypto/sha256

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...

  4. go标准库的学习-crypto/des

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/des" des包实现了DES标准和TDEA算法,参见U.S. Fed ...

  5. go标准库的学习-crypto/aes

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...

  6. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  7. go标准库的学习-database/sql

    参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

  8. python 标准库基础学习之开发工具部分1学习

    #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

  9. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

随机推荐

  1. 初始mvc4(一) 新建项目

    mvc4和mvc4.5基本大同小异,vs2012中已经集成了mvc,不需要手动安装了,现在就来看看如何新建mvc项目 一.首先打开vs2012,新建项目,选中web中mvc4 二.选择项目模板 这里面 ...

  2. C#关键字的使用

    params object[] 用于函数多参数的定义 public static void Write(string format, params object[] arg);   explicit  ...

  3. T-SQL:事务锁下的并发处理(十五)

    1.事务 在sql  servce 中 事务是一个工作单元 可能包含查询和修改数据以及修改数据定义等多个活动 也可以显示或隐式定义事务边界 显示定义事务 BEGIN TRAN 开始  如果要提交事务 ...

  4. TCP/IP 详解

    分层 每一层负责不同的功能:     链路层 有时也称作数据链路层或网络接口层, 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. ...

  5. Python入门到精通学习书籍推荐!

    1.Python基础教程(第2版 修订版)<Python基础教程(第2版修订版)>包括Python程序设计的方方面面,内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合 ...

  6. ImmediateFunc.js

    (function(){ var days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] var today = new Date() var msg = ...

  7. 【工具相关】Web--nodejs的安装

    一,从官网下载nodejs.org. https://nodejs.org/en/ 二,按照步骤一步一步安装就好.

  8. jsPlumb.jsAPI阅读笔记(官方文档翻译)

    jsPlumb DOCS 公司要开始做流程控制器,所以先调研下jsPlumb,下文是阅读jsPlumb提供的document所产生的归纳总结 setup 如果不使用jQuery或者类jQuery库,则 ...

  9. Android开发专业名词及工具概述

    前言: 系统的学习下Android开发中涉及到的一些专业名词 和Android开发工具 名词: 一.SDK(Software Development Kit) 软件开发工具包:一般都是一些软件工程师为 ...

  10. 云卡门禁安卓SDK_BLEDOOR_SDK_ANDROID_2016_12_15

    package com.bosk.bledoor.sdk; //sdk包的开门服务类,AndroidManifest.xml 必须注册 //<service //android:name=&qu ...