Как сгенерировать PublicKey для PrivateKey в X25519? - PullRequest
1 голос
/ 28 октября 2019

В настоящее время я работаю с шифрованием на основе ключей X25519.

Мой вопрос, в принципе, как извлечь PublicKey из существующего X25519 PrivateKey?

Я нашел код в XDHKeyPairGenerator:

BigInteger publicKey = ops.computePublic(privateKey.clone());

Но этот пакет зависит от платформы, поэтому недоступен. И я не могу найти способ сделать это через общедоступные интерфейсы.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

До сих пор я обнаружил только один способ сделать это через интерфейсы, предоставляемые JDK (без использования дополнительных библиотек, таких как Bouncy Castle или Google Tink):

public class StaticSecureRandom extends SecureRandom {

    private final byte[] privateKey;

    public StaticSecureRandom(byte[] privateKey) {
        this.privateKey = privateKey.clone();
    }

    @Override
    public void nextBytes(byte[] bytes) {
        System.arraycopy(privateKey, 0, bytes, 0, privateKey.length);
    }

}
    public PublicKey generatePublicKeyFromPrivate(PrivateKey privateKey) throws GeneralSecurityException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(X25519);
        keyPairGenerator.initialize(new NamedParameterSpec(X25519), new StaticSecureRandom(getScalar(privateKey)));
        return keyPairGenerator.generateKeyPair().getPublic();
    }

Это не оченьэлегантное решение, но оно работает без каких-либо сторонних библиотек, и я не мог найти другого способа.

0 голосов
/ 28 октября 2019

Вы должны умножить на скаляр закрытый ключ (который является просто большим числом) на точку генератора кривой 25519 .

ЗдесьВот некоторый код на python для иллюстрации:

from tinyec import registry
import secrets

curve = registry.get_curve('curve25519')

def compress_point(point):
    return hex(point.x) + hex(point.y % 2)[2:]


privKey = secrets.randbelow(curve.field.n)
pubKey = privKey * curve.g //the key step for you...


print("private key:", hex(privKey))
print("public key:", compress_point(pubKey))

Если вы дадите мне знать библиотеку Java, я постараюсь помочь вам в дальнейшем.

...