BLAKE及BLAKE2算法详解

2023-10-14 11:50
文章标签 算法 详解 blake blake2

本文主要是介绍BLAKE及BLAKE2算法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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位哈希结果。算法核心变量如下:

 1 typedef struct
 2 {
 3   uint32_t h[8], s[4], t[2];
 4   int buflen, nullt;
 5   uint8_t  buf[64];
 6 } state256;
 7 
 8 typedef state256 state224;
 9 
10 typedef struct
11 {
12   uint64_t h[8], s[4], t[2];
13   int buflen, nullt;
14   uint8_t buf[128];
15 } state512;
16 
17 typedef state512 state384;
18 
19 const uint8_t sigma[][16] =
20 {
21   { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
22   {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
23   {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
24   { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
25   { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
26   { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
27   {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
28   {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
29   { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
30   {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 },
31   { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
32   {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
33   {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
34   { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
35   { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
36   { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }
37 };
38 
39 const uint32_t u256[16] =
40 {
41   0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
42   0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
43   0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
44   0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917
45 };
46 
47 const uint64_t u512[16] =
48 {
49   0x243f6a8885a308d3ULL, 0x13198a2e03707344ULL, 
50   0xa4093822299f31d0ULL, 0x082efa98ec4e6c89ULL,
51   0x452821e638d01377ULL, 0xbe5466cf34e90c6cULL, 
52   0xc0ac29b7c97c50ddULL, 0x3f84d5b5b5470917ULL,
53   0x9216d5d98979fb1bULL, 0xd1310ba698dfb5acULL, 
54   0x2ffd72dbd01adfb7ULL, 0xb8e1afed6a267e96ULL,
55   0xba7c9045f12c7f99ULL, 0x24a19947b3916cf7ULL, 
56   0x0801f2e2858efc16ULL, 0x636920d871574e69ULL
57 };
58 
59 
60 static const uint8_t padding[129] =
61 {
62   0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
63   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
64   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
65   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
67   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
68   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
69   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
70 };
blake

blake256核心计算过程如下:

 1 void blake256_compress( state256 *S, const uint8_t *block )
 2 {
 3   uint32_t v[16], m[16], i;
 4 #define ROT(x,n) (((x)<<(32-n))|( (x)>>(n)))
 5 #define G(a,b,c,d,e)          \
 6   v[a] += (m[sigma[i][e]] ^ u256[sigma[i][e+1]]) + v[b]; \
 7   v[d] = ROT( v[d] ^ v[a],16);        \
 8   v[c] += v[d];           \
 9   v[b] = ROT( v[b] ^ v[c],12);        \
10   v[a] += (m[sigma[i][e+1]] ^ u256[sigma[i][e]])+v[b]; \
11   v[d] = ROT( v[d] ^ v[a], 8);        \
12   v[c] += v[d];           \
13   v[b] = ROT( v[b] ^ v[c], 7);
14 
15   for( i = 0; i < 16; ++i )  m[i] = U8TO32_BIG( block + i * 4 );
16 
17   for( i = 0; i < 8; ++i )  v[i] = S->h[i];
18 
19   v[ 8] = S->s[0] ^ u256[0];
20   v[ 9] = S->s[1] ^ u256[1];
21   v[10] = S->s[2] ^ u256[2];
22   v[11] = S->s[3] ^ u256[3];
23   v[12] = u256[4];
24   v[13] = u256[5];
25   v[14] = u256[6];
26   v[15] = u256[7];
27 
28   /* don't xor t when the block is only padding */
29   if ( !S->nullt )
30   {
31     v[12] ^= S->t[0];
32     v[13] ^= S->t[0];
33     v[14] ^= S->t[1];
34     v[15] ^= S->t[1];
35   }
36 
37   for( i = 0; i < 14; ++i )
38   {
39     /* column step */
40     G( 0,  4,  8, 12,  0 );
41     G( 1,  5,  9, 13,  2 );
42     G( 2,  6, 10, 14,  4 );
43     G( 3,  7, 11, 15,  6 );
44     /* diagonal step */
45     G( 0,  5, 10, 15,  8 );
46     G( 1,  6, 11, 12, 10 );
47     G( 2,  7,  8, 13, 12 );
48     G( 3,  4,  9, 14, 14 );
49   }
50 
51   for( i = 0; i < 16; ++i )  S->h[i % 8] ^= v[i];
52 
53   for( i = 0; i < 8 ; ++i )  S->h[i] ^= S->s[i % 4];
54 }
blake256_compress

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

BLAKE-224("") =
7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed
BLAKE-256("") =
716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a
BLAKE-384("") =
c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706
BLAKE-512("") =
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-224("") =
1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4
BLAKE2s-256("") =
69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9
BLAKE2b-384("") =
b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100
BLAKE2b-512("") =
786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce

 4 应用

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

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

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

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

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

参考:

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

2 Blake web site

3 Blake2 web site

4 https://coinguides.org/

这篇关于BLAKE及BLAKE2算法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210310

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)