Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C AES在汇编语言中的实现_C_Security_Inline Assembly_Aes - Fatal编程技术网

C AES在汇编语言中的实现

C AES在汇编语言中的实现,c,security,inline-assembly,aes,C,Security,Inline Assembly,Aes,大家好 我试图构建一个代码来演示如何在汇编中进行AES加密。最新的英特尔手册 AESENC xmm1、xmm2/m128-执行一轮AES加密流循环密钥 来自第二个源操作数,对来自第一个源操作数的128位数据(状态)进行操作 源操作数,并将结果存储在目标操作数中 AESENCLAST xmm1、xmm2/m128-执行AES加密流的最后一轮 圆钥匙 来自第二个源操作数,对来自第一个源操作数的128位数据(状态)进行操作 源操作数,并将结果存储在目标操作数中 AESKYGENAssist xmm1、

大家好 我试图构建一个代码来演示如何在汇编中进行AES加密。最新的英特尔手册

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

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

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

为了做到这一点,我将尝试内联汇编,我将建立它来比较速度与正常的AES在C中完成!我的第一次头脑风暴让我思考如何在内联汇编中使用xmm 欢迎就我的问题或总体想法提供任何帮助/集思广益/分享想法
Cheers=)

如果你想在XMM寄存器中获得一个128位的值,请查看和MOVDQU指令。

我宁愿在汇编中编写COBOL编译器,而不是在汇编中编写任何加密。@SanJacint:加密是手工汇编非常好的少数几个使用案例之一。它是需要高性能的简短、定义良好的代码。对于AES,甚至还有一些特殊的指令。FWIW VIA处理器上的挂锁(xcrypt*)指令也支持AES算法,并且比Intel的扩展版存在的时间更长,有更多的基准资料。那么问题是什么呢,是吗?@San:如果不是专门的英特尔INSN,我就不会去那里了,但AES是英特尔专门针对宏操作的特例,另外,在汇编中,它应该快速嵌入,但都将第二个操作数作为xmm或mem128…我想用某种方法立即移动到xmm…我是内联汇编的新手,所以如果我错了,请告诉我:)@Syntax\u Error:您可以使用
MOVD
将通用寄存器移动到xmm寄存器中,但这将使其零扩展到128位。我想这对小常数很好。任何大于此值的操作数都可能位于堆栈上。因此,您的意思是将被限制为64位操作数?@Syntax\u Error:您可以从内存加载128位操作数。如果确实不想从内存加载,可以随意使用insert命令(forex:
PINSRD
),它可以指定操作数在xmm寄存器中的位置。@Syntax\u错误:这取决于该操作数的源。例如,如果它是来自网络的加密数据,您可能会从设备驱动程序离开的地方直接将其读入xmm寄存器。如果您为这段代码提供了一个C接口,那么密钥材料可能会在堆栈中传递,并且再次将其直接读取到相应的xmm寄存器中。如果您已经完成了一些计算,并且希望将结果移动到xmm寄存器中,那么您可以使用插入序列,或者将其复制到堆栈中,然后再返回。