资源简介
sha3 512 hash 算法 python正确实现 ,内含各种sha3 keccak 官方文档和代码,收集和写代码花费了巨大精力,走了不少弯路
自己写代码不容易,请尊重原作者
下面给出一些实例用于检验:
哈希('')='a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'
hash('123456')='64d09d9930c8ecf79e513167a588cb75439b762ce8f9b22ea59765f32aa74ca19d2f1e97dc922a3d4954594a05062917fb24d1f8e72f2ed02a58ed7534f94d27'
sha3('我加密成功了')='d73ce7502406782345ff4f00133acee8eacde2fc7d6522bd6489f94c28b1e7e0837967ff36b9555e2d4eed547c7df4676f2035cd05ed0be3f79da14f9f0d1e68'
可以用 python3.6 自带 hashlib 库检验
注:代码直接运行即可
代码片段和文件信息
“““
Author: John
sha3 哈希加密算法,不可逆
Keccak算法,sha家族最新算法,采用的不同于 MD(如md5) 结构的海绵结构(sponge结构),使常用于攻击 MD 结构的手段难以进行
增强了算法安全性
successfully!!! 任意加密均可
FIPS 202 - SHA-3 Standard
https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/example-values
关于 sha3 的例子
主要过程是:明文转换成 16 进制,再转换成 2 进制,因为 utf8 编码明文后成 16 进制形式后,明文比特数至少是 4 的倍数,所以填充明文首先加 16 进制 06
然后,末尾加 80 中间填充 0,然后进行小端转换,再进行加密;
加密主函数中每组明文,首轮加密前进行二维数组矩阵转置,之后进行 Round 函数加密,然后最后一轮加密后,再进行矩阵转置,相当于每组明文加密转置了两次,
或者某种程度上可以说没转置;
全部加密完成后,再进行小端转换得 sha3 hash 值。
注:1、最新 sha3 加密过程,并不包含 1 字节中 高位在后,低位在前 的规则,如果非要说由此规则,那就是填充时末尾加16进制 80
2、小端转换是 8 字节,类似于 C语言 long 类型转换
3、假如填充完一组明文后(明文总共一组 r-8 bit 明文,那么填充后明文后,需加 16 进制 86 此处是重点*******)
“““
import hashlib
import binascii as ba
import math
‘‘‘
A 三维空间分布如下:
x 轴为一行(row)5 bit,y 轴为一列(column)5 bit,z 轴为一道(lane) 64 bit,xoy 面为一片(slice),yoz 面为一板(sheet),xoz 面为一面(plane)
θ变换是将每比特附近的两列(column)的和叠加到该比特上,x和y的坐标都是模5的
θ变换是线性的,主要是为了达到扩散效果,θ变换在所有方向上均是不变体转换,若没有θ变换,Keccak-f的轮函数将无法提供有效的扩散效果
(扩散的意思是让每一个数据都沾染临近两列的血,对最后生成的hash值有初始明文每个字符都参与生成此hash值的感觉)
θ变换的影响可以描述为:将三维数组A[x][y][z]中的每个比特逐位与相邻的两列(column)异或,即A[x-1][·][z]和A[x+1][·][z-1]
θ变换
*****本算法采用二维数组表示,将 z 轴一道合为一个元素,但基本思想一致
‘‘‘
# 模拟常量的假变量区
W = 64
‘‘‘
步骤ρ包含一个lane(道)内部的转换(即循环道内移位),目的是为提供一个slice(片)内部的离差
以下是移位表:x 为 x 轴 ,y 为 y 轴,表中为 z 轴数据移位位数
x=0 1 2 3 4
y=0 0 1 62 28 27
1 3644 6 55 20
2 310 43 25 39
3 4145 15 21 8
4 18 2 61 56 14
下面的 ρ 步骤中,P 中 x y 与上表不同的原因,可能是 (x1y1)T=M**(-1)(xy)T
把 (xy)T 的 M**-1 的这个函数的值--(x+3yx)T赋值给 (x1y1)T 的时候x y 相当于互换了
‘‘‘
P=[[0 36 3 41 18]
[1 44 10 45 2]
[62 6 43 15 61]
[28 55 25 21 56]
[27 20 39 8 14]]
‘‘‘
π变换是一个在坐标(x y)上的线性操作,变换如下所示:
变换π是一个lane上的平移,具体是移动整个道和另一个道(一维位置)的交换即各道互相交换。
π变换其实就是调换lanes上的各元素位置,以提供长期的扩散效应,若没有这一变换,Keccak-f将展现出周期性的踪迹。
它在GF(2)上将lanes中原来的位置通过一个2×2的矩阵变换到另一个位置上
(00)位置不变。π在片上的操作是相互独立的,它也只是一个z轴上的不变体转换
‘‘‘
‘‘‘
χ变换是Keccak-f中唯一的非线性映射,变换如下所示:
其中“NOT”表示非运算,“AND“表示与运算
没有χ变换,Keccak-f轮函数将变成线性。它可以被看成并行应用5w个S盒处理5-bit的各行。
χ变换在所有方向上均是不变体转换。它的代数阶为2。这对于扩散来说至关重要。
同时它仅用到了异或,与以及非三个简单的门操作
‘‘‘
‘‘‘
τ变换
τ变换很简单,就是加上一个轮常数,目的是为了破坏原有对称性,
失去它,轮函数将仅在 z 轴方向上时不变体转换,且所有 Keccak-f 的轮变换都将无法抵抗类攻击,如滑块攻击。
在硬件实现时,变换仅需要一些异或门和生成一些线性移位寄存器即可。
轮常数为 RC
‘‘‘
RC = [0x0000000000000001 0x0000000000008082 0x800000000000808A 0x8000000080008000 0x000000000000808B
0x0000000080000001 0x8000000080008081 0x8000000000008009 0x000000000000008A 0x0000000000000088
0x0000000080008009 0x000000008000000A 0x000000008000808B 0x800000000000008B 0x8000000000008089
0x8000000000008003 0x8000000000008002 0x8000000000000080 0x000000000000
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3159 2015-09-23 20:44 收集\CompactFIPS202-test.py
文件 3890 2015-09-23 20:51 收集\CompactFIPS202.py
文件 694 2018-05-16 13:57 收集\demo_KeccakF.py
文件 3278 2015-08-11 00:04 收集\demo_TestVectors.py
文件 14479 2018-05-18 00:07 收集\Keccak.py
文件 6352 2015-10-15 20:42 收集\ReadMe.txt
文件 596468 2018-05-16 00:34 收集\sha3\Keccak-implementation-3.1.pdf
文件 1459683 2018-05-17 00:13 收集\sha3\NIST.FIPS.202.pdf
文件 197021 2018-05-17 00:28 收集\sha3\SHA3-512_1600.pdf
文件 197740 2018-05-17 00:28 收集\sha3\SHA3-512_1605.pdf
文件 197963 2018-05-17 00:28 收集\sha3\SHA3-512_1630.pdf
文件 74681 2018-05-17 00:28 收集\sha3\SHA3-512_Msg0.pdf
文件 74781 2018-05-17 00:28 收集\sha3\SHA3-512_Msg30.pdf
文件 74897 2018-05-17 00:28 收集\sha3\SHA3-512_Msg5.pdf
文件 322 2018-05-17 18:38 收集\sha3.py
文件 0 2018-05-16 13:58 收集\__init__.py
文件 17584 2018-06-06 17:31 sha3.py
目录 0 2018-06-06 18:47 收集\sha3
目录 0 2018-06-06 18:49 收集
----------- --------- ---------- ----- ----
2922992 19
评论
共有 条评论