java - BouncyCasSTLe ECDSA 签名需要几毫秒

标签 java cryptography bouncycastle

我必须使用以下参数创建大量签名,并且使用以下代码,使用 Intel Core i5-6500 CPU 创建签名需要大约 10 毫秒。

在普通 PC 上使用这些参数创建签名大约需要 10 毫秒,这正常吗?这次我该如何改进呢?如果每个签名能够达到 1 毫秒,我会非常高兴。

    Security.addProvider(new BouncyCastleProvider());

    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
    g.initialize(ECNamedCurveTable.getParameterSpec("P-256"));
    KeyPair keyPair = g.generateKeyPair();

    Signature s = Signature.getInstance("SHA256withECDSA");
    s.initSign(keyPair.getPrivate());

    s.update("first".getBytes());
    long start = System.currentTimeMillis();
    s.sign(); // Takes about 30 msecs
    System.out.println(System.currentTimeMillis() - start);

    s.update("second".getBytes());
    start = System.currentTimeMillis();
    s.sign(); // Takes about 10 msecs for this and every further signature
    System.out.println(System.currentTimeMillis() - start);

我已经尝试过 here 的建议,但我无法实现性能提升。

最佳答案

你的测试方法太离谱了,结果没有任何意义:

  • 应该允许 JIT 编译器有一些启动时间,以便它可以编译和优化字节码;
  • 需要(单独)执行许多标志和随后的数据验证,然后计时并划分;
  • 应使用纳米计时器或秒表实现;
  • 更新应该是签名生成操作的一部分(或者完全省略,签署空字符串);
  • ECDSA 使用 SecureRandom 实现来计算签名,这可能会影响结果(最好提供具体的签名);
  • 请注意,您可能希望将结果用于某些用途,因为智能编译器可能会优化整个签名生成。

最后,从性能角度来看:

  • Java 9 及以上版本更新了 BigInteger 使用 native 代码(内在函数)实现,这可能会对软件中的任何非对称操作产生巨大差异;
  • 标准 SunEC 提供程序也可以与您的曲线一起使用,并且更有可能表现良好,因为它可能使用下面的 native 指令(编辑:但在我使用 BC 版本 1.57 的系统上,它几乎是 的 10 倍慢!)。

因此请注意,结果高度依赖于所使用的环境和 CPU(写下来!)。

<小时/>

您应该使用 Signature.getInstance("SHA256withECDSA", "BC") 以便实际使用 Bouncy CaSTLe 提供程序 - 如果您不这样做并且仍然使用 Bouncy,那么您可以在 JRE 本身(安全文件夹中)中配置了另一个 Bouncy CaSTLe 提供程序,因此如果该版本与类路径中的版本不同,结果可能会有所不同。

出于某种原因,仅为 key 对生成器指定“EC”可能比“ECDSA”在不同的提供程序上更兼容。

<小时/>

最后,这里有一些可以比较的内容:

$ openssl speed ecdsap256
Doing 256 bit sign ecdsa's for 10s: 147861 256 bit ECDSA signs in 9.98s
Doing 256 bit verify ecdsa's for 10s: 78064 256 bit ECDSA verify in 10.00s
OpenSSL 1.0.2j  26 Sep 2016
built on: reproducible build, date unspecified
options:bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include  -D_WINDLL -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS  -DDSO_DLFCN -DHAVE_DLFCN_H -ggdb -O2 -pipe -Wimplicit-function-declaration -fdebug-prefix-map=/usr/src/ports/openssl/openssl-1.0.2j-1.x86_64/build=/usr/src/debug/openssl-1.0.2j-1 -fdebug-prefix-map=/usr/src/ports/openssl/openssl-1.0.2j-1.x86_64/src/openssl-1.0.2j=/usr/src/debug/openssl-1.0.2j-1 -DTERMIOS -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
                              sign    verify    sign/s verify/s
 256 bit ecdsa (nistp256)   0.0001s   0.0001s  14809.8   7806.4

在我基于 i7 的低端笔记本电脑上:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 61
model name  : Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz
stepping    : 4
cpu MHz     : 2394.000
cache size  : 256 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe pni dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt aes xsave osxsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

关于java - BouncyCasSTLe ECDSA 签名需要几毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289857/

相关文章:

php - 如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

PHP 种子、确定性、加密安全 PRNG(伪随机数生成器)。可能吗?

java - 使用 BouncyCaSTLe 使用 SMIME 和 X.509 加密邮件

java - 如何在 BouncyCaSTLe 中序列化 PKCS10CertificationRequest 以通过网络发送?

Java 输入验证

java - 将值附加到 HashMap <String , ArrayList<Object>>

java - spring mvc中资源不可用问题

angularjs - Angular JS 密码学。 pbkdf2 和迭代

java - eclipse 充气城堡 jar 来自哪里

java - 使用循环、switch 和 case 时出现编译器错误