精易论坛
标题: blake2s 纯翻译源码 看都没有纯易得 分享一下 [打印本页]
作者: sykm5188 时间: 2023-6-14 23:55
标题: blake2s 纯翻译源码 看都没有纯易得 分享一下
blake2s 纯翻译源码 看都没有纯易得 分享一下
只翻译完成了 2S 算法 纯易2B 算法 在路上
blake2s.e
(27.79 KB, 下载次数: 25)
BLAKE2
https://blake2.net/
https://tools.ietf.org/html/rfc7693
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 字节的摘要。
二者的衍生版 BLAKE2bp 和 BLAKE2sp 可以进行多核并行计算,在保持相同安全性的前提下,进一步提升计算速度。
此外,BLAKE2 系列有一个特殊的变种,BLAKE2x,可以生成最多 4GiB 的“摘要”,可以用于 KDF(密钥派生)和 DRBG(固定随机数序列)。
WhatsApp 和 FreeBSD 的包管理器都在使用 BLAKE2 系列哈希算法。
距 2008 年初代 BLAKE 算法获得 NIST 认可具有 SHA-3 同级别安全性已经过去了将近 10 年, BLAKE2 也已经成熟,或许能成为 SHA-2/3 之外的一个不错的选择。
作者: 汇编代码 时间: 2023-6-15 01:16
.版本 2
.程序集 blake2b类, , 公开
.程序集变量 blake2b_v_, 长整数型, , "0"
.程序集变量 blake2b_w_, 字节型, , "0"
.程序集变量 blake2b_y_, 长整数型, , "0"
.程序集变量 blake2b_U_, 长整数型, , "0"
.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
blake2b_v_ = { 4089235720, 1779033703, 2227873595, 3144134277, 4271175723, 1013904242, 1595750129, 2773480762, 2917565137, 1359893119, 725511199, 2600822924, 4215389547, 528734635, 327033209, 1541459225 }
blake2b_w_ = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6, 22, 16, 24, 0, 10, 4, 30, 26, 20, 28, 6, 12, 14, 2, 18, 8, 14, 18, 6, 2, 26, 24, 22, 28, 4, 12, 10, 20, 8, 0, 30, 16, 18, 0, 10, 14, 4, 8, 20, 30, 28, 2, 22, 24, 12, 16, 6, 26, 4, 24, 12, 20, 0, 22, 16, 6, 8, 26, 14, 10, 30, 28, 2, 18, 24, 10, 2, 30, 28, 26, 8, 20, 0, 14, 12, 6, 18, 4, 16, 22, 26, 22, 14, 28, 24, 2, 6, 18, 10, 0, 30, 8, 16, 12, 4, 20, 12, 30, 28, 18, 22, 6, 0, 16, 24, 4, 26, 14, 2, 8, 20, 10, 20, 4, 16, 8, 14, 12, 2, 10, 30, 22, 18, 28, 6, 24, 26, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6 }
重定义数组 (blake2b_y_, 假, 32)
重定义数组 (blake2b_U_, 假, 32)
.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
.子程序 blake2b, 字节集, 公开
.参数 data, 字节集
.参数 len, 整数型, , 提取长度
.参数 salt, 字节集, 可空, 盐值
返回 (blake2b_b (data, salt, len))
.子程序 blake2bHex, 文本型, 公开
.参数 data, 字节集
.参数 len, 整数型, , 提取长度
.参数 salt, 字节集, 可空, 盐值
返回 (bin2hex_ (blake2b_b (data, salt, len), 真))
.子程序 blake2bInit, blake2b数据类型
.参数 n, 整数型, , 0 < length <= 64
.参数 t, 字节集, , 0 < length <= 64
返回 (blake2b_f (n, t))
.子程序 blake2bUpdate
.参数 n, blake2b数据类型, 参考
.参数 t, 字节集
blake2b_l (n, t)
.子程序 blake2bFinal, 字节集
.参数 n, blake2b数据类型
返回 (blake2b_h (n))
.子程序 blake2b_o, 长整数型
.参数 n, 字节型, 数组
.参数 t, 整数型, , 0开始
.局部变量 tindex, 整数型
.局部变量 a, 长整数型
.局部变量 b, 长整数型
.局部变量 c, 长整数型
.局部变量 d, 长整数型
' function o(n, t) {
' return n[t] ^ n[t + 1] << 8 ^ n[t + 2] << 16 ^ n[t + 3] << 24
' }
tindex = t + 1
a = n [tindex]
b = 左移L (n [tindex + 1], 8)
c = 左移L (n [tindex + 2], 16)
d = 左移L (n [tindex + 3], 24)
' 调试输出 (a, b, c, d)
返回 (位与L (位异或L (位异或L (位异或L (a, b), c), d), 4294967295))
.子程序 blake2b_t
.参数 n, 长整数型, 参考 数组
.参数 t, 整数型
.参数 o, 长整数型
.参数 u, 长整数型
.局部变量 tindex, 整数型
.局部变量 c, 长整数型
.局部变量 f, 长整数型
' function t(n, t, o, u) {
' var c = n[t] + o;
' o < 0 && (c += 4294967296);
' var f = n[t + 1] + u;
' c >= 4294967296 && f++,
' n[t] = c,
' n[t + 1] = f
' }
tindex = t + 1
c = 加法_64 (n [tindex], o)
.如果真 (o < 0)
c = 加法_64 (c, 4294967296)
.如果真结束
f = 加法_64 (n [tindex + 1], u)
.如果真 (c ≥ 4294967296)
f = 加法_64 (f, 1)
.如果真结束
n [tindex] = 位与L (c, 4294967295)
n [tindex + 1] = 位与L (f, 4294967295)
.子程序 blake2b_n
.参数 n, 长整数型, 参考 数组
.参数 t, 整数型
.参数 o, 整数型
.局部变量 tindex, 整数型
.局部变量 oindex, 整数型
.局部变量 u, 长整数型
.局部变量 c, 长整数型
' function n(n, t, o) {
' var u = n[t] + n[o]
' , c = n[t + 1] + n[o + 1];
' u >= 4294967296 && c++,
' n[t] = u,
' n[t + 1] = c
' }
tindex = t + 1
oindex = o + 1
u = 加法_64 (n [tindex], n [oindex])
c = 加法_64 (n [tindex + 1], n [oindex + 1])
.如果真 (u ≥ 4294967296)
c = 加法_64 (c, 1)
.如果真结束
n [tindex] = 位与L (u, 4294967295)
n [tindex + 1] = 位与L (c, 4294967295)
.子程序 blake2b_l
.参数 n, blake2b数据类型, 参考
.参数 t, 字节集
.局部变量 o, 整数型
' function l(n, t) {
' for (var o = 0; o < t.length; o++)
' 128 === n.c && (n.t += n.c,
' c(n, !1),
' n.c = 0),
' n.b[n.c++] = t[o]
' }
.计次循环首 (取字节集长度 (t), o)
.如果真 (128 = n.c)
n.t = n.t + n.c
blake2b_c (n, 假)
n.c = 0
.如果真结束
n.b [n.c + 1] = t [o]
n.c = n.c + 1
.计次循环尾 ()
.子程序 blake2b_c
.参数 n, blake2b数据类型, 参考
.参数 t, 逻辑型
.局部变量 c, 整数型
' function c(n, t) {
' var c = 0;
' for (c = 0; c < 16; c++)
' y[c] = n.h[c],
' y[c + 16] = v[c];
' for (y[24] = y[24] ^ n.t,
' y[25] = y[25] ^ n.t / 4294967296,
' t && (y[28] = ~y[28],
' y[29] = ~y[29]),
' c = 0; c < 32; c++)
' U[c] = o(n.b, 4 * c);
' for (c = 0; c < 12; c++)
' u(0, 8, 16, 24, w[16 * c + 0], w[16 * c + 1]),
' u(2, 10, 18, 26, w[16 * c + 2], w[16 * c + 3]),
' u(4, 12, 20, 28, w[16 * c + 4], w[16 * c + 5]),
' u(6, 14, 22, 30, w[16 * c + 6], w[16 * c + 7]),
' u(0, 10, 20, 30, w[16 * c + 8], w[16 * c + 9]),
' u(2, 12, 22, 24, w[16 * c + 10], w[16 * c + 11]),
' u(4, 14, 16, 26, w[16 * c + 12], w[16 * c + 13]),
' u(6, 8, 18, 28, w[16 * c + 14], w[16 * c + 15]);
' for (c = 0; c < 16; c++)
' n.h[c] = n.h[c] ^ y[c] ^ y[c + 16]
' }
.计次循环首 (16, c)
blake2b_y_ [c] = n.h [c]
blake2b_y_ [c + 16] = blake2b_v_ [c]
.计次循环尾 ()
blake2b_y_ [24 + 1] = 位与L (位异或L (blake2b_y_ [24 + 1], n.t), 4294967295)
blake2b_y_ [25 + 1] = 位与L (位异或L (blake2b_y_ [25 + 1], n.t \ 4294967296), 4294967295)
.如果真 (t = 真)
blake2b_y_ [28 + 1] = 位与L (位取反L (blake2b_y_ [28 + 1]), 4294967295)
blake2b_y_ [29 + 1] = 位与L (位取反L (blake2b_y_ [29 + 1]), 4294967295)
.如果真结束
.计次循环首 (32, c)
blake2b_U_ [c] = blake2b_o (n.b, 4 × (c - 1))
.计次循环尾 ()
.计次循环首 (12, c)
blake2b_u (0, 8, 16, 24, blake2b_w_ [16 × (c - 1) + 0 + 1], blake2b_w_ [16 × (c - 1) + 1 + 1])
blake2b_u (2, 10, 18, 26, blake2b_w_ [16 × (c - 1) + 2 + 1], blake2b_w_ [16 × (c - 1) + 3 + 1])
blake2b_u (4, 12, 20, 28, blake2b_w_ [16 × (c - 1) + 4 + 1], blake2b_w_ [16 × (c - 1) + 5 + 1])
blake2b_u (6, 14, 22, 30, blake2b_w_ [16 × (c - 1) + 6 + 1], blake2b_w_ [16 × (c - 1) + 7 + 1])
blake2b_u (0, 10, 20, 30, blake2b_w_ [16 × (c - 1) + 8 + 1], blake2b_w_ [16 × (c - 1) + 9 + 1])
blake2b_u (2, 12, 22, 24, blake2b_w_ [16 × (c - 1) + 10 + 1], blake2b_w_ [16 × (c - 1) + 11 + 1])
blake2b_u (4, 14, 16, 26, blake2b_w_ [16 × (c - 1) + 12 + 1], blake2b_w_ [16 × (c - 1) + 13 + 1])
blake2b_u (6, 8, 18, 28, blake2b_w_ [16 × (c - 1) + 14 + 1], blake2b_w_ [16 × (c - 1) + 15 + 1])
.计次循环尾 ()
.计次循环首 (16, c)
n.h [c] = 位与L (位异或L (位异或L (n.h [c], blake2b_y_ [c]), blake2b_y_ [c + 16]), 4294967295)
.计次循环尾 ()
.子程序 blake2b_u
.参数 o, 整数型
.参数 u, 整数型
.参数 c, 整数型
.参数 f, 整数型
.参数 l, 整数型
.参数 h, 整数型
.局部变量 b, 长整数型
.局部变量 v, 长整数型
.局部变量 w, 长整数型
.局部变量 A, 长整数型
.局部变量 p, 长整数型
.局部变量 k, 长整数型
' function u(o, u, c, f, l, h) {
' var b = U[l]
' , v = U[l + 1]
' , w = U[h]
' , A = U[h + 1];
' n(y, o, u),
' t(y, o, b, v);
' var p = y[f] ^ y[o]
' , k = y[f + 1] ^ y[o + 1];
' y[f] = k,
' y[f + 1] = p,
' n(y, c, f),
' p = y[u] ^ y[c],
' k = y[u + 1] ^ y[c + 1],
' y[u] = p >>> 24 ^ k << 8,
' y[u + 1] = k >>> 24 ^ p << 8,
' n(y, o, u),
' t(y, o, w, A),
' p = y[f] ^ y[o],
' k = y[f + 1] ^ y[o + 1],
' y[f] = p >>> 16 ^ k << 16,
' y[f + 1] = k >>> 16 ^ p << 16,
' n(y, c, f),
' p = y[u] ^ y[c],
' k = y[u + 1] ^ y[c + 1],
' y[u] = k >>> 31 ^ p << 1,
' y[u + 1] = p >>> 31 ^ k << 1
' }
b = blake2b_U_ [l + 1]
v = blake2b_U_ [l + 1 + 1]
w = blake2b_U_ [h + 1]
A = blake2b_U_ [h + 1 + 1]
blake2b_n (blake2b_y_, o, u)
blake2b_t (blake2b_y_, o, b, v)
p = 位异或L (blake2b_y_ [f + 1], blake2b_y_ [o + 1])
k = 位异或L (blake2b_y_ [f + 1 + 1], blake2b_y_ [o + 1 + 1])
blake2b_y_ [f + 1] = 位与L (k, 4294967295)
blake2b_y_ [f + 1 + 1] = 位与L (p, 4294967295)
blake2b_n (blake2b_y_, c, f)
p = 位异或L (blake2b_y_ [u + 1], blake2b_y_ [c + 1])
k = 位异或L (blake2b_y_ [u + 1 + 1], blake2b_y_ [c + 1 + 1])
blake2b_y_ [u + 1] = 位与L (位异或L (右移L (p, 24), 左移L (k, 8)), 4294967295)
blake2b_y_ [u + 1 + 1] = 位与L (位异或L (右移L (k, 24), 左移L (p, 8)), 4294967295)
blake2b_n (blake2b_y_, o, u)
blake2b_t (blake2b_y_, o, w, A)
p = 位异或L (blake2b_y_ [f + 1], blake2b_y_ [o + 1])
k = 位异或L (blake2b_y_ [f + 1 + 1], blake2b_y_ [o + 1 + 1])
blake2b_y_ [f + 1] = 位与L (位异或L (右移L (p, 16), 左移L (k, 16)), 4294967295)
blake2b_y_ [f + 1 + 1] = 位与L (位异或L (右移L (k, 16), 左移L (p, 16)), 4294967295)
blake2b_n (blake2b_y_, c, f)
p = 位异或L (blake2b_y_ [u + 1], blake2b_y_ [c + 1])
k = 位异或L (blake2b_y_ [u + 1 + 1], blake2b_y_ [c + 1 + 1])
blake2b_y_ [u + 1] = 位与L (位异或L (右移L (k, 31), 左移L (p, 1)), 4294967295)
blake2b_y_ [u + 1 + 1] = 位与L (位异或L (右移L (p, 31), 左移L (k, 1)), 4294967295)
.子程序 blake2b_h, 字节集
.参数 n, blake2b数据类型, 参考
.局部变量 t, 字节型, , "0"
.局部变量 o, 整数型
.局部变量 q, 长整数型
' function h(n) {
' for (n.t += n.c; n.c < 128; )
' n.b[n.c++] = 0;
' c(n, !0);
' for (var t = new Uint8Array(n.outlen), o = 0; o < n.outlen; o++)
' t[o] = n.h[o >> 2] >> 8 * (3 & o);
' return t
' }
n.t = n.t + n.c
.判断循环首 (n.c < 128)
n.b [n.c + 1] = 0
n.c = n.c + 1
.判断循环尾 ()
blake2b_c (n, 真)
重定义数组 (t, 假, n.outlen)
.计次循环首 (n.outlen, o)
q = 右移L (n.h [右移L (o - 1, 2) + 1], 8 × 位与L (3, o - 1))
t [o] = 取字节集数据 (到字节集 (q), #字节型, 1)
.计次循环尾 ()
返回 (到字节集 (t))
.子程序 blake2b_f, blake2b数据类型
.参数 n, 整数型, , 0 < length <= 64
.参数 t, 字节集, , 0 < length <= 64
.局部变量 o, blake2b数据类型
.局部变量 u, 整数型
.局部变量 c, 整数型
' function f(n, t) {
' if (0 === n || n > 64)
' throw new Error('Illegal output length, expected 0 < length <= 64');
' if (t && t.length > 64)
' throw new Error('Illegal key, expected Uint8Array with 0 < length <= 64');
' for (var o = {
' b: new Uint8Array(128),
' h: new Uint32Array(16),
' t: 0,
' c: 0,
' outlen: n
' }, u = 0; u < 16; u++)
' o.h[u] = v[u];
' var c = t ? t.length : 0;
' return o.h[0] ^= 16842752 ^ c << 8 ^ n,
' t && (l(o, t),
' o.c = 128),
' o
' }
.如果真 (0 = n 或 n > 64)
返回 (o)
.如果真结束
.如果真 (取数组成员数 (t) > 0 且 取数组成员数 (t) > 64)
返回 (o)
.如果真结束
o.outlen = n
.计次循环首 (16, u)
o.h [u] = blake2b_v_ [u]
.计次循环尾 ()
c = 选择 (取数组成员数 (t) > 0, 取数组成员数 (t), 0)
o.h [1] = 位异或L (o.h [1], 位异或L (位异或L (16842752, 左移L (c, 8)), n))
.如果真 (取数组成员数 (t) > 0)
blake2b_l (o, t)
o.c = 128
.如果真结束
返回 (o)
.子程序 blake2b_b, 字节集
.参数 n, 字节集, 参考
.参数 t, 字节集
.参数 o, 整数型
.局部变量 u, blake2b数据类型
' function b(n, t, o) {
' o = o || 64,
' n = r(d[0]).normalizeInput(n);
' var u = f(o, t);
' return l(u, n),
' h(u)
' }
o = 选择 (o > 0, o, 64)
u = blake2b_f (o, t)
blake2b_l (u, n)
返回 (blake2b_h (u))
作者: pipicool 时间: 2023-6-15 05:51
学习一下
作者: 396384183 时间: 2023-6-15 08:25
学习一下
作者: 一指温柔 时间: 2023-6-15 08:41
学习一下
作者: 光影魔术 时间: 2023-6-15 09:01
感谢分享
作者: crossdiy 时间: 2023-6-15 09:15
感谢分享
作者: 渁煑渔 时间: 2023-6-15 13:02
这个只有加密,有解密吗
作者: sykm5188 时间: 2023-6-15 15:55
这是哈希算法,不能被逆推
作者: mitu520 时间: 2023-6-15 15:58
感谢分享
感谢分享
作者: yangdoudou 时间: 2023-6-16 07:44
给楼主点赞或评分打赏,让楼主更有动力创作优秀内容!
作者: 就是你了 时间: 2023-6-16 08:33
学习一下
作者: 一指温柔 时间: 2023-6-16 08:48
学习一下
作者: 亿万 时间: 2023-6-17 21:20
开源精神必须支持~
作者: 精易论坛龙 时间: 2023-6-18 19:49
学习一下
作者: fengyishen 时间: 2023-6-18 20:32
为什么我打开源码没有那个背景,差评。都不发完整!
作者: sykm5188 时间: 2023-6-19 01:45
我自己扣的专属背景
欢迎光临 精易论坛 (https://125.confly.eu.org/) |
Powered by Discuz! X3.4 |