Java 为什么SHA1比AES慢?JCE

Java 为什么SHA1比AES慢?JCE,java,performance,encryption,jce,message-digest,Java,Performance,Encryption,Jce,Message Digest,我目前正在构建应用程序,它使用加密原语。对于加密和哈希,我使用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 =

我目前正在构建应用程序,它使用加密原语。对于加密和哈希,我使用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));
byte[]key={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
字节[]数据={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
SecretKeySpec encryptionKey=新的SecretKeySpec(密钥,“AES”);
Cipher Cipher=Cipher.getInstance(“AES/ECB/NoPadding”);
cipher.init(cipher.ENCRYPT_模式,encryptionKey);
长启动=System.currentTimeMillis();

对于(int i=0;i请在下面查找
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。

首先,这有什么关系?你将两者用于不同的目的。你能尝试一下
-client
,看看会发生什么吗?如果这没有影响,我可能会有一些其他可能会产生影响的因素。加密哈希的主要目标是安全性而不是速度。事实上,如果不是太快,它有助于安全性,因为攻击者需要更多的时间在许多不同的输入上执行它。我的意思是
java-client
。@Henry注意,普通哈希函数的用途与passwo不同rd散列函数。对于这些函数,通常使用PBKDF。这些“密码散列”函数需要慢一些,而不是底层散列(如果有的话)!@Henry Speed一直是首选哈希函数的主要原因之一——当然是在安全性之后。请查看SHA-3竞赛,了解我所说的内容。如果您想降低它们的速度,您可以对它们进行N次迭代,例如在PBKDF2中。请注意,对于PB来说,较慢的哈希函数是一个糟糕的选择KDF2,因为攻击者有更多机会创建快速硬件实现。我肯定忘记了填充。我也很关心效率。SHA-1为我提供了可接受的安全性。我检查了其他基准测试,其中
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