【问题标题】:Are there in x86 any instructions to accelerate SHA (SHA1/2/256/512) encoding?x86 中是否有任何指令可以加速 SHA (SHA1/2/256/512) 编码?
【发布时间】:2014-01-08 15:39:36
【问题描述】:

一个例子,在x86 are Instruction Set to hardware acceleration AES。但是在 x86 中是否有任何指令可以加速 SHA(SHA1/2/256/512)编码,在 x86 上编码 SHA 的最快库是什么?

【问题讨论】:

  • 投票决定关闭的人肯定是搞错了?
  • 在即将到来的Skylake架构中会有这样的指令,称为Intel SHA Extensions
  • 让 SHA 变慢是一个特性,用这种方式破解它要困难得多。我们不可避免地会得到更多的比特。
  • @HansPassant 这是一个非常无知的评论,对于安全哈希算法来说,缓慢肯定不是一个好的特性。 SHA-3 候选者肯定是出于安全性和速度(以及最终与 SHA-2 的架构差异)而选择的,但输出位数与 SHA-2 完全相同。对于某些使用安全散列的算法,例如 PBKDF 用于密钥强化的某些算法可以使用慢速......

标签: c++ c cryptography x86 sha


【解决方案1】:

Intel has upcoming instructions 用于加速计算 SHA1 /256 哈希。

您可以阅读有关它们的更多信息,如何检测您的 CPU 是否支持它们以及如何使用它们here

(但不是 SHA-512,您仍然需要使用常规 SIMD 指令手动对其进行矢量化。AVX512 应该有助于 SHA-512(以及在具有 AVX512 但不是 SHA 扩展的 CPU 上的 SHA-1 / SHA-256) ,提供 SIMD 旋转和移位,例如 https://github.com/minio/sha256-simd)

希望英特尔的Skylake microarchitecture 拥有它们,但它没有。 Intel CPU 2016 年是低功耗Goldmont,然后是 2017 年 Goldmont Plus。Intel 第一个带有 SHA 扩展的主流 CPU 将是 Cannon Lake。 Skylake / Kaby Lake / Coffee Lake 没有。

AMD Ryzen (2017) 具有 SHA 扩展。

C/C++ 程序员可能最好使用OpenSSL,它将使用它可以快速散列的任何 CPU 功能。 (如果您的 OpenSSL 版本足够新,包括 CPU 上的 SHA 扩展。)

【讨论】:

  • 但请注意,这些说明正在添加到 Skylake 微架构中,预计要到 2015 年或 2016 年才能发布。
  • 现在 SHA-1 正在被淘汰 (googleonlinesecurity.blogspot.com/2014/09/…) 英特尔的新指令有点毫无意义......
  • SHA-1 仍然永久融入 Git 版本控制等系统中
  • SHA-1 仍然是启动过程的一部分(Windows 中的许多文件在安全启动过程中仅使用 SHA-1 进行签名和检查以获取 Authenticode,而不是 SHA-256)。对于最新版本的 Windows 10(包括 Insider 和 Enterprise 版本)仍然如此。加速它可以促进启动
  • 目前 TPM 2.0 中也不支持 SHA-3 用于 UEFI 引导。 TPM 1.2 不支持 SHA-2(与 UEFI 安全启动的新要求不兼容),它只能将 SHA-1 用于 TCL 测量日志(但仍用于必须使用 SHA-2 退出的聚合容器)跨度>
【解决方案2】:

x86 中是否有任何指令可以加速 SHA (SHA1/2/256/512) 编码?

现在是 2016 年 11 月,答案终于是肯定的。但它只有 SHA-1 和 SHA-256(以及扩展的 SHA-224)。

Intel CPUs with SHA extensions 最近上市。看起来支持它的处理器是Goldmont microarchitecture

  • 奔腾 J4205(台式机)
  • 奔腾 N4200(移动)
  • 赛扬 J3455(桌面)
  • 赛扬 J3355(桌面)
  • 赛扬 N3450(移动)
  • 赛扬 N3350(移动)

我查看了亚马逊提供的具有架构或处理器编号的机器,但我没有找到任何可用的(还)。我相信 HPAcer 有一台配备 Pentium N4200 的笔记本电脑预计将在 2016 年 11 月 2016 年 12 月上市,以满足测试需求。

有关为什么它只有 SHA-1、SHA-224 和 SHA-256 的一些技术细节,请参阅内核加密邮件列表上的 crypto: arm64/sha256 - add support for SHA256 using NEON instructions。简短的回答是,在 SHA-256 之上,事情不容易并行化。


您可以在Noloader GitHub | SHA-Intrinsics 找到英特尔 SHA 内在函数和 ARMv8 SHA 内在函数的源代码。它们是 C 源文件,并提供 SHA-1、SHA-224 和 SHA-256 的压缩功能。基于内在的实现将 SHA-1 的吞吐量提高了大约 3 倍到 4 倍,SHA-224 和 SHA-256 提高了大约 6 倍到 12 倍。

【讨论】:

  • 我在该链接中查找了有关 SHA-512 的讨论,但对“512”的文本搜索未找到任何内容。你说的是帖子的哪一部分?你可以用软件和普通的标量或 SIMD 整数指令(即这个补丁的大部分或全部)来做什么与英特尔可以在硬件中实现的功能相关吗?或者向量寄存器还不是 512b 宽相关的事实? (我真的不知道 SHA 是如何工作的。)
  • @Peter - 检查 Andy Polyakov 的 cmets。他在解释方面做得比我解释它要好得多。
  • 支持在 OpenSSL 中实现:see crypto/sha/asm/sha1-x86_64.pl
  • 对于那些询问的人,Andy Polyakov 的 cmets 位于 lore.kernel.org/linux-arm-kernel/…
【解决方案3】:

2019 年更新:

OpenSSL 在存在时确实使用硬件加速。

在 Intel 方面,Goldmont µarch 支持(Atom 系列),从Cannonlake(桌面/移动,10nm)开始支持 SHA-NI,Cascade Lake 服务器 CPU 和更早的 do not support 它。是的,由于存在并行 CPU/µarch 线,因此支持在时间线上是非线性的。

2017 年 AMD 发布了他们的 Zen µarch,因此当前所有基于 Zen 的服务器和桌面 CPU 都完全支持它。


我的OpenSSL speed SHA256 基准测试显示,在块大小为 8KiB 时速度提高了 550%。

对于加载到 RAM 的实际 1GB 和 5GB 文件,散列速度大约快 3 倍。

(在 Ryzen 1700 @ 3.6 GHz、2933CL16 RAM 上进行基准测试;OpenSSL:1.0.1 不支持 vs 1.1.1 支持)


与其他哈希函数比较的绝对值:

sha1   (1.55GHz):  721,1 MiB/s
sha256 (1.55GHz):  668.8 MiB/s
sha1   (3.8GHz) : 1977,9 MiB/s
sha256 (3.8GHz) : 1857,7 MiB/s

See this for details 直到有办法在 SO 上添加表格。


CPUID identification,第 298 页:EAX 中的 07h → EBX 位 29 == 1。

Intel's Instruction Set Reference,第 1264 页。

Agner Fog's Instruction tables 他对指令延迟/微操作等进行基准测试(目前 Zen、Goldmont、Goldmont Plus 可用)

代码示例,SIMD 比较:minio/sha256-simd

【讨论】:

【解决方案4】:

尝试一些开源的东西,例如OpenSSL 我亲自使用过他们的 MD5 散列函数,并且效果很好。 您可能还想看看hashlib2++

据我所知,英特尔还没有为 SHA-1 或 2 制定专用指令集。正如 CodesInChaos 在评论中指出的那样,它们可能会出现在即将到来的架构中。大多数哈希算法的主要组成部分是指令集中已经存在的 XOR 操作。

【讨论】:

猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多