我试图找出AES加密和解密对于给定数量的数据和密钥所花费的时间。在所有情况下,加密比解密花费更少的处理时间。我试图在别的地方得到这个答案,但找不到。我可以知道为什么解密比AES 128/256位的加密花费更多的时间吗?
我试图在Arduino UNO中实现一个简单的AES加密。我使用micros()来测量加密或解密所需的时间。
以下是我在加密方面所做的工作:
Serial.print("Encrypted: ");
unsigned long start1 = micros();
String enc = aes_encrypt("this is data source","this is key");
Serial.println(enc);
unsigned long start2 = micros();
unsigned long diff1 = start2 - start1;
Serial.print("Time to encrypt the data: ");
Serial.print(diff1);
Serial.println(" microseconds");发布于 2015-02-11 03:53:45
正如评论者所说,如果没有更多关于您的具体实现的详细信息,就不可能回答,但是这里有一些关于Rijndael (发音为“下雨娃娃”)的背景信息,可能会有所帮助。Rijndael是AES所基于的密码家族。AES定义为Rijndael1,块大小为128位,密钥长度为128、192和256位。
早在1999年,当AES的获奖者还没有被选中时,Bruce发表了一篇关于拟议密码的性能的论文2。奔腾Pro CPU当时是一个高端处理器。他在报告第七页指出:
Rijndael是Square的另一个变体:一种适用于所有平台的快速密码。它拥有一个干净的数学结构,只涉及表查找和异或操作。虽然加密和解密算法并不完全相同,但它们的一般结构和性能几乎是难以区分的。Rijndael在奔腾和奔腾Pro处理器上的汇编语言是大约300个时钟块。与RC6和火星不同的是,没有已知的CPU平台(8位或32位),在这些平台上,Rijndael的相对性能会受到不适当的负面影响,或者可能发生定时攻击。
据此,该算法的优点之一是抗定时攻击。这肯定是决定选择Rijndael作为当前AES的一个因素。
不过,后来,他谈到了8位智能卡的性能(我将其解读为资源非常有限的计算平台),他谈到了Rijndael:
也许关于智能卡上Rijndael的唯一负面评论是,论文中的性能数字不包含解密函数。包括解密将稍微增加代码大小(可能在512到1024字节之间),并且由于MDS矩阵的逆系数,解密速度将比加密速度慢(可能是加密速度的两倍)。
同样,如果不详细说明执行情况,就不可能知道差异的原因是什么。有强有力的证据表明,对给定密钥的加密和解密大约应该同时进行,但是Arduino UNO有一个8位的RISC处理器,即使它有2K的内存,一次只能消耗8位。你可能正经历着施耐尔描述的同样的理论问题。
1 -检查名为密码描述的部分。
发布于 2015-03-14 23:42:13
在这方面,AES是不对称的。这取决于密钥调度,它从初始键生成一个循环键序列。在现代桌面环境中,圆形密钥序列是在加密/解密开始之前简单地生成的,因此速度上的差异是最小的。
在内存受限的环境(如智能卡)中,这可能是不可能的,并且必须动态生成圆键。但是对于解密,最终的循环密钥是第一个使用的,而生成这个最终的循环密钥需要生成所有的中间循环密钥(这些密钥不被使用)。然后,随着算法的进展,必须再次按反向顺序生成圆键。
这是一个深思熟虑的设计决策-- MACs只需要加密原语,甚至有些加密/解密算法(CTR、EAX)也只使用底层分组密码的加密原语。因此,对Rijndael算法进行了优化,使加密速度超过了解密速度。
发布于 2015-03-14 10:33:16
我刚刚注意到,您需要时间进行加密,并通过串行行发送结果。串行线路传输(我想)要比Arduino上的AES操作慢得多。
您对micros()的调用应该尽可能接近aes_encrypt(),否则度量就会被篡改。
如果通过串行行发送的数据大小与加密或解密不同,这将解释您的测量结果。
https://crypto.stackexchange.com/questions/14978
复制相似问题