Zielony Smok - logo witryny

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