blake2b

package
v0.0.0-...-fda1b34 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 24, 2022 License: Apache-2.0 Imports: 7 Imported by: 0

README

简介

BLAKE2 系列比常见的 MD5,SHA-1,SHA-2,SHA-3 更快,同时提供不低于 SHA-3 的安全性。

BLAKE2 系列从著名的 ChaCha 算法衍生而来,有两个主要版本 BLAKE2b(BLAKE2)和 BLAKE2s。

BLAKE2b 为 64 位 CPU(包括 ARM Neon)优化,可以生成最长64字节的摘要;BLAKE2s 为 8-32 位 CPU 设计,可以生成最长 32 字节的摘要。

说明

以下官方源码里的文件因为各种各样的原因,为了减少分析源码的工作量,就没有被分析:

  • 官方源码里的blake2b_amd64.go文件没有被分析,因为这个文件里的代码要求使用非gccgo编译器,而我自己电脑上的编译器恰恰就是gccgo
  • 官方源码里的blake2b_f_fuzz.go文件没有被分析,因为我的电脑里没有装go-fuzz
  • 官方源码里的blake2bAVX2_amd64.go文件没有被分析,因为这个文件里的代码要求使用非gccgo编译器,而我自己电脑上的编译器恰恰就是gccgo

使用方法

regesiter.go文件里将ethereum实现的blake2b哈希函数注册到了golang...\crypto.go里:

crypto.RegisterHash(crypto.BLAKE2b_256, newHash256)
crypto.RegisterHash(crypto.BLAKE2b_384, newHash384)
crypto.RegisterHash(crypto.BLAKE2b_512, newHash512)

以后如果想要使用blake2b_512,按照下面的方式来实例化哈希函数就可以了:

h := crypto.BLAKE2b_512.New()

实际上,上面代码段里的返回的h其实就是下面这个函数的返回结果:

func New512(key []byte) (hash.Hash, error) {
	return newDigest(Size, key)
}

但是请注意,这里返回的h其实是一个接口,它的底层是*digest,所以,想调用*digestMarshalBinary方法,就还得将h强制类型转换成*digest

同理,如果想要使用blake2b_384blake2b_256哈希函数,就分别按照下面的方法实例化哈希函数:

h := crypto.BLAKE2b_384.New()
h := crypto.BLAKE2b_256.New()

使用案例

我们分别实例化了blake2b_256blake2b_384blake2b_512三个哈希函数,然后分别对"ethereum"进行哈希运算,得到的哈希值长度和结果分别如下所示:

h256 := crypto.BLAKE2b_256.New()
bz256 := h256.Sum([]byte("ethereum"))
t.Log(h256.Size(), len(bz256), bz256)

h384 := crypto.BLAKE2b_384.New()
bz384 := h384.Sum([]byte("ethereum"))
t.Log(h384.Size(), len(bz384), bz384)

h512 := crypto.BLAKE2b_512.New()
bz512 := h512.Sum([]byte("ethereum"))
t.Log(h512.Size(), len(bz512), bz512)

输出:

32 40 [101 116 104 101 114 101 117 109 14 87 81 192 38 229 67 178 232 171 46 176 96 153 218 161 209 229 223 71 119 143 119 135 250 171 69 205 241 47 227 168]

48 56 [101 116 104 101 114 101 117 109 179 40 17 66 51 119 245 45 120 98 40 110 225 167 46 229 64 82 67 128 253 161 114 74 111 37 215 151 140 111 211 36 74 108 175 4 152 129 38 115 197 224 94 245 131 130 81 0]

64 72 [101 116 104 101 114 101 117 109 120 106 2 247 66 1 89 3 198 198 253 133 37 82 210 114 145 47 71 64 225 88 71 97 138 134 226 23 247 31 84 25 210 94 16 49 175 238 88 83 19 137 100 68 147 78 176 75 144 58 104 91 20 72 183 85 213 111 112 26 254 155 226 206]

Documentation

Index

Constants

View Source
const (
	// BlockSize 128字节,等于1024位
	BlockSize = 128
	// Size 64字节,等于512位,BLAKE2b-512的哈希长度
	Size = 64
	// Size384 48字节,等于384位,BLAKE2b-384的哈希长度
	Size384 = 48
	// Size256 32字节,等于256位,BLAKE2b-256的哈希长度
	Size256 = 32
)

定义一些常量

View Source
const (
	// OutputLengthUnknown 可以作为NewXOF的大小参数,表示输出的长度事先不知道。
	OutputLengthUnknown = 0
)

Variables

This section is empty.

Functions

func F

func F(h *[8]uint64, m [16]uint64, c [2]uint64, final bool, rounds uint32)

F ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

F F是BLAKE2b的一个压缩函数。它把状态向量`h`、信息块向量`m`、偏移计数器`t`、最终块指示标志`f`和 轮数`rounds`作为一个参数。作为第一个参数提供的状态向量被该函数修改。

func New

func New(size int, key []byte) (hash.Hash, error)

New ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

New 方法返回一个新的 hash.Hash 来计算具有自定义长度的 BLAKE2b 校验和。 该方法接受两个参数,第一个参数是一个int型的size,第二个参数是一个字节切片key,我们可以将其称为密钥, 其中size的值可以被设置为1到64中的任何一个整数,但强烈建议使用等于或大于以下的两个值:

  • 32:如果将size设为32,则可以将BLAKE2b作为哈希函数使用,然后key应当是nil的。
  • 16:如果将size设为16,则可以将BLAKE2b用作MAC函数,在这种情况下,key的长度应当介于16到64之间。

当key为nil时,返回的 hash.Hash 实现了 BinaryMarshaler 和 BinaryUnmarshaler。

func New256

func New256(key []byte) (hash.Hash, error)

New256 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

New256 方法接受一个字节切片key作为输入参数,返回一个新的 hash.Hash 来计算 BLAKE2b-256 校验和。当输入的key等于nil计算得到的哈希值变成一个MAC。key的长度必须在0到64字节之间。

func New384

func New384(key []byte) (hash.Hash, error)

New384 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

New384 方法接受一个字节切片key作为输入参数,返回一个新的 hash.Hash 来计算 BLAKE2b-384 校验和。当输入的key等于nil计算得到的哈希值变成一个MAC。key的长度必须在0到64字节之间。

func New512

func New512(key []byte) (hash.Hash, error)

New512 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

New512 方法接受一个字节切片key作为输入参数,返回一个新的 hash.Hash 来计算 BLAKE2b-512 校验和。当输入的key等于nil计算得到的哈希值变成一个MAC。key的长度必须在0到64字节之间。

func Sum256

func Sum256(data []byte) [Size256]byte

Sum256 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

Sum256 方法返回数据的 BLAKE2b-256 校验和。

func Sum384

func Sum384(data []byte) [Size384]byte

Sum384 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

Sum384 方法返回数据的 BLAKE2b-384 校验和。

func Sum512

func Sum512(data []byte) [Size]byte

Sum512 ♏ |作者:吴翔宇| 🍁 |日期:2022/11/16|

Sum512 方法返回数据的 BLAKE2b-512 校验和。

Types

type XOF

type XOF interface {
	// Writer 吸收更多的数据到哈希的状态中。如果在 "读 "之后调用它,就会出现恐慌。
	io.Writer
	// Reader 从哈希中读取更多的输出,如果达到极限,它将返回io.EOF。
	io.Reader
	// Clone 返回当前状态下的XOF的副本。
	Clone() XOF
	// Reset 将XOF重置成它的初始状态。
	Reset()
}

XOF ♏ |作者:吴翔宇| 🍁 |日期:2022/11/17|

XOF 定义了支持任意长度输出的哈希函数的接口。

func NewXOF

func NewXOF(size uint32, key []byte) (XOF, error)

NewXOF ♏ |作者:吴翔宇| 🍁 |日期:2022/11/17|

NewXOF 方法创建一个新的可变输出长度的哈希函数,这个哈希函数要么产生一个已知的字节数(1 <= size < 2**32-1)长度的值, 要么产生一个未知的字节数(size == OutputLengthUnknown)长度的值,在后一种情况下,适用256GiB的绝对限制。 NewXOF 方法接受两个参数,第一个参数为整数型的size,size就是前面提到的size,例如:(1 <= size < 2**32-1),另一个 参数是一个字节切片key,如果key非空的话,则会将哈希函数转换成MAC,密钥的长度必须在0到32字节之间。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL