Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Encryption using Elliptic Curves and Diffie-Hellman key exchanges
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.Enumeration;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyAgreement;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
public class Test {
public static byte[] iv = new SecureRandom().generateSeed(16);
public static void main(String[] args) {
String plainText = "Look mah, I'm a message!";
System.out.println("Original plaintext message: " + plainText);
// Initialize two key pairs
KeyPair keyPairA = generateECKeys();
KeyPair keyPairB = generateECKeys();
// Create two AES secret keys to encrypt/decrypt the message
SecretKey secretKeyA = generateSharedSecret(keyPairA.getPrivate(),
keyPairB.getPublic());
SecretKey secretKeyB = generateSharedSecret(keyPairB.getPrivate(),
keyPairA.getPublic());
// Encrypt the message using 'secretKeyA'
String cipherText = encryptString(secretKeyA, plainText);
System.out.println("Encrypted cipher text: " + cipherText);
// Decrypt the message using 'secretKeyB'
String decryptedPlainText = decryptString(secretKeyB, cipherText);
System.out.println("Decrypted cipher text: " + decryptedPlainText);
}
public static KeyPair generateECKeys() {
try {
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
"ECDH", "BC");
keyPairGenerator.initialize(parameterSpec);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
return keyPair;
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException
| NoSuchProviderException e) {
e.printStackTrace();
return null;
}
}
public static SecretKey generateSharedSecret(PrivateKey privateKey,
PublicKey publicKey) {
try {
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "BC");
keyAgreement.init(privateKey);
keyAgreement.doPhase(publicKey, true);
SecretKey key = keyAgreement.generateSecret("AES");
return key;
} catch (InvalidKeyException | NoSuchAlgorithmException
| NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static String encryptString(SecretKey key, String plainText) {
try {
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
byte[] plainTextBytes = plainText.getBytes("UTF-8");
byte[] cipherText;
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
cipherText = new byte[cipher.getOutputSize(plainTextBytes.length)];
int encryptLength = cipher.update(plainTextBytes, 0,
plainTextBytes.length, cipherText, 0);
encryptLength += cipher.doFinal(cipherText, encryptLength);
return bytesToHex(cipherText);
} catch (NoSuchAlgorithmException | NoSuchProviderException
| NoSuchPaddingException | InvalidKeyException
| InvalidAlgorithmParameterException
| UnsupportedEncodingException | ShortBufferException
| IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
return null;
}
}
public static String decryptString(SecretKey key, String cipherText) {
try {
Key decryptionKey = new SecretKeySpec(key.getEncoded(),
key.getAlgorithm());
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
byte[] cipherTextBytes = hexToBytes(cipherText);
byte[] plainText;
cipher.init(Cipher.DECRYPT_MODE, decryptionKey, ivSpec);
plainText = new byte[cipher.getOutputSize(cipherTextBytes.length)];
int decryptLength = cipher.update(cipherTextBytes, 0,
cipherTextBytes.length, plainText, 0);
decryptLength += cipher.doFinal(plainText, decryptLength);
return new String(plainText, "UTF-8");
} catch (NoSuchAlgorithmException | NoSuchProviderException
| NoSuchPaddingException | InvalidKeyException
| InvalidAlgorithmParameterException
| IllegalBlockSizeException | BadPaddingException
| ShortBufferException | UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
public static String bytesToHex(byte[] data, int length) {
String digits = "0123456789ABCDEF";
StringBuffer buffer = new StringBuffer();
for (int i = 0; i != length; i++) {
int v = data[i] & 0xff;
buffer.append(digits.charAt(v >> 4));
buffer.append(digits.charAt(v & 0xf));
}
return buffer.toString();
}
public static String bytesToHex(byte[] data) {
return bytesToHex(data, data.length);
}
public static byte[] hexToBytes(String string) {
int length = string.length();
byte[] data = new byte[length / 2];
for (int i = 0; i < length; i += 2) {
data[i / 2] = (byte) ((Character.digit(string.charAt(i), 16) << 4) + Character
.digit(string.charAt(i + 1), 16));
}
return data;
}
}
Original plaintext message: Look mah, I'm a message!
Encrypted cipher text: 7AFCF3F9A6213FA6900D3DFC12553379580FC7AD362E2C2E28F548FC2AF42F07CF2B057537376F36
Decrypted cipher text: Look mah, I'm a message!
@ankushgoyal27

This comment has been minimized.

Copy link

@ankushgoyal27 ankushgoyal27 commented Mar 10, 2015

Hi,

When I am using the above algorithm I am getting below error

Original plaintext message: Look mah, I'm a message!
java.security.NoSuchProviderException: no such provider: BC
at sun.security.jca.GetInstance.getService(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.KeyPairGenerator.getInstance(Unknown Source)
at Test.generateECKeys(Test.java:57)
at Test.main(Test.java:36)
java.security.NoSuchProviderException: no such provider: BC
at sun.security.jca.GetInstance.getService(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at java.security.KeyPairGenerator.getInstance(Unknown Source)
at Test.generateECKeys(Test.java:57)
at Test.main(Test.java:37)
Exception in thread "main" java.lang.NullPointerException

at Test.main(Test.java:40)

Then I had included the below statement in the main class

" Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());"

Then getting the below error

Original plaintext message: Look mah, I'm a message!
java.security.InvalidKeyException: Illegal key size
Encrypted cipher text: null
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1024)
at javax.crypto.Cipher.init(Cipher.java:1345)
at javax.crypto.Cipher.init(Cipher.java:1282)
at Test.encryptString(Test.java:95)
at Test.main(Test.java:46)
Exception in thread "main" java.lang.NullPointerException
at Test.hexToBytes(Test.java:157)
at Test.decryptString(Test.java:118)
at Test.main(Test.java:50)
....

Please help.

Also let me know what are the required jars.

Thanks in advance

@vincentcox

This comment has been minimized.

Copy link

@vincentcox vincentcox commented Apr 4, 2016

Did you found a solution in the meantime? I am experiencing the same thing.

@jonporu

This comment has been minimized.

Copy link

@jonporu jonporu commented Aug 23, 2016

Hi,

I tried to add the lines of code below. It's working fine. :)

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try {
SecureRandom rng = SecureRandom.getInstance("SHA1PRNG");
rng.setSeed(711);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

@abbasheile

This comment has been minimized.

Copy link

@abbasheile abbasheile commented Nov 30, 2016

https://gist.github.com/jonporu
Hi,

kindly, where have you added that code?

@thihasoe

This comment has been minimized.

Copy link

@thihasoe thihasoe commented Mar 1, 2017

The above is working if with this complement
add this line to start of main method

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

and for Illegal key size issue, please download UnlimitedJCEPolicyJDK from oracle and override/paste to java_home/jre/security/lib

hope this will help you guys!

@Tapaswini-S

This comment has been minimized.

Copy link

@Tapaswini-S Tapaswini-S commented Jun 9, 2017

(1)I added the jar file UnlimitedJCEPolicyJDK
(2)I added Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); @ beginning
still i am getting this error pl. help me ....
Original plaintext message: Look mah, I'm a message!
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
Encrypted cipher text: null
Decrypted cipher text: null
at Test.encryptString(Test.java:86)
at Test.main(Test.java:40)
java.lang.NullPointerException
at Test.hexToBytes(Test.java:140)
at Test.decryptString(Test.java:105)
at Test.main(Test.java:44)

@angom3

This comment has been minimized.

Copy link

@angom3 angom3 commented Aug 13, 2017

While installing UnlimitedJCEPolicyJDK, download the version that matches your installed JVM and copy local_policy.jar and US_export_policy.jar to the $JAVA_HOME/jre/lib/security (Note: these jars will be already there so you have to overwrite them).

@shikhadongre09

This comment has been minimized.

Copy link

@shikhadongre09 shikhadongre09 commented Oct 24, 2017

Please help me to solve this problem.

java.security.InvalidAlgorithmParameterException: null parameter passed but no implicitCA set
at org.bouncycastle.jce.provider.asymmetric.ec.KeyPairGenerator$EC.initialize(KeyPairGenerator.java:230)
at java.security.KeyPairGenerator.initialize(KeyPairGenerator.java:411)
at controller.Test.generateECKeys(Test.java:76)
at controller.Test.main(Test.java:53)
java.security.InvalidAlgorithmParameterException: null parameter passed but no implicitCA set
at org.bouncycastle.jce.provider.asymmetric.ec.KeyPairGenerator$EC.initialize(KeyPairGenerator.java:230)
at java.security.KeyPairGenerator.initialize(KeyPairGenerator.java:411)
at controller.Test.generateECKeys(Test.java:76)
at controller.Test.main(Test.java:54)
Exception in thread "main" java.lang.NullPointerException
at controller.Test.main(Test.java:57)

@arabsiphone

This comment has been minimized.

Copy link

@arabsiphone arabsiphone commented Feb 26, 2018

Fuck u

@Kruxinator

This comment has been minimized.

Copy link

@Kruxinator Kruxinator commented Mar 20, 2018

replace "BC" with new org.bouncycastle.jce.provider.BouncyCastleProvider() and remove NoSuchProviderException

@isha3026

This comment has been minimized.

Copy link

@isha3026 isha3026 commented May 6, 2018

How can i remove this exception??
java.lang.SecurityException: no manifest section for signature file entry org/bouncycastle/jce/provider/JDKMessageDigest$RIPEMD256.class
at sun.security.util.SignatureFileVerifier.verifySection(SignatureFileVerifier.java:608)
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:341)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:263)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:275)
at java.util.jar.JarVerifier.update(JarVerifier.java:230)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
at java.util.jar.JarFile.getInputStream(JarFile.java:450)
at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:977)
at sun.misc.Resource.cachedInputStream(Resource.java:77)
at sun.misc.Resource.getByteBuffer(Resource.java:160)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:454)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" C:\Users\user\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 2 seconds)

@sourabhlodha

This comment has been minimized.

Copy link

@sourabhlodha sourabhlodha commented May 12, 2018

Hi Team ,

I am try to convert KeyPair to String but unfortunately I am not able to convert String to KeyPair. Can you help me out in this.
Below is mention which I try.
KeyPair keyPairA = generateECKeys();
String p= keyPairA.toString();
//Need again to convert p to KeyPair

@Chandu456

This comment has been minimized.

Copy link

@Chandu456 Chandu456 commented May 26, 2019

\Jarfiles>javac Test.java
Test.java:23: error: package org.bouncycastle does not exist
import org.bouncycastle.*;
^
Test.java:24: error: package org.bouncycastle.jce.spec does not exist
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
^
Test.java:54: error: cannot find symbol
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1");
^
symbol: class ECNamedCurveParameterSpec
location: class Test
Test.java:54: error: cannot find symbol
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1");
^
symbol: variable ECNamedCurveTable
location: class Test
4 errors
Iam getting these errors please help me out

@tamilairy

This comment has been minimized.

Copy link

@tamilairy tamilairy commented Jul 18, 2019

Security Provider "BC" will not work from API level 28.

Try to add SpongyCastle manually:
Security.insertProviderAt(new BouncyCastleProvider(), 1);

add this to your build.gradle dependencies:

/* spongy castle */
implementation "com.madgag.spongycastle:core:1.58.0.0"
implementation "com.madgag.spongycastle:prov:1.58.0.0"

Make sure the BouncyCastleProvider() was coming from spongycastle:
import org.spongycastle.jce.provider.BouncyCastleProvider

@buddingleader

This comment has been minimized.

Copy link

@buddingleader buddingleader commented Jul 19, 2019

Excuse me, I have occurred an error NoSuchAlgorithmException:

    java.lang.RuntimeException: Unable to start service com.example.helloworld.crypto.ecc.ECCService@1732d6 with Intent { cmp=com.example.helloworld/.crypto.ecc.ECCService (has extras) }: java.security.NoSuchAlgorithmException: no such algorithm: ECDH for provider BC
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3346)
        at android.app.ActivityThread.-wrap21(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6169)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
     Caused by: java.security.NoSuchAlgorithmException: no such algorithm: ECDH for provider BC
        at sun.security.jca.GetInstance.getService(GetInstance.java:87)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
        at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:286)
        at com.example.helloworld.crypto.ecc.ECDH.generateKeyPair(ECDH.kt:11)
        at com.example.helloworld.crypto.ecc.ECCService.testECDH(ECCService.kt:57)
        at com.example.helloworld.crypto.ecc.ECCService.onStartCommand(ECCService.kt:16)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3329)
        at android.app.ActivityThread.-wrap21(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6169) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781

It's my code:

class ECDH {
    fun generateKeyPair(): KeyPair {
        val parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1")
        val keyPairGenerator = KeyPairGenerator.getInstance("ECDH", "BC")

        keyPairGenerator.initialize(parameterSpec)
        return keyPairGenerator.generateKeyPair()
    }

    fun generateSharedSecret(privateKey: PrivateKey, publicKey: PublicKey): SecretKey? {
        val keyAgreement = KeyAgreement.getInstance("ECDH", "BC")
        keyAgreement.init(privateKey)
        keyAgreement.doPhase(publicKey, true)

        return keyAgreement.generateSecret("AES")
    }
}

private fun testECDH() {
        Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())
        var providers = Security.getProviders()
        for (providers in providers) {
            println("providers: $providers")
        }

        val ecdh = ECDH()
        val keyPair = ecdh.generateKeyPair()
        val keyPair1 = ecdh.generateKeyPair()
        var secretKey = ecdh.generateSharedSecret(keyPair.private, keyPair1.public)
        var secretKey1 = ecdh.generateSharedSecret(keyPair1.private, keyPair.public)
        println("secretKey:$secretKey")
        println("secretKey1:$secretKey1")
    }
@buddingleader

This comment has been minimized.

Copy link

@buddingleader buddingleader commented Jul 19, 2019

\Jarfiles>javac Test.java
Test.java:23: error: package org.bouncycastle does not exist
import org.bouncycastle.*;
^
Test.java:24: error: package org.bouncycastle.jce.spec does not exist
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
^
Test.java:54: error: cannot find symbol
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1");
^
symbol: class ECNamedCurveParameterSpec
location: class Test
Test.java:54: error: cannot find symbol
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1");
^
symbol: variable ECNamedCurveTable
location: class Test
4 errors
Iam getting these errors please help me out

You can download it at https://www.bouncycastle.org/latest_releases.html, and then put it in you project libs.

@buddingleader

This comment has been minimized.

Copy link

@buddingleader buddingleader commented Jul 19, 2019

Excuse me, I have occurred an error NoSuchAlgorithmException:

    java.lang.RuntimeException: Unable to start service com.example.helloworld.crypto.ecc.ECCService@1732d6 with Intent { cmp=com.example.helloworld/.crypto.ecc.ECCService (has extras) }: java.security.NoSuchAlgorithmException: no such algorithm: ECDH for provider BC
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3346)
        at android.app.ActivityThread.-wrap21(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6169)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
     Caused by: java.security.NoSuchAlgorithmException: no such algorithm: ECDH for provider BC
        at sun.security.jca.GetInstance.getService(GetInstance.java:87)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
        at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:286)
        at com.example.helloworld.crypto.ecc.ECDH.generateKeyPair(ECDH.kt:11)
        at com.example.helloworld.crypto.ecc.ECCService.testECDH(ECCService.kt:57)
        at com.example.helloworld.crypto.ecc.ECCService.onStartCommand(ECCService.kt:16)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3329)
        at android.app.ActivityThread.-wrap21(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6169) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781

It's my code:

class ECDH {
    fun generateKeyPair(): KeyPair {
        val parameterSpec = ECNamedCurveTable.getParameterSpec("brainpoolp256r1")
        val keyPairGenerator = KeyPairGenerator.getInstance("ECDH", "BC")

        keyPairGenerator.initialize(parameterSpec)
        return keyPairGenerator.generateKeyPair()
    }

    fun generateSharedSecret(privateKey: PrivateKey, publicKey: PublicKey): SecretKey? {
        val keyAgreement = KeyAgreement.getInstance("ECDH", "BC")
        keyAgreement.init(privateKey)
        keyAgreement.doPhase(publicKey, true)

        return keyAgreement.generateSecret("AES")
    }
}

private fun testECDH() {
        Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())
        var providers = Security.getProviders()
        for (providers in providers) {
            println("providers: $providers")
        }

        val ecdh = ECDH()
        val keyPair = ecdh.generateKeyPair()
        val keyPair1 = ecdh.generateKeyPair()
        var secretKey = ecdh.generateSharedSecret(keyPair.private, keyPair1.public)
        var secretKey1 = ecdh.generateSharedSecret(keyPair1.private, keyPair.public)
        println("secretKey:$secretKey")
        println("secretKey1:$secretKey1")
    }

I solved the problem,
change KeyPairGenerator.getInstance("ECDH", "BC") to KeyPairGenerator.getInstance("ECDH", org.bouncycastle.jce.provider.BouncyCastleProvider())

@srahulk1

This comment has been minimized.

Copy link

@srahulk1 srahulk1 commented Jan 27, 2020

@ zcdziura Hi, I just wanted to understand the example which you have shared uses an asymmetric form of encryption or symmetric. I am asking this question as to when I implemented this solution and after generating a shared secret I am getting both the key as same. So I am a bit doubtful about this. It will be great if you can help me to understand this.

@simranss

This comment has been minimized.

Copy link

@simranss simranss commented Apr 10, 2021

The private and public keys are the same in the keypair.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment