我目前正在构建使用加密原语的应用程序。对于加密和散列,我使用javax.crypto和java.security包。我做了一些基准测试,事实证明,ECB-AES-128比SHA1更快。 我用于AES测试的代码:
byte[] key = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
byte[] data = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
SecretKeySpec encryptionKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
long start = System.currentTimeMillis();
for (int i=0; i<10000000; i++)
{
cipher.doFinal(data);
}
long end = System.currentTimeMillis();
System.out.println("took: "+ (end-start));
用于散列
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] data = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long start = System.currentTimeMillis();
for (int i=0; i<10000000; i++)
{
md.digest(data);
}
long end = System.currentTimeMillis();
System.out.println("took:" + (end-start));
加密时间:约4秒。 哈希时间需要:~10秒。 配置:酷睿i5 3570-3.4Ghz,8Gb内存(不确定,是否重要)
为什么加密比散列花费更少的时间?散列函数应该更快。难道我做错了什么? 谢谢
答案 0 :(得分:0)
请在下面找到openssl speed sha1 aes-128-cbc
的结果:
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha1 27821.86k 81142.78k 181461.85k 272193.19k 312980.82k
aes-128 cbc 55984.60k 63748.01k 64728.23k 104889.11k 107399.85k
正如您所看到的,AES对于较小的量更快,而对于大量的更慢。为什么会这样?好吧,简单。 AES使用128位的块大小,而SHA-1使用512位的块大小。因此,对于少量数据,SHA-1必须做更多的工作。请注意,对于64字节,SHA-1必须使用2个完整块,因此它仍然处于劣势。由于更大的州规模,我预计它也会更容易优化。
AES通常也经过了大量优化。我不确定Java中的SHA-1是否有同样的兴趣。如今,你宁愿看看SHA-2。