10 KiB
10 KiB
Криптографическая Система Узлов Montana
POST-QUANTUM КРИПТОГРАФИЯ ML-DSA-65 (FIPS 204)
MAINNET READY — Post-quantum криптография активна с genesis.
Обзор
Узлы Montana используют криптографические адреса вместо IP адресов для идентификации кошельков. Все операции защищены ML-DSA-65 (FIPS 204) — post-quantum алгоритмом.
Защита от Атак
- ✅ Квантовые компьютеры — ML-DSA-65 устойчив к Shor's algorithm
- ✅ Harvest now, decrypt later — данные защищены от будущей дешифровки
- ✅ IP hijacking — адрес не зависит от IP
- ✅ DNS spoofing — alias только для удобства
- ✅ Man-in-the-middle — все операции подписаны ML-DSA-65
- ✅ Подделка транзакций — требуется private key (4032 байта)
Архитектура Адресов
Пользователи
Адрес = Telegram ID
Ключ = Telegram Session
Пример: 123456789
Узлы
Адрес = mt + SHA256(public_key)[:20].hex()
Ключ = Private key ML-DSA-65 (4032 байта)
Public key = 1952 байта
Подпись = 3309 байт
Пример: mt1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0
Формат Адреса Узла
Структура
mt + SHA256(public_key)[:20].hex()
│ └─ Первые 20 байт (40 hex символов) SHA256 хеша
└─ Префикс Montana
Пример:
mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a
Длина
- Префикс: 2 символа (
mt) - Hash: 40 hex символов (20 байт)
- Всего: 42 символа
Криптографические Алгоритмы
MAINNET: ML-DSA-65 (FIPS 204)
Текущая реализация — POST-QUANTUM:
- ✅ Post-quantum защита (lattice-based)
- ✅ NIST Level 3 security (128-bit post-quantum)
- ✅ Защита от Shor's algorithm
- ✅ FIPS 204 стандарт
- ✅ Защита от "harvest now, decrypt later"
Параметры ML-DSA-65:
Private key: 4032 байта
Public key: 1952 байта
Signature: 3309 байт
Реализация:
# node_crypto.py
from dilithium_py.ml_dsa import ML_DSA_65
def generate_keypair():
public_key, private_key = ML_DSA_65.keygen()
return private_key.hex(), public_key.hex()
def sign_message(private_key_hex: str, message: str) -> str:
private_bytes = bytes.fromhex(private_key_hex)
message_bytes = message.encode('utf-8')
signature = ML_DSA_65.sign(private_bytes, message_bytes)
return signature.hex()
def verify_signature(public_key_hex: str, message: str, signature_hex: str) -> bool:
public_bytes = bytes.fromhex(public_key_hex)
message_bytes = message.encode('utf-8')
signature = bytes.fromhex(signature_hex)
return ML_DSA_65.verify(public_bytes, message_bytes, signature)
Статус: MAINNET READY
Миграция завершена:
Q1 2026: Ed25519→ ML-DSA-65 MAINNET- Q2-Q4 2026: Post-quantum защита с genesis
Генерация Адреса
Алгоритм
def public_key_to_address(public_key_hex: str) -> str:
"""
Преобразует public key в адрес кошелька Montana
Формат: mt + SHA256(public_key)[:20].hex()
"""
# 1. Конвертируем hex в bytes
public_bytes = bytes.fromhex(public_key_hex)
# 2. SHA256 хеш
hash_bytes = hashlib.sha256(public_bytes).digest()
# 3. Первые 20 байт
address_bytes = hash_bytes[:20]
# 4. Hex + префикс
address = "mt" + address_bytes.hex()
return address
Пример
public_key = "a3f8b2c1d4e5f6789..." # 64 символа
↓
SHA256(public_key) = "72a4c3e8f9b1d5c7..." # 64 символа
↓
[:20] = "72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a" # 40 символов
↓
"mt" + "72a4c3e8..." = "mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a"
Регистрация Узла
API
from node_crypto import get_node_crypto_system
ncs = get_node_crypto_system()
# Регистрация нового узла
result = ncs.register_node(
owner_telegram_id=123456789,
node_name="tokyo",
location="🇯🇵 Tokyo",
ip_address="1.2.3.4",
node_type="light"
)
# Результат
{
"success": True,
"address": "mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a",
"public_key": "a3f8b2c1d4e5...",
"private_key": "f9d8c7b6a5e4...", # ⚠️ СОХРАНИ В БЕЗОПАСНОМ МЕСТЕ!
"alias": "tokyo.efir.org",
"owner": 123456789
}
Данные Узла
{
"address": "mt72a4c3e8...", # Адрес кошелька
"public_key": "a3f8b2c1...", # Public key
"owner": 123456789, # Telegram ID владельца
"node_name": "tokyo", # Короткое имя
"alias": "tokyo.efir.org", # Alias для удобства
"location": "🇯🇵 Tokyo", # Локация
"ip": "1.2.3.4", # IP (только для networking!)
"type": "light", # Тип узла
"official": False, # Официальный или нет
"priority": 10 # Приоритет в сети
}
Подпись и Верификация
Подпись Транзакции
from node_crypto import sign_message, verify_signature
# Владелец подписывает сообщение своим private key
message = "Transfer 500 seconds to mt9876543210"
signature = sign_message(private_key, message)
print(signature)
# → "a7f8b3c2d1e4f5678..." # 128 hex символов
Проверка Подписи
# Любой может проверить подпись по public key
is_valid = verify_signature(public_key, message, signature)
print(is_valid)
# → True (валидная подпись)
Проверка Владения Узлом
# Проверить что у отправителя есть private key узла
is_owner = ncs.verify_node_ownership(
address="mt72a4c3e8...",
message="Transfer 500 seconds",
signature_hex="a7f8b3c2d1..."
)
if is_owner:
# Выполнить перевод
bank.send("mt72a4c3e8...", "mt9876543210", 500)
else:
# Отклонить (атака!)
print("❌ Подпись невалидна")
Защита от Атак
1. IP Hijacking
Атака:
Атакующий поднимает сервер с тем же IP 72.56.102.240
↓
Пытается получить доступ к кошельку узла
Защита:
IP адрес НЕ является ключом к кошельку
↓
Адрес кошелька = mt + SHA256(public_key)
↓
Без private key — доступ НЕВОЗМОЖЕН
2. DNS Spoofing
Атака:
Атакующий подменяет DNS:
amsterdam.efir.org → 6.6.6.6 (поддельный IP)
Защита:
Alias только для удобства
↓
Реальный адрес = mt72a4c3e8... (криптографический)
↓
DNS не влияет на адрес кошелька
3. Man-in-the-Middle
Атака:
Перехват и модификация сообщений между узлами
Защита:
Все операции подписаны ML-DSA-65
↓
Модифицированное сообщение → невалидная подпись
↓
Атака обнаружена и заблокирована
4. Подделка Транзакций
Атака:
Атакующий пытается отправить:
"Transfer 9999 seconds from mt72a4c3e8... to attacker"
Защита:
Для транзакции нужна подпись private key узла
↓
У атакующего нет private key
↓
verify_signature() → False
↓
Транзакция отклонена
Команды Бота
/node <адрес>
Показать узел по криптографическому адресу:
/node mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a
/node <alias>
Показать узел по alias:
/node amsterdam.efir.org
/node <ip> (deprecated)
IP адрес больше НЕ является идентификатором:
/node 72.56.102.240
# → Показывает узел, но предупреждает:
# "⚠️ IP адрес не является ключом. Используй адрес mt..."
/register_node (admin only)
Зарегистрировать новый узел:
/register_node tokyo "🇯🇵 Tokyo" 1.2.3.4 123456789 light
Технические Спецификации
ML-DSA-65 (MAINNET)
| Параметр | Значение |
|---|---|
| Алгоритм | ML-DSA-65 (Dilithium) |
| Стандарт | FIPS 204 |
| Security Level | NIST Level 3 (128-bit post-quantum) |
| Размер private key | 4032 байта |
| Размер public key | 1952 байта |
| Размер подписи | 3309 байт |
| Квантовая защита | ✅ С GENESIS |
Ссылки
- Протокол: 007_POST_QUANTUM.md
- Код: node_crypto.py
- Тест: test_node_crypto.py
- NIST ML-DSA: FIPS 204
- NIST ML-KEM: FIPS 203
Ɉ Montana — Протокол идеальных денег
Адрес = Криптографический хеш (не IP)
Post-quantum защита от genesis