Key Agreement with Curve25519
and Curve448
= Uzgodnienie klucza z (krzywymi
eliptycznymi) Curve25519
oraz Curve448
.
Źródło: https://openjdk.java.net/jeps/324
JCA API obsługuje m. in. kryptografię z użyciem krzywych
eliptycznych (według RFC 7748).
W Java 11 zaimplementowano uzgodnienie kluczy przy użyciu krzywej Curve25519
i krzywej Curve448
.
Krzywe te są opisane w wyżej wymienionym RFC.
Powyższa implementacja nie została włączona w nową implementację TLS 1.3.
Klasa MainKeyAgree
package keyagreement; import javax.crypto.KeyAgreement; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.NamedParameterSpec; import java.security.spec.XECPublicKeySpec; public class MainKeyAgree { public static void main(String[] args) { KeyPairGenerator kpg = null; try { kpg = KeyPairGenerator.getInstance("XDH"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } NamedParameterSpec paramSpec = new NamedParameterSpec("X25519"); try { kpg.initialize(paramSpec); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } KeyPair kp = kpg.generateKeyPair(); KeyFactory kf = null; try { kf = KeyFactory.getInstance("XDH"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } BigInteger u = new BigInteger("14781619447589544791020593568409986887264606134616475288964881837755586237401"); XECPublicKeySpec pubSpec = new XECPublicKeySpec(paramSpec, u); PublicKey pubKey = null; try { pubKey = kf.generatePublic(pubSpec); } catch (InvalidKeySpecException e) { e.printStackTrace(); } KeyAgreement ka = null; try { ka = KeyAgreement.getInstance("XDH"); try { ka.init(kp.getPrivate()); } catch (InvalidKeyException e) { e.printStackTrace(); } try { ka.doPhase(pubKey, true); } catch (InvalidKeyException e) { e.printStackTrace(); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } byte[] secret = ka.generateSecret(); System.out.println(secret.length); //Sprawdzamy długosć tablicy String str = new String(secret, StandardCharsets.UTF_8); //Przekształcamy w string z ciekawości System.out.println(str); //Drukujemy } }
Wynik
32 ikt��;2�����k��a�s�߫�1M���_
Uwagi
Powyżej przedstawiłam nieco zmienioną i uzupełnioną klasę przykładu z JEP 324