1 简介

哈希算法 (Hash Algorithm) 是将任意长度的数据映射为固定长度数据的算法,也称为消息摘要。
一般情况下,哈希算法有两个特点:

  1. 原始数据的细微变化(比如一个位翻转)会导致结果产生巨大差距
  2. 运算过程不可逆,理论上无法从结果还原输入数据

因此,哈希算法主要用于数据完整性校验和加密/签名。而哈希算法的安全性就在于碰撞难易度,即已知结果,构建出具有相同结果的输入数据的难易度。

2 BLAKE

BLAKE算法于2008年提出,它包含两个版本,一种基于32位word用于产生最长256位的哈希结果,一种基于64位word用于产生最长512位的哈希结果,BLAKE算法核心操作是不断地将8个散列中间结果和16个输入word进行组合,从而产生下一轮组合的8个中间结果。按照最终截断的哈希长度,BLAKE-256和BLAKE-224使用32位字分别产生256位和224位的哈希结果(也称消息摘要),而BLAKE-512和BLAKE-384使用64位字并产生512位和384位哈希结果。算法核心变量如下:

 typedef struct
{
uint32_t h[], s[], t[];
int buflen, nullt;
uint8_t buf[];
} state256; typedef state256 state224; typedef struct
{
uint64_t h[], s[], t[];
int buflen, nullt;
uint8_t buf[];
} state512; typedef state512 state384; const uint8_t sigma[][] =
{
{ , , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{, , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , },
{ , , , , , , , , , , , , , , , }
}; const uint32_t u256[] =
{
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917
}; const uint64_t u512[] =
{
0x243f6a8885a308d3ULL, 0x13198a2e03707344ULL,
0xa4093822299f31d0ULL, 0x082efa98ec4e6c89ULL,
0x452821e638d01377ULL, 0xbe5466cf34e90c6cULL,
0xc0ac29b7c97c50ddULL, 0x3f84d5b5b5470917ULL,
0x9216d5d98979fb1bULL, 0xd1310ba698dfb5acULL,
0x2ffd72dbd01adfb7ULL, 0xb8e1afed6a267e96ULL,
0xba7c9045f12c7f99ULL, 0x24a19947b3916cf7ULL,
0x0801f2e2858efc16ULL, 0x636920d871574e69ULL
}; static const uint8_t padding[] =
{
0x80, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , ,
, , , , , , , , , ,
};

blake

blake256核心计算过程如下:

 void blake256_compress( state256 *S, const uint8_t *block )
{
uint32_t v[], m[], i;
#define ROT(x,n) (((x)<<(32-n))|( (x)>>(n)))
#define G(a,b,c,d,e) \
v[a] += (m[sigma[i][e]] ^ u256[sigma[i][e+]]) + v[b]; \
v[d] = ROT( v[d] ^ v[a],); \
v[c] += v[d]; \
v[b] = ROT( v[b] ^ v[c],); \
v[a] += (m[sigma[i][e+]] ^ u256[sigma[i][e]])+v[b]; \
v[d] = ROT( v[d] ^ v[a], ); \
v[c] += v[d]; \
v[b] = ROT( v[b] ^ v[c], ); for( i = ; i < ; ++i ) m[i] = U8TO32_BIG( block + i * ); for( i = ; i < ; ++i ) v[i] = S->h[i]; v[ ] = S->s[] ^ u256[];
v[ ] = S->s[] ^ u256[];
v[] = S->s[] ^ u256[];
v[] = S->s[] ^ u256[];
v[] = u256[];
v[] = u256[];
v[] = u256[];
v[] = u256[]; /* don't xor t when the block is only padding */
if ( !S->nullt )
{
v[] ^= S->t[];
v[] ^= S->t[];
v[] ^= S->t[];
v[] ^= S->t[];
} for( i = ; i < ; ++i )
{
/* column step */
G( , , , , );
G( , , , , );
G( , , , , );
G( , , , , );
/* diagonal step */
G( , , , , );
G( , , , , );
G( , , , , );
G( , , , , );
} for( i = ; i < ; ++i ) S->h[i % ] ^= v[i]; for( i = ; i < ; ++i ) S->h[i] ^= S->s[i % ];
}

blake256_compress

详细实现可参考网上开源代码,BLAKE源码:https://github.com/veorq/BLAKE四种算法对空字符串的哈希结果如下:

BLAKE-("") =
7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed
BLAKE-("") =
716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a
BLAKE-("") =
c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706
BLAKE-("") =
a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8

3 BLAKE2

BLAKE2算法基于BLAKE算法,于2012年被提出,BLAKE2不再向blake round函数中对输入字添加常量,修改了两个旋转常量及padding等,并在BLAKE2b(对应BLAKE-512)中将rounds的数量由16减少为12,在BLAKE2s(对应BLAKE-256)中将rounds数量由14减少为10,同样的,BLAKE2b产生1到64字节的消息摘要,BLAKE2s产生1到32字节的消息摘要,同时这两种算法也由对应的多核并行版本BLAKE2bp(4路并行)和BLAKE2sp(8路并行)。除了以上几种算法变种,BLAKE2还有一种BLAKE2x的变种,这种算法可以产生任意长度的消息摘要,详情请参考相应文档。除了安全性方面的优势,据称BLAKE2算法在Intel CPU第六代微处理架构(Skylake)中的处理速度要优于MD5,SHA-1,SHA-2和SHA-3等算法,如图所示:

BLAKE2源码可以参考:https://github.com/BLAKE2/BLAKE2,类似的,BLAKE2对空字符串的哈希结果如下:

BLAKE2s-("") =
1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4
BLAKE2s-("") =
69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9
BLAKE2b-("") =
b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100
BLAKE2b-("") =
786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce

4 应用

BLAKE系列算法被广泛应用于区块链数字货币领域,下面介绍3中典型数字货币:

1 decred
以blake256为核心哈希算法,其主页为:https://decred.org/

2 sia
以blake2b为核心哈希算法,其主页为:https://sia.tech/

3 verge
以blake2s为核心哈希算法,其主页为:https://vergecurrency.com/

至于具体哈希算法在各个币种应用细节,请参考相关钱包的源代码。

参考:

https://en.wikipedia.org/wiki/BLAKE_(hash_function)

2 Blake web site

3 Blake2 web site

https://coinguides.org/

BLAKE及BLAKE2算法详解的更多相关文章

  1. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  2. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  3. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  4. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  5. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  6. KMP算法详解(转自中学生OI写的。。ORZ!)

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  7. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...

  8. Tarjan算法详解

    Tarjan算法详解 今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识....在这里和大家分享一下... Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了, ...

  9. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

随机推荐

  1. www、数组的equals、接口和抽象类、装箱拆箱、final赋值

    目录 2019.12.31 刷题笔记 2019.12.31 刷题笔记 www www是World Wide Web的缩写 数组的equals 数组是一个对象,不同类型的数组具有不同的类.数组是一种引用 ...

  2. 单调栈and单调队列(此文太多坑了,以后再填)

    单调栈 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性,可能为单调递增,也可能为单调递减. 性质: 单调栈里的元素具有单调性 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 使用单调 ...

  3. 40)PHP,mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别

    分析: mysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回.每个结果的列储存在一个数组的单元中,偏移量从 开始. 注意, ...

  4. 吴裕雄--天生自然python学习笔记:python 用 Open CV抓取摄像头视频图像

    Open CV 除了可以读取.显示静态图片外 , 还可 以加载及播放动态影片, 以 及 读取内置或外接摄像头的图像信息 . 很多笔记本电脑都具有摄像头 , OpenCV 可通过 VideoC aptu ...

  5. 2018SEERC Points and Rectangles (CDQ分治)

    题:http://codeforces.com/gym/101964/problem/K 分析:https://blog.csdn.net/qq_43202683/article/details/98 ...

  6. python语法基础-网络编程-TCP协议和UDP协议

    ###############    网络编程    ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...

  7. 《C Prime Plus》第九节笔记

    第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...

  8. sql 日期表示

    今年时间 昨天,等于0表示今天 =month(时间对应列名) 上月

  9. Qt uchar * 转 QImage

    QImage(uchar * data, int width, int height, Format format) QImage(const uchar * data, int width, int ...

  10. Mac环境下安装Redis

    转自:http://www.jianshu.com/p/6b5eca8d908b -安装 下载安装包 redis-3.0.7.tar.gz 官网地址:http://redis.io/download ...