【发布时间】:2018-05-08 19:54:14
【问题描述】:
我正在尝试了解 FPGA 在 SHA1 散列方面的能力。
作为参考,SHA1 涉及执行一系列 32 位整数计算,按 80 个“步骤”排列;以下是算法中间的 4 个代表性步骤,用 C 语言:
x0 = rol(x13 ^ x8 ^ x2 ^ x0, 1);
e += rol(a,5) + (b^c^d) + x0 + 0x6ED9EBA1L;
b = rol(b,30);
x1 = rol(x14 ^ x9 ^ x3 ^ x1, 1);
c += rol(d,5) + (e^a^b) + x1 + 0x6ED9EBA1L;
e = rol(e,30);
x2 = rol(x13 ^ x10 ^ x4 ^ x2, 1);
b += rol(c,5) + (d^e^a) + x2 + 0x6ED9EBA1L;
d = rol(d,30);
x3 = rol(x13 ^ x11 ^ x5 ^ x3, 1)
a += rol(b,5) + (c^d^e) + x3 + 0x6ED9EBA1L;
c = rol(c,30);
共有 21 个内部 32 位变量,算法不断地将它们相互输入。 'rol' 是旋转移位(将位从一端移到另一端。)
现在,在我看来,计算 x13 ^ x11 ^ x5 ^ x3 需要 32 个 LUT,c^d^e 需要另外 32 个 LUT,我不清楚如何计算加法所需的资源,但我猜是 96 或 128 LUT。轮换和分配是通过互连完成的。所以,假设总共有 192 个 LUT,乘以 80 步,再加上一些开销。完全展开后,我预计约 16,000 个 LUT,每个时钟周期的吞吐量为 1 个输入块,延迟为 80 个时钟周期。 Xilinx Artix-7 XC7A50T 包含 8150 个切片,每个切片有 4 个 LUT,因此每个时钟周期的吞吐量为 2 个块,或 300 MHz 时为 600 Mhash/s(300 Gbps,因为每个块为 512 位。)这是合理的吗估计还是我走远了?
我找不到任何关于完全展开的 SHA1 实现的参考,但这些家伙 https://www.heliontech.com/fast_hash.htm 声称具有 828 个 LUT 和每 82 个时钟周期 1 个块的吞吐量的“非常高性能”实现,因此,更接近XC7A50T 上 70 Gbps。这个数字是不是因为没有展开就低很多?
【问题讨论】:
标签: fpga