Java环境下ECDSA签名验证性能

Java环境下ECDSA签名验证性能,java,openssl,bouncycastle,ecdsa,dsa,Java,Openssl,Bouncycastle,Ecdsa,Dsa,我试图计算secp521r1曲线的ECDSA签名验证在Java中的性能。 我每秒大约有3000次签名验证 再加上我的其他工作,我使用openssl speed命令对secp521r1曲线进行了测试,在那里我在我的机器(40个内核)上进行了大约9000次验证。我也使用Golang进行了测试,但是使用secp521r1的性能并不好,尽管使用secp256r1的性能非常好(28000每秒验证次数)。我联系了Golang社区,发现256是手动优化的,但其他曲线不是 我还使用nodeJs进行了测试,以验证

我试图计算secp521r1曲线的ECDSA签名验证在Java中的性能。 我每秒大约有3000次签名验证

再加上我的其他工作,我使用openssl speed命令对secp521r1曲线进行了测试,在那里我在我的机器(40个内核)上进行了大约9000次验证。我也使用Golang进行了测试,但是使用secp521r1的性能并不好,尽管使用secp256r1的性能非常好(28000每秒验证次数)。我联系了Golang社区,发现256是手动优化的,但其他曲线不是

我还使用nodeJs进行了测试,以验证签名,在那里我得到了每秒9000次的验证,这与Openssl类似。通过检查nodeJs加密模块实现的源代码,我发现它们使用的是类似openssl的实现

但是我只需要在Java上工作,所以我需要接触社区。这是Java中的常见结果还是Java中也有类似openssl的实现

伪码==========================

package dummy;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.json.JSONObject;

public class DSA {
    static JSONObject ob = new JSONObject();
    static byte[] strByte = null;
    static byte[] realSig;
    static String str = "a";//"{\"type\":\"issueTx\",\"userId\":1,\"transaction\":{\"amount\":1000}}"; /a
    static byte[] sigdata;
    static String sigEdata;
    static X509Certificate c;
    static String sigTestSigneddata;

    public static void main(String[] args)
            throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, IOException {

        try {


            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
            keyGen.initialize(new ECGenParameterSpec("secp521r1"), new SecureRandom());

            KeyPair pair = keyGen.generateKeyPair();
            PrivateKey priv = pair.getPrivate();
            PublicKey pub = pair.getPublic();
            FileWriter fw = new FileWriter("MyKeys/n.pem");
            PemWriter writer = new PemWriter(fw);
            writer.writeObject(new PemObject("PUBLIC KEY", pub.getEncoded()));
            writer.close();
            FileWriter fw2 = new FileWriter("MyKeys/n_sk");
            PemWriter writer2 = new PemWriter(fw2);
            writer2.writeObject(new PemObject("PRIVATE KEY ", priv.getEncoded()));
            writer2.close();

            Security.addProvider(new BouncyCastleProvider());
            Signature ecdsa;

            ecdsa = Signature.getInstance("SHA256withECDSA"); // SHA512WITHECDSA SHA512withECDSA
            ecdsa.initSign(getPrivate("MyKeys/n_sk"));

            strByte = str.getBytes("UTF-8");
            ecdsa.update(strByte);
            realSig = ecdsa.sign();

            sigEdata = Base64.getEncoder().encodeToString(realSig);

            Thread.sleep(1000);
             verify();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void verify() throws Exception {

        verifySignature();

    }

    private static void verifySignature() throws Exception {
    
        Signature sig = Signature.getInstance("SHA256withECDSA", "BC"); // SHA256withECDSA // SHA512withECDSA

        // sig.initVerify(c.getPublicKey()); to verify using digi cert
        sig.initVerify(getPublic("MyKeys/n.pem"));
        sig.update(str.getBytes());
        System.out.println(sig.verify(Base64.getDecoder().decode(sigEdata)));

        // sig.verify(sigEdata.getBytes(Charset.defaultCharset()));
        System.out.println(str);

    }

    private static PrivateKey getPrivate(String filename) throws Exception {

        PemReader reader = new PemReader(new FileReader(filename));
        PemObject pemObject = reader.readPemObject();
        byte[] content = pemObject.getContent();
        reader.close();
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(content);
        KeyFactory kf = KeyFactory.getInstance("EC");
        return kf.generatePrivate(spec);
    }

    

    private static PublicKey getPublic(String filename) throws Exception {

        PemReader reader = new PemReader(new FileReader(filename));
        PemObject pemObject = reader.readPemObject();
        byte[] content = pemObject.getContent();
        reader.close();
        X509EncodedKeySpec spec = new X509EncodedKeySpec(content);
        KeyFactory kf = KeyFactory.getInstance("EC");
        return kf.generatePublic(spec);
    }
    
    
}