Hash SHA-3:根据FIPS-202实现θ函数未按预期运行

Hash SHA-3:根据FIPS-202实现θ函数未按预期运行,hash,verilog,sha-3,Hash,Verilog,Sha 3,我正在按照Verilog中的官方命令实现SHA-3。 我的状态由一维寄存器表示,我使用宏函数从文档中的(x,y,z)坐标计算相应的状态索引: A[x,y,z]=S[W(5y+x)+z],W=64(第9页) 我严格遵守了第11页的指南,并得出以下结论: // Macros for transforming dimensions `define sub_1(x) (x == 0 ? 4 : x - 1) `define add_1(x) (x == 4 ? 0 : x + 1) `define su

我正在按照Verilog中的官方命令实现SHA-3。 我的状态由一维寄存器表示,我使用宏函数从文档中的(x,y,z)坐标计算相应的状态索引:

A[x,y,z]=S[W(5y+x)+z]
W=64
(第9页)

我严格遵守了第11页的指南,并得出以下结论:

// Macros for transforming dimensions
`define sub_1(x) (x == 0 ? 4 : x - 1)
`define add_1(x) (x == 4 ? 0 : x + 1)
`define sub_1_W(x) (x == 0 ? (W - 1) : x - 1)
`define s(x,y,z) ((W * ((5 * y) + x)) + z)
`define s_xz(x,z) ((W * x) + z)

// Wires
wire [0:(1600 - 1)] absorbed_data, after_theta;
wire [0:((5 * 64) - 1)] C, D; 

genvar x, z;
for(x = 0; x < 5; x = x + 1) begin
    for(z = (W - 1); z >= 0; z = z - 1) begin
        // Step 1
        assign C[`s_xz(x,z)] = absorbed_data[`s(x,0,z)] ^ absorbed_data[`s(x,1,z)] ^ absorbed_data[`s(x,2,z)] ^ absorbed_data[`s(x,3,z)] ^ absorbed_data[`s(x,4,z)];
        // Step 2
        assign D[`s_xz(x,z)] = C[`s_xz(`sub_1(x),z)] ^ C[`s_xz(`add_1(x),`sub_1_W(z)];
    end
end    

genvar x, y, z;
generate
    for(x = 0; x < 5; x = x + 1) begin
        for(y = 0; y < 5; y = y + 1) begin
            for(z = 0; z < W; z = z + 1) begin
                // Step 3
                assign after_theta[`s(x,y,z)] = absorbed_data[`s(x,y,z)] ^ D[`s_xz(x,z)];
            end
        end
    end
endgenerate
D

as is: 00 00 00 00 00 00 00 00 | 06 00 00 00 00 00 01 00 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 80 | 0c 00 00 00 00 00 00 00
to be: 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 07 | 00 00 00 00 00 00 00 00 | 80 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 0c
首先,对于
C
,位顺序似乎不同,但不是在位级别上,而是在字节级别上(因为
06
保持
06
)。 其次,对于
D
我得到
0600。。01 00
而正确的结果应该是
00。。00 07
。这在我的实现中是不可能的,因为根据FIPS-202,
z
处的位只能移动一个位置(
(z-1)mod w


在这种情况下,
D
将产生正确的结果,因为
06^(80我想我找到了解决方案。
B.1的附录(从第26页开始)对此进行了描述。第25页给出了关于此主题的提示:

将十六进制字符串解释为SHA-3示例输入和输出的位字符串的约定不同于示例页面上其他函数的约定。第B.1节规定了十六进制字符串和SHA-3位字符串之间的转换函数。对于字节对齐消息,十六进制字符串SHA-3函数填充的特殊形式如第B.2节所述

关于如何回避这个问题,有一个很好的解释

as is: 00 00 00 00 00 00 00 00 | 06 00 00 00 00 00 01 00 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 80 | 0c 00 00 00 00 00 00 00
to be: 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 07 | 00 00 00 00 00 00 00 00 | 80 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 0c