From 9bfd5faddf3292cee51ec73985fbcb2e1c9a8ec0 Mon Sep 17 00:00:00 2001 From: zhanglin33 Date: Wed, 22 May 2019 14:35:22 +0800 Subject: [PATCH] add ssh ecdsa and ed25519 --- .../crypto/utils/classic/ECDSAUtils.java | 3 +- .../crypto/utils/classic/SSHKeyParser.java | 23 +- .../crypto/utils/classic/SSHKeyUtilsTest.java | 237 +++++++++++++++++- .../blockchain/crypto/utils/sm/SM2Utils.java | 3 +- 4 files changed, 256 insertions(+), 10 deletions(-) diff --git a/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/ECDSAUtils.java b/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/ECDSAUtils.java index c2908f99..097ce957 100644 --- a/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/ECDSAUtils.java +++ b/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/ECDSAUtils.java @@ -65,8 +65,7 @@ public class ECDSAUtils { * @return publicKey */ public static byte[] retrievePublicKey(byte[] privateKey) { - ECMultiplier createBasePointMultiplier = new FixedPointCombMultiplier(); - ECPoint publicKeyPoint = createBasePointMultiplier.multiply(DOMAIN_PARAMS.getG(), new BigInteger(1,privateKey)).normalize(); + ECPoint publicKeyPoint = DOMAIN_PARAMS.getG().multiply(new BigInteger(1,privateKey)).normalize(); return publicKeyPoint.getEncoded(false); } diff --git a/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/SSHKeyParser.java b/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/SSHKeyParser.java index ed5b0fce..1a166ceb 100644 --- a/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/SSHKeyParser.java +++ b/source/crypto/crypto-classic/src/main/java/com/jd/blockchain/crypto/utils/classic/SSHKeyParser.java @@ -1,12 +1,14 @@ package com.jd.blockchain.crypto.utils.classic; import com.jd.blockchain.crypto.CryptoException; -import org.bouncycastle.crypto.params.AsymmetricKeyParameter; -import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; +import org.bouncycastle.asn1.sec.SECNamedCurves; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.params.*; import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil; import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; import org.bouncycastle.jce.spec.OpenSSHPrivateKeySpec; import org.bouncycastle.jce.spec.OpenSSHPublicKeySpec; +import org.bouncycastle.math.ec.custom.sec.SecP256R1Curve; import org.bouncycastle.util.Strings; import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.util.io.pem.PemReader; @@ -131,10 +133,27 @@ public class SSHKeyParser { } case "ssh-dss": { + BigInteger p = new BigInteger(1, privKeyReader.readBytes()); + BigInteger q = new BigInteger(1, privKeyReader.readBytes()); + BigInteger g = new BigInteger(1, privKeyReader.readBytes()); + privKeyReader.readBytes(); // y + BigInteger x = new BigInteger(1, privKeyReader.readBytes()); + + result = new DSAPrivateKeyParameters(x, new DSAParameters(p, q, g)); break; } case "ecdsa-sha2-nistp256": { + privKeyReader.readBytes(); // nistp256 + privKeyReader.readBytes(); // Q + BigInteger d = new BigInteger(1, privKeyReader.readBytes()); + X9ECParameters x9Params = SECNamedCurves.getByName("secp256r1"); + result = new ECPrivateKeyParameters(d, new ECDomainParameters( + x9Params.getCurve(), + x9Params.getG(), + x9Params.getN(), + x9Params.getH(), + x9Params.getSeed())); break; } diff --git a/source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/utils/classic/SSHKeyUtilsTest.java b/source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/utils/classic/SSHKeyUtilsTest.java index b30babc2..3dc52ee1 100644 --- a/source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/utils/classic/SSHKeyUtilsTest.java +++ b/source/crypto/crypto-classic/src/test/java/test/com/jd/blockchain/crypto/utils/classic/SSHKeyUtilsTest.java @@ -1,10 +1,17 @@ package test.com.jd.blockchain.crypto.utils.classic; import com.jd.blockchain.crypto.utils.classic.SSHKeyParser; -import org.bouncycastle.crypto.params.RSAKeyParameters; -import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; +import org.bouncycastle.crypto.params.*; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.Strings; +import org.bouncycastle.util.encoders.Base64; +import org.bouncycastle.util.encoders.Hex; +import org.bouncycastle.math.ec.custom.sec.SecP256R1Curve; +import org.bouncycastle.util.io.pem.PemReader; import org.junit.Test; +import java.io.IOException; +import java.io.StringReader; import java.math.BigInteger; import static org.junit.Assert.assertEquals; @@ -68,7 +75,7 @@ public class SSHKeyUtilsTest { @Test public void parseRSAPrivateKeyTest() { - String privKeyStr = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + + String privKeyStrWithHead = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + "NhAAAAAwEAAQAAAQEAmMCzeBF8u4NF7oL+JUH6Lo2wEYuPID0sVbqbRrEqBqrEtNHvawO7\n" + "9KsxSmvWYZ8NVpIwpxF0WADIggCWJDP5hiPJm96pHHTYRlmZj56KVfg+OgkxQdeMnkfZo6\n" + @@ -138,7 +145,7 @@ public class SSHKeyUtilsTest { SSHKeyParser parser = new SSHKeyParser(); - RSAPrivateCrtKeyParameters privKey = (RSAPrivateCrtKeyParameters) parser.privKeyParse(privKeyStr); + RSAPrivateCrtKeyParameters privKey = (RSAPrivateCrtKeyParameters) parser.privKeyParse(privKeyStrWithHead); assertEquals(pubExponent,privKey.getPublicExponent()); assertEquals(modulus,privKey.getModulus()); assertEquals(privExponent,privKey.getExponent()); @@ -152,4 +159,226 @@ public class SSHKeyUtilsTest { assertEquals(privKeyType,parser.getKeyType()); assertEquals(id,parser.getIdentity()); } + + @Test + public void parseDSAPublicKeyTest() { + + String pubKeyStrWithHead = "ssh-dss AAAAB3NzaC1kc3MAAACBAIOpp3qEY9zVOxQFgLS+2sOqXT+lnJVc" + + "Nr68eAE/iYG02kYKs/BrJYBbr0nb10ERdQv6Yte9tQilpJTMKPhNuTVIHTK2xbV0nfChN4wePY+XJyb" + + "Ima/m41FnIlfp2ov54ePLsNgY41qYWxuKzxURV67DgPxbMqMZmBV2Ccpb5+t/AAAAFQCcyJjOhDH3Ck" + + "Lbs9dHx/gUtmsh0wAAAIB3MyVR817NTbaRA4pO0AVnk4jC7JKVeKDlZaBBLt1CzyMKY7OzNgioqZmBX" + + "tffkHXBXxd75AdiBLeurmAPLKsZ50O+lRQI8QwGL5ne0dkGP+sRFdqTEA2BMjWyvlx6xwJD14/cKpgg" + + "fLt+FBt5nhwmbewxt9uWXENfzD/84Z7aOQAAAIA0DOAIv6SqSEPOyzPMHVWGGiqNFFgQ0gOH7BhrLD/" + + "hNqFz5vuKQd5rhKCVXxzANTQ8WrINMIk3aYIRgp96oxI3xsL1w7rYODoQmkx4JFHfvU/Sls40r1h09D" + + "OWSbqE99mo41RIZMauVFlYlhYnusziX1QyGAabHMcz73Y19vrKCg== zhanglin33@JRMVP10WHTD5"; + + BigInteger p = new BigInteger("83a9a77a8463dcd53b140580b4bedac3aa5d3fa59c955c36bebc" + + "78013f8981b4da460ab3f06b25805baf49dbd74111750bfa62d7bdb508a5a494cc28f84db93548" + + "1d32b6c5b5749df0a1378c1e3d8f972726c899afe6e351672257e9da8bf9e1e3cbb0d818e35a98" + + "5b1b8acf151157aec380fc5b32a31998157609ca5be7eb7f", 16); + BigInteger q = new BigInteger("9cc898ce8431f70a42dbb3d747c7f814b66b21d3", 16); + BigInteger g = new BigInteger("77332551f35ecd4db691038a4ed005679388c2ec929578a0e565" + + "a0412edd42cf230a63b3b33608a8a999815ed7df9075c15f177be4076204b7aeae600f2cab19e7" + + "43be951408f10c062f99ded1d9063feb1115da93100d813235b2be5c7ac70243d78fdc2a98207c" + + "bb7e141b799e1c266dec31b7db965c435fcc3ffce19eda39", 16); + BigInteger y = new BigInteger("340ce008bfa4aa4843cecb33cc1d55861a2a8d145810d20387ec" + + "186b2c3fe136a173e6fb8a41de6b84a0955f1cc035343c5ab20d308937698211829f7aa31237c6" + + "c2f5c3bad8383a109a4c782451dfbd4fd296ce34af5874f4339649ba84f7d9a8e3544864c6ae54" + + "5958961627bacce25f543218069b1cc733ef7635f6faca0a", 16); + + String pubKeyFormat = "OpenSSH"; + String pubKeyType = "ssh-dss"; + String id = "zhanglin33@JRMVP10WHTD5"; + + SSHKeyParser parser = new SSHKeyParser(); + + DSAPublicKeyParameters pubKey = (DSAPublicKeyParameters) parser.pubKeyParse(pubKeyStrWithHead); + DSAParameters parameters = pubKey.getParameters(); + assertEquals(p, parameters.getP()); + assertEquals(q, parameters.getQ()); + assertEquals(g, parameters.getG()); + assertEquals(y, pubKey.getY()); + + assertEquals(pubKeyFormat,parser.getKeyFormat()); + assertEquals(pubKeyType,parser.getKeyType()); + assertEquals(id, parser.getIdentity()); + } + + @Test + public void parseDSAPrivateKeyTest() { + + String privKeyStrWithHead = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + + "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABsQAAAAdzc2gtZH\n" + + "NzAAAAgQCDqad6hGPc1TsUBYC0vtrDql0/pZyVXDa+vHgBP4mBtNpGCrPwayWAW69J29dB\n" + + "EXUL+mLXvbUIpaSUzCj4Tbk1SB0ytsW1dJ3woTeMHj2PlycmyJmv5uNRZyJX6dqL+eHjy7\n" + + "DYGONamFsbis8VEVeuw4D8WzKjGZgVdgnKW+frfwAAABUAnMiYzoQx9wpC27PXR8f4FLZr\n" + + "IdMAAACAdzMlUfNezU22kQOKTtAFZ5OIwuySlXig5WWgQS7dQs8jCmOzszYIqKmZgV7X35\n" + + "B1wV8Xe+QHYgS3rq5gDyyrGedDvpUUCPEMBi+Z3tHZBj/rERXakxANgTI1sr5cescCQ9eP\n" + + "3CqYIHy7fhQbeZ4cJm3sMbfbllxDX8w//OGe2jkAAACANAzgCL+kqkhDzsszzB1VhhoqjR\n" + + "RYENIDh+wYayw/4Tahc+b7ikHea4SglV8cwDU0PFqyDTCJN2mCEYKfeqMSN8bC9cO62Dg6\n" + + "EJpMeCRR371P0pbONK9YdPQzlkm6hPfZqONUSGTGrlRZWJYWJ7rM4l9UMhgGmxzHM+92Nf\n" + + "b6ygoAAAHwI0abUyNGm1MAAAAHc3NoLWRzcwAAAIEAg6mneoRj3NU7FAWAtL7aw6pdP6Wc\n" + + "lVw2vrx4AT+JgbTaRgqz8GslgFuvSdvXQRF1C/pi1721CKWklMwo+E25NUgdMrbFtXSd8K\n" + + "E3jB49j5cnJsiZr+bjUWciV+nai/nh48uw2BjjWphbG4rPFRFXrsOA/FsyoxmYFXYJylvn\n" + + "638AAAAVAJzImM6EMfcKQtuz10fH+BS2ayHTAAAAgHczJVHzXs1NtpEDik7QBWeTiMLskp\n" + + "V4oOVloEEu3ULPIwpjs7M2CKipmYFe19+QdcFfF3vkB2IEt66uYA8sqxnnQ76VFAjxDAYv\n" + + "md7R2QY/6xEV2pMQDYEyNbK+XHrHAkPXj9wqmCB8u34UG3meHCZt7DG325ZcQ1/MP/zhnt\n" + + "o5AAAAgDQM4Ai/pKpIQ87LM8wdVYYaKo0UWBDSA4fsGGssP+E2oXPm+4pB3muEoJVfHMA1\n" + + "NDxasg0wiTdpghGCn3qjEjfGwvXDutg4OhCaTHgkUd+9T9KWzjSvWHT0M5ZJuoT32ajjVE\n" + + "hkxq5UWViWFie6zOJfVDIYBpscxzPvdjX2+soKAAAAFEJXzZu8UDkISU8DCj/KY7Fq31R8\n" + + "AAAAF3poYW5nbGluMzNASlJNVlAxMFdIVEQ1AQIDBA==\n" + + "-----END OPENSSH PRIVATE KEY-----\n"; + + BigInteger p = new BigInteger("83a9a77a8463dcd53b140580b4bedac3aa5d3fa59c955c36bebc" + + "78013f8981b4da460ab3f06b25805baf49dbd74111750bfa62d7bdb508a5a494cc28f84db93548" + + "1d32b6c5b5749df0a1378c1e3d8f972726c899afe6e351672257e9da8bf9e1e3cbb0d818e35a98" + + "5b1b8acf151157aec380fc5b32a31998157609ca5be7eb7f", 16); + BigInteger q = new BigInteger("9cc898ce8431f70a42dbb3d747c7f814b66b21d3", 16); + BigInteger g = new BigInteger("77332551f35ecd4db691038a4ed005679388c2ec929578a0e565" + + "a0412edd42cf230a63b3b33608a8a999815ed7df9075c15f177be4076204b7aeae600f2cab19e7" + + "43be951408f10c062f99ded1d9063feb1115da93100d813235b2be5c7ac70243d78fdc2a98207c" + + "bb7e141b799e1c266dec31b7db965c435fcc3ffce19eda39", 16); + BigInteger y = new BigInteger("340ce008bfa4aa4843cecb33cc1d55861a2a8d145810d20387ec" + + "186b2c3fe136a173e6fb8a41de6b84a0955f1cc035343c5ab20d308937698211829f7aa31237c6" + + "c2f5c3bad8383a109a4c782451dfbd4fd296ce34af5874f4339649ba84f7d9a8e3544864c6ae54" + + "5958961627bacce25f543218069b1cc733ef7635f6faca0a", 16); + + BigInteger x = new BigInteger("4257cd9bbc503908494f030a3fca63b16adf547c", 16); + + String privKeyFormat = "OpenSSH"; + String privKeyType = "ssh-dss"; + String id = "zhanglin33@JRMVP10WHTD5"; +// byte[] privKeyBytes = new byte[0]; +// try { +// privKeyBytes = new PemReader(new StringReader(privKeyStrWithHead)).readPemObject().getContent(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// System.out.println(Hex.toHexString(privKeyBytes)); + + SSHKeyParser parser = new SSHKeyParser(); + DSAPrivateKeyParameters privKey = (DSAPrivateKeyParameters) parser.privKeyParse(privKeyStrWithHead); + assertEquals(x,privKey.getX()); + assertEquals(y,g.modPow(x,p)); + + DSAParameters parameters = privKey.getParameters(); + assertEquals(p, parameters.getP()); + assertEquals(q, parameters.getQ()); + assertEquals(g, parameters.getG()); + assertEquals(x, privKey.getX()); + + assertEquals(privKeyFormat,parser.getKeyFormat()); + assertEquals(privKeyType,parser.getKeyType()); + assertEquals(id, parser.getIdentity()); + } + + @Test + public void parseECDSAPublicKeyTest() { + + String pubKeyStrWithHead = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbml" + + "zdHAyNTYAAABBBEi5T13AMBMBthe7a6GwSoK5JK8mVEMXztIA6kUGRuNefoRtY0lPx3kmeIW4GGFVK" + + "ct+Kcc6vtNKuUhn8fVqEZU= zhanglin33@JRMVP10WHTD5"; + + BigInteger gX = new BigInteger("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",16); + BigInteger gY = new BigInteger("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",16); + + BigInteger QX = new BigInteger("48b94f5dc0301301b617bb6ba1b04a82b924af26544317ced200ea450646e35e",16); + BigInteger QY = new BigInteger("7e846d63494fc779267885b818615529cb7e29c73abed34ab94867f1f56a1195",16); + + String pubKeyFormat = "OpenSSH"; + String pubKeyType = "ecdsa-sha2-nistp256"; + String id = "zhanglin33@JRMVP10WHTD5"; + + SSHKeyParser parser = new SSHKeyParser(); + ECPublicKeyParameters pubKey = (ECPublicKeyParameters) parser.pubKeyParse(pubKeyStrWithHead); + SecP256R1Curve curve = new SecP256R1Curve(); + ECPoint g = curve.createPoint(gX,gY); + ECPoint Q = curve.createPoint(QX,QY); + assertEquals(g,pubKey.getParameters().getG()); + assertEquals(Q,pubKey.getQ()); + + assertEquals(pubKeyFormat,parser.getKeyFormat()); + assertEquals(pubKeyType,parser.getKeyType()); + assertEquals(id, parser.getIdentity()); + } + + @Test + public void parseECDSAPrivateKeyTest() { + + String privKeyStrWithHead = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + + "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS\n" + + "1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQRIuU9dwDATAbYXu2uhsEqCuSSvJlRD\n" + + "F87SAOpFBkbjXn6EbWNJT8d5JniFuBhhVSnLfinHOr7TSrlIZ/H1ahGVAAAAsGEuQiRhLk\n" + + "IkAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEi5T13AMBMBthe7\n" + + "a6GwSoK5JK8mVEMXztIA6kUGRuNefoRtY0lPx3kmeIW4GGFVKct+Kcc6vtNKuUhn8fVqEZ\n" + + "UAAAAhAPEgd42vUGT8APac9sNgj7zIkE4m9/r8+7tATePBXucRAAAAF3poYW5nbGluMzNA\n" + + "SlJNVlAxMFdIVEQ1\n" + + "-----END OPENSSH PRIVATE KEY-----"; + + BigInteger gX = new BigInteger("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",16); + BigInteger gY = new BigInteger("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",16); + + BigInteger QX = new BigInteger("48b94f5dc0301301b617bb6ba1b04a82b924af26544317ced200ea450646e35e",16); + BigInteger QY = new BigInteger("7e846d63494fc779267885b818615529cb7e29c73abed34ab94867f1f56a1195",16); + BigInteger d = new BigInteger("00f120778daf5064fc00f69cf6c3608fbcc8904e26f7fafcfbbb404de3c15ee711",16); + + String privKeyFormat = "OpenSSH"; + String privKeyType = "ecdsa-sha2-nistp256"; + String id = "zhanglin33@JRMVP10WHTD5"; + byte[] privKeyBytes = new byte[0]; + try { + privKeyBytes = new PemReader(new StringReader(privKeyStrWithHead)).readPemObject().getContent(); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println(Hex.toHexString(privKeyBytes)); + + SSHKeyParser parser = new SSHKeyParser(); + ECPrivateKeyParameters privKey = (ECPrivateKeyParameters) parser.privKeyParse(privKeyStrWithHead); + + SecP256R1Curve curve = new SecP256R1Curve(); + ECPoint g = curve.createPoint(gX,gY); + ECPoint Q = curve.createPoint(QX,QY); + assertEquals(g,privKey.getParameters().getG()); + assertEquals(d,privKey.getD()); + assertEquals(Q,g.multiply(d)); + + assertEquals(privKeyFormat,parser.getKeyFormat()); + assertEquals(privKeyType,parser.getKeyType()); + assertEquals(id, parser.getIdentity()); + } + + + @Test + public void parseED25519PublicKeyTest() { + + String pubKeyStrWithHead = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICWVU6JcJ3k/ZM9FxKY5h" + + "kxWSi1EEZaYwCChiJ00wwps zhanglin33@JRMVP10WHTD5"; + + BigInteger gX = new BigInteger("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",16); + BigInteger gY = new BigInteger("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",16); + + byte[] A = Hex.decode() + + + String pubKeyFormat = "OpenSSH"; + String pubKeyType = "ssh-ed25519"; + String id = "zhanglin33@JRMVP10WHTD5"; + + SSHKeyParser parser = new SSHKeyParser(); + parser.pubKeyParse(pubKeyStrWithHead); + String str = "AAAAC3NzaC1lZDI1NTE5AAAAICWVU6JcJ3k/ZM9FxKY5hkxWSi1EEZaYwCChiJ00wwps"; + System.out.println(Hex.toHexString(Base64.decode(str))); + Ed25519PublicKeyParameters pubKey = (Ed25519PublicKeyParameters) parser.pubKeyParse(pubKeyStrWithHead); + pubKey.getEncoded() +// SecP256R1Curve curve = new SecP256R1Curve(); +// ECPoint g = curve.createPoint(gX,gY); +// ECPoint Q = curve.createPoint(QX,QY); +// assertEquals(g,pubKey.getParameters().getG()); +// assertEquals(Q,pubKey.getQ()); + + assertEquals(pubKeyFormat,parser.getKeyFormat()); + assertEquals(pubKeyType,parser.getKeyType()); + assertEquals(id, parser.getIdentity()); + } } diff --git a/source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/utils/sm/SM2Utils.java b/source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/utils/sm/SM2Utils.java index 47fe9f6c..4267df6d 100644 --- a/source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/utils/sm/SM2Utils.java +++ b/source/crypto/crypto-sm/src/main/java/com/jd/blockchain/crypto/utils/sm/SM2Utils.java @@ -72,8 +72,7 @@ public class SM2Utils { * @return publicKey */ public static byte[] retrievePublicKey(byte[] privateKey) { - ECMultiplier createBasePointMultiplier = new FixedPointCombMultiplier(); - ECPoint publicKeyPoint = createBasePointMultiplier.multiply(DOMAIN_PARAMS.getG(), new BigInteger(1,privateKey)).normalize(); + ECPoint publicKeyPoint = DOMAIN_PARAMS.getG().multiply(new BigInteger(1,privateKey)).normalize(); return publicKeyPoint.getEncoded(false); }