Другое

xray x25519: Как получить publicKey из вывода команды

Узнайте, как извлечь publicKey из вывода команды xray x25519. Пошаговые инструкции с примерами кода для преобразования приватного ключа в публичный с помощью OpenSSL и Python.

Как извлечь publicKey из вывода команды xray x25519?

Я пытаюсь использовать команду xray x25519 для генерации пары ключей (privateKey и publicKey), но команда возвращает три значения: PrivatKey, Password и Hash32. Как правильно использовать эти данные для получения публичного ключа?

Команда xray x25519 генерирует X25519 ключевой пара для использования в XRay, но публичный ключ не отображается напрямую в выводе. Для извлечения публичного ключа необходимо использовать приватный ключ с помощью специализированных инструментов или команд, так как XRay возвращает приватный ключ, пароль и хеш, но оставляет преобразование в публичный ключ на усмотрение пользователя.

Содержание

Что возвращает команда xray x25519?

Команда xray x25519 генерирует криптографически безопасный X25519 ключевой пару, но её вывод содержит три основных компонента:

  • PrivateKey - приватный ключ в формате base64
  • Password - сгенерированный пароль для шифрования
  • Hash32 - 32-байтный хеш, используемый для идентификации ключа

Важно понимать, что публичный ключ X25519 вычисляется из приватного ключа по криптографическому алгоритму, поэтому он не отображается напрямую в выводе. Это стандартная практика в криптографии, где публичный ключ представляет собой результат математического преобразования приватного ключа.

Примечание: X25519 (также известный как Curve25519) - это эллиптическая кривая, используемая для обмена ключами в протоколах шифрования. Приватный ключ - это случайное число, а публичный ключ - результат умножения этого числа на базовую точку кривой.

Как извлечь публичный ключ из приватного?

Для преобразования приватного ключа в публичный существует несколько методов:

1. Использование специализированных инструментов

bash
# Использование openssl для преобразования приватного ключа в публичный
echo "YOUR_PRIVATE_KEY_BASE64" | base64 -d | xxd -p -c 32 | \
openssl pkey -inform der -pubout -outform pem

2. Использование Python с библиотекой cryptography

python
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives import serialization
import base64

# Декодируем приватный ключ из base64
private_key_bytes = base64.b64decode("YOUR_PRIVATE_KEY_BASE64")

# Создаем объект приватного ключа
private_key = x25519.X25519PrivateKey.from_private_bytes(private_key_bytes)

# Получаем публичный ключ
public_key = private_key.public_key()

# Сериализуем публичный ключ в формат PEM
public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

print(public_key_pem.decode())

3. Использование командной строки с xxd и openssl

bash
# Преобразование base64 приватного ключа в бинарный формат
echo "YOUR_PRIVATE_KEY_BASE64" | base64 -d > private_key.bin

# Извлечение публичного ключа
openssl pkey -in private_key.bin -inform der -pubout

Практические примеры использования

Пример 1: Полный цикл генерации и преобразования

bash
# 1. Генерация ключевой пары
xray x25519

# Вывод будет содержать:
# PrivateKey: base64-encoded-private-key
# Password: generated-password
# Hash32: hash32-value

# 2. Сохранение приватного ключа
echo "YOUR_PRIVATE_KEY_BASE64" > private.key

# 3. Преобразование в публичный ключ с помощью Python
python3 -c "
import base64
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives import serialization

private_key_b64 = 'YOUR_PRIVATE_KEY_BASE64'
private_key_bytes = base64.b64decode(private_key_b64)
private_key = x25519.X25519PrivateKey.from_private_bytes(private_key_bytes)
public_key = private_key.public_key()

public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_key_pem.decode())
"

Пример 2: Автоматизация процесса

bash
#!/bin/bash

# Генерация ключей
KEYS=$(xray x25519)
PRIVATE_KEY=$(echo "$KEYS" | grep "PrivateKey:" | cut -d' ' -f2)

# Извлечение публичного ключа
PUBLIC_KEY=$(echo "$PRIVATE_KEY" | base64 -d | xxd -p -c 32 | \
    openssl pkey -inform der -pubout -outform pem)

echo "Приватный ключ:"
echo "$PRIVATE_KEY"
echo ""
echo "Публичный ключ:"
echo "$PUBLIC_KEY"

Инструменты для работы с ключами

1. Стандартные инструменты Linux

  • openssl - универсальный инструмент для работы с криптографией
  • xxd - для преобразования между текстом и бинарными данными
  • base64 - для кодирования/декодирования base64

2. Python библиотеки

  • cryptography - современная библиотека для криптографических операций
  • pyopenssl - обертка над OpenSSL для Python

3. Специализированные утилиты

  • wg (WireGuard) - может работать с X25519 ключами
  • keyctl - для управления ключами в ядре Linux

Пример использования библиотеки cryptography:

python
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives import serialization
import base64
import os

def generate_x25519_keypair():
    """Генерация X25519 ключевой пары"""
    private_key = x25519.X25519PrivateKey.generate()
    public_key = private_key.public_key()
    
    # Сериализация ключей
    private_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )
    
    public_pem = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    
    return private_pem, public_pem

# Использование
private_key, public_key = generate_x25519_keypair()
print("Приватный ключ:\n", private_key.decode())
print("Публичный ключ:\n", public_key.decode())

Настройка XRay с сгенерированными ключами

После извлечения публичного ключа его можно использовать в конфигурации XRay:

Пример конфигурации XRay:

json
{
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "YOUR_USER_ID",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "dest": 80
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "certificates": [
            {
              "certificateFile": "server.crt",
              "keyFile": "server.key"
            }
          ]
        },
        "xtlsSettings": {
          "minVersion": "1.2",
          "preferServerCipherSuites": true,
          "certificates": [
            {
              "certificateFile": "server.crt",
              "keyFile": "server.key"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}

Интеграция с WireGuard совместимыми ключами:

Если вам нужна совместимость с WireGuard, формат ключей будет другим:

bash
# Преобразование X25519 ключей в формат WireGuard
wg genkey | tee privatekey | wg pubkey > publickey

Заключение

  1. Команда xray x25519 не возвращает публичный ключ напрямую - она генерирует приватный ключ, пароль и хеш, оставляя вычисление публичного ключа на усмотрение пользователя.

  2. Для извлечения публичного ключа необходимо использовать криптографические библиотеки или инструменты, такие как OpenSSL, которые могут выполнить математическое преобразование приватного ключа в публичный.

  3. Наиболее удобный способ - использование Python с библиотекой cryptography, которая предоставляет простые методы для работы с X25519 ключами.

  4. Публичный ключ X25519 всегда имеет длину 32 байта и может быть представлен в различных форматах: base64, PEM, hex или бинарном.

  5. Для автоматизации процесса рекомендуется создать скрипт, который будет выполнять генерацию ключей и их преобразование в один шаг.

Источники

  1. Official XRay Documentation - Key Generation
  2. Cryptography Library Documentation - X25519 Keys
  3. OpenSSL Command Line Documentation
  4. WireGuard Protocol Specification
  5. Curve25519 Cryptography Overview
Авторы
Проверено модерацией
Модерация