首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙-3:根据FIPS-202履行Theta职能未按预期行事

沙-3:根据FIPS-202履行Theta职能未按预期行事
EN

Stack Overflow用户
提问于 2020-07-16 23:10:44
回答 1查看 163关注 0票数 2

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

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

我严格遵守第11页的指南,并提出如下建议:

代码语言:javascript
复制
// 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

我目前面临的问题似乎是在Theta函数中。例如,对于SHA-224和一个空消息应该会产生中间结果和最终输出,奇怪的是,我得到了相同的这份文件。 (06 00 ... 00 80),但是对于CD,得到了不同的值。

C

代码语言:javascript
复制
as is: 06 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 80 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00
to be: 00 00 00 00 00 00 00 06 | 00 00 00 00 00 00 00 00 | 80 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 00

D

代码语言:javascript
复制
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,我得到了06 00 .. 01 00,而正确的结果应该是00 .. 00 07。对于我的实现来说,这是不可能的,因为根据FIPS-202,z上的位只能被一个位置( (z - 1) mod w)移动。

在未来的情况下,D将产生正确的结果,因为06 ^ (80 << 1) = 07

最后,我要说,我的实现就像人们从FIPS-202中的定义中所期望的那样,对吗?

你知道我在这里做错什么了吗?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 18:10:26

我想我找到了解决办法。FIPS 202 B.1附录对此作了说明(从第26页开始)。关于这一主题的提示见第25页:

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

关于如何在cryptologie.net上绕过这个问题,有一个很好的解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62944813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档