问题标签 [aes-ni]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - _mm_asimc_si128 未使用 MSVC 正确编译
我正在阅读 AES-NI 白皮书,并想通过基于英特尔提供的代码编写一个简单的演示程序来亲自尝试,但我得到了一些奇怪的结果。它在 Debug/Release x86 和 Debug x64 模式下工作,但我会在 Release x64 模式下得到一些随机结果。我也用 GCC 试过,没有这样的问题。经过一番挖掘,似乎 MSVC 与 AESIMC 指令的源和目标混淆了。它生成的代码就像aesimc xmm3,xmmword ptr[rsp+20h]
实际xmm3
是源和[rsp+20h]
目标时一样。在 x86 模式下,它将生成正确的代码,例如aesimc xmm0,xmm5
movaps xmmword ptr[K4],xmm0
(需要两条指令,因为我认为类似的东西aesimc xmmword ptr[K4],xmm5
是无效的)。
我不确定这确实是编译器错误还是我的代码有问题。
发布 x64 反汇编:(查看下面的完整代码)
完整代码:(应该与 MSVC 和 GCC 一起使用)
它应该输出:
但我会在 Release x64 模式下得到一些随机的东西:
c - 我是否必须更改一些代码才能使用 AES_NI?
我从英特尔网站获得了使用 AES_NI 的示例代码。(https://software.intel.com/en-us/articles/download-the-intel-aesni-sample-library)
但是,我不知道如何配置它。
我想做的是,
- 首先,我有使用 Openssl 的 AES 的代码。
- 我想将 AES-NI 应用于我的原始代码。
- 我检查了我的计算机支持 AES-NI。我使用 AES-NI 从英特尔网站运行示例代码,它可以工作。
- 在我的原始代码中,AES 函数是这样的。-> AES_cbc_encrypt(inbuf, outbuf, inlength, key, iv, AES_ENCRYPT);
- 在使用 AES-NI 的 Intel 示例代码中,函数是这样的。-> intel_AES_enc128_CBC(testVector, testResult, test_key_128, numBlocks, local_test_iv);
我很困惑我只更改功能或更改使用 AES-NI 的其他一些东西。有什么帮助吗?
c++ - 使用 AES/GCM 加密的已编译 Crypto++ 库代码是否使用英特尔的 AES-NI 指令?
我正在使用 Crypto++ 库实现AES256/GCM 加密和身份验证。我的代码是使用 Visual Studio 2008 作为 C++/MFC 项目编译的。这是一个较旧的项目,它使用了该库的早期版本,Cryptopp562
.
我很好奇生成的编译代码是否会使用英特尔的AES-NI 指令?如果是这样,如果硬件(旧 CPU)不支持它会发生什么?
编辑: 这是我正在测试它的代码示例:
aes - 每秒使用 AES-NI 或 GPU 加速的独立 AES 256 CBC 解密操作数
AES-NI 似乎经过优化以加密/解密大块数据。但是我正在尝试解密密码并且我有很多非常小的位要尝试(iv + 第一个 cbc 块,总共 32 个字节)。
我目前正在使用 openssl ,为每个周期(每个线程一次)调用EVP_DecryptInit_ex
, 。EVP_DecryptUpdate
EVP_CIPHER_CTX_init
我可以在单核上每秒执行大约 200 万次。
我认为这是使用 AES-NI 指令可以预期的性能,我不应该担心进一步优化它。它是否正确?
有谁知道这在高端 GPU 或不太昂贵的 FPGA 上可能会快多少?
c - 使用 _mm_aeskeygenassist_si128 匹配参考值
我正在尝试使用英特尔 SI 让 EAX 工作。使用https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf上的论文,我有一个输入键:
我正在尝试匹配看起来应该是的第二个扩展键:
我从网上使用英特尔内在函数获取了各种片段,例如:https ://www.thesalmons.org/john/random123/releases/1.09/docs/aes_8h_source.html 。它们都收敛于不同的值:
这是我正在使用的示例片段:
我并没有完全从阅读 _mm_aeskeygenassist_si128 的文档中得到我应该如何使用它来生成轮密钥,而且我对我看到的似乎生成不匹配的轮密钥的各种实现更加困惑AES 规范。
关于如何调和的任何想法?谢谢!
c - 如何使用 __cpuid 检查 AES-NI 支持?
我正在寻找一种方法来检查我的 CPU 是否支持 AES-NI 指令。我在 Internet 上发现了很多东西,但其中很多都是内联汇编代码,而且由于我在 Microsoft Visual Studio 下并且我正在 x64 中编译,所以这不起作用。Visual Studio 不支持 x64 内联汇编代码,而 x64 对我来说至关重要。
所以我找到了内在函数__cpuid()。问题是我不知道汇编/内在用途等……(我只是复制粘贴我找到的代码)
所以我在这里问你关于我使用互联网的代码片段自己编写的下面的代码。输出是“支持 AES-Ni”,但这并不意味着我的代码是正确的并且真正检索了我的 CPU 的 AES-NI 容量。
cryptography - 有没有一种快速的方法可以使 IBM 的 vncipher 指令结果与 Intel 的 mm_aesdec_si128 相同?
我正在移植一个应用程序,该应用程序使用 AES 加密和解密指令将一些数据从 x86 随机化到 POWER8。我用 _mm_aesdec_si128 指令碰壁了,它似乎做了一些与等效的 IBM __builtin_crypto_vncipher 不同的事情。https://link.springer.com/content/pdf/10.1007/978-3-642-03317-9_4.pdf的文档,第 52-54 页提到它遵循 FIPS 197。IBM 文档位于https:// /ibm.ent.box.com/s/jd5w15gz301s5b5dt375mshpq9c3lh4u,第 305 页也说它遵循 FIPS197,唯一的区别是 InvMixColumns 的顺序和带有轮键的 xor 被翻转,但这会改变结果吗?
如果结果不同,他们怎么能说他们遵循规范?
以下 C 程序在 x86 中运行良好,但会在 ppc64 中为 aesdec 输出错误结果。幸运的是 ppc64 中的 aesenc 按预期工作。
现在我通过使用 aesdec 的软件实现解决了这个问题,但我想在硬件中做所有事情。
C程序:
如图所示,最后一次测试失败。
c++ - C++中AES NI加密的正确方法
我正在尝试使用英特尔的特殊指令集 (AES-NI) 制作 AES 256 位(CBC 模式)加密功能。
到目前为止,这是我的代码:
我想,我做错了什么,因为我得到了空输出。请问我有什么想念的吗?
c - 使用 AES 新指令集解密的错误结果
我尝试使用英特尔的 AES 新指令集在 C 语言中进行加密/解密,更具体地说,我尝试使用 CBC 模式进行 256 位 AES。
我在英特尔的白皮书中找到了 C 代码:https ://www.intel.com/content/dam/doc/white-paper/advanced-encryption-standard-new-instructions-set-paper.pdf
这是英特尔白皮书 pdf ( aes.h
) 中的代码:
main.cpp
:
加密工作正常,我用一些在线 AES 工具检查了结果,但是解密的文本是错误的,解密的文本应该是来自 variable 的内容ot
,但我得到了类似AE516492B1B62F2C7D1FCB906B11AE25
. 变量computed_plain
应该是ot
纯文本(原始)。哪里可能有问题?
linux - AES多核性能不佳
我正在编写在多核中使用 AES 的代码,它在我的笔记本电脑 8 核 Intel 上非常有效。但是,当我在具有更多内核(如 48 - 72(至强))的机器上移动时,性能很差。我认为是因为 AES-NI 在多核上效果不佳,因为所有 CPU 共享相同的内存用于 AES-NI 指令。使用 crypto/aes 库时,有没有办法禁用硬件 aes-ni 使用?