正如其他人已经指出的那样,加密算法的时间复杂度始终与输入大小呈线性关系。它显然不能更快,超线性复杂性是不切实际的。我也不知道速度取决于输入类型的密码。无论您加密一个 10 MB PDF 文件还是一个 10 MB MP3 文件,都不会产生影响。
因此,速度差异仅归结为密码的具体实现在具体硬件架构上的速度。流行的 OpenSSL 库有一个内置的基准测试工具,可以显示它们的特定实现有多快。下面是在运行 32 位 Ubuntu(PBE 不是密码)的 Intel Atom 处理器上比较 AES-256 和 Blowfish 的示例:
$ openssl speed aes-256-cbc bf-cbc
Doing aes-256 cbc for 3s on 16 size blocks: 2156930 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 563323 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 256 size blocks: 142873 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 35857 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 8192 size blocks: 4487 aes-256 cbc's in 3.00s
Doing blowfish cbc for 3s on 16 size blocks: 10063235 blowfish cbc's in 3.00s
Doing blowfish cbc for 3s on 64 size blocks: 2759400 blowfish cbc's in 3.00s
Doing blowfish cbc for 3s on 256 size blocks: 705523 blowfish cbc's in 3.00s
Doing blowfish cbc for 3s on 1024 size blocks: 177777 blowfish cbc's in 3.00s
Doing blowfish cbc for 3s on 8192 size blocks: 22266 blowfish cbc's in 3.00s
OpenSSL 1.0.1c 10 May 2012
built on: Tue Mar 19 19:10:21 UTC 2013
options:bn(64,32) rc4(8x,mmx) des(ptr,risc1,16,long) aes(partial) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DOPENSSL_NO_TLS1_2_CLIENT -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
blowfish cbc 53670.59k 58867.20k 60204.63k 60681.22k 60801.02k
aes-256 cbc 11503.63k 12017.56k 12191.83k 12239.19k 12252.50k
您可以看到,在使用该特定实现的特定机器上,Blowfish 比 AES-256 快得多。但这只是一个数据点。
要回答为什么一种密码比另一种更快的问题,您必须研究算法的细节以及不同硬件平台的性能特征。另请注意,最快的实现通常是用汇编语言编写的,以实现最高性能。