【问题标题】:Implementation of AES in assembly [closed]在装配中实施 AES [关闭]
【发布时间】:2011-06-04 07:49:21
【问题描述】:

大家好 我正在尝试构建一个代码来演示在程序集中进行 AES 加密。最新的英特尔手册有

AESENC xmm1,xmm2/m128 — 执行一轮 AES 加密流轮密钥 来自第二个源操作数,对来自第一个源操作数的 128 位数据(状态)进行操作 源操作数,并将结果存储在目标操作数中。

AESENCLAST xmm1, xmm2/m128 — 执行最后一轮 AES 加密流程 圆键 来自第二个源操作数,对来自第一个源操作数的 128 位数据(状态)进行操作 源操作数,并将结果存储在目标操作数中。

AESKEYGENASSIST xmm1, xmm2/m128, imm8 帮助扩展 AES 密码密钥,通过计算步骤来生成 用于加密的轮密钥,使用源操作数中指定的 128 位数据和 指定为立即数的 8 位舍入常量,将结果存储在目标中 操作数。

为此,我将尝试内联汇编,我将构建它以将速度与在 C 中完成的普通 AES 进行比较!我的第一次头脑风暴让我思考如何在内联汇编中使用 xmm 欢迎任何关于我的问题或一般想法的帮助/集思广益/分享想法 干杯=)

【问题讨论】:

  • 我宁愿在汇编中编写 COBOL 编译器,也不愿在汇编中编写任何密码学。
  • @SanJacint:密码学是手工组装确实是个好主意的少数用例之一。它是需要高性能的简短、定义明确的代码。如果是 AES,甚至还有特殊说明。
  • FWIW 威盛处理器上的 PadLock (xcrypt*) 指令也支持 AES 算法,并且已经存在比英特尔的扩展更长的时间,那里有更多的基准材料。
  • 那么到底是什么问题?
  • @San:如果不是专门的英特尔 insns,我不会去那里,但 AES 是英特尔有专用宏操作的特殊情况,而且在组装时它应该更快

标签: c security inline-assembly aes


【解决方案1】:

如果您想将 128 位的值存入 XMM 寄存器,请查看 MOVDQA 和 MOVDQU 指令。

【讨论】:

  • 查看了它,但都将第二个操作数作为 xmm 或 mem128 ...我想要一些方法立即移动到 xmm ....我是内联汇编的新手,所以如果我错了,请告诉我: )
  • @Syntax_Error:您可以使用MOVD 将通用寄存器移动到 XMM 寄存器中,但这会将其零扩展为 128 位。我猜这适用于小常数。任何比这更大的东西你都可能已经坐在堆栈上。
  • 那么你的意思是说只能使用 64 位操作数?
  • @Syntax_Error:您可以从内存中加载 128 位操作数。如果你真的不想从内存中加载,你可以使用插入命令(forex:PINSRD)来指定操作数在 xmm 寄存器中的位置。
  • @Syntax_Error:这取决于该操作数的来源。例如,如果它是来自网络的加密数据,您可能会从设备驱动程序离开它的任何地方将它直接读入 xmm 寄存器。如果您为此代码提供 C 接口,则密钥材料可能会在堆栈中传递,并且您将再次将其直接读入适当的 xmm 寄存器。如果您已经完成了一些计算并希望将结果移动到 xmm 寄存器中,您可以使用插入序列或将其复制到堆栈然后返回。
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多