montana/Русский/Бот/СИСТЕМА_КРИПТО_УЗЛА.md

377 lines
10 KiB
Markdown
Raw Permalink Normal View History

# Криптографическая Система Узлов 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 байт
```
**Реализация:**
```python
# 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
---
## Генерация Адреса
### Алгоритм
```python
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
```
### Пример
```python
public_key = "a3f8b2c1d4e5f6789..." # 64 символа
SHA256(public_key) = "72a4c3e8f9b1d5c7..." # 64 символа
[:20] = "72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a" # 40 символов
"mt" + "72a4c3e8..." = "mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a"
```
---
## Регистрация Узла
### API
```python
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
}
```
### Данные Узла
```python
{
"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 # Приоритет в сети
}
```
---
## Подпись и Верификация
### Подпись Транзакции
```python
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 символов
```
### Проверка Подписи
```python
# Любой может проверить подпись по public key
is_valid = verify_signature(public_key, message, signature)
print(is_valid)
# → True (валидная подпись)
```
### Проверка Владения Узлом
```python
# Проверить что у отправителя есть 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 <адрес>`
Показать узел по криптографическому адресу:
```bash
/node mt72a4c3e8f9b1d5c7e2a4f6d8b0e1c3a5f7d9e1a
```
### `/node <alias>`
Показать узел по alias:
```bash
/node amsterdam.efir.org
```
### `/node <ip>` (deprecated)
IP адрес больше НЕ является идентификатором:
```bash
/node 72.56.102.240
# → Показывает узел, но предупреждает:
# "⚠️ IP адрес не является ключом. Используй адрес mt..."
```
### `/register_node` (admin only)
Зарегистрировать новый узел:
```bash
/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](/Users/kh./Python/Ничто_Nothing_无_金元Ɉ/Монтана_Montana_蒙大拿/English/protocol/007_POST_QUANTUM.md)
- **Код:** [node_crypto.py](/Users/kh./Python/Ничто_Nothing_无_金元Ɉ/Монтана_Montana_蒙大拿/Русский/бот/node_crypto.py)
- **Тест:** [test_node_crypto.py](/Users/kh./Python/Ничто_Nothing_无_金元Ɉ/Монтана_Montana_蒙大拿/Русский/бот/test_node_crypto.py)
- **NIST ML-DSA:** [FIPS 204](https://csrc.nist.gov/publications/detail/fips/204/final)
- **NIST ML-KEM:** [FIPS 203](https://csrc.nist.gov/publications/detail/fips/203/final)
---
**Ɉ Montana — Протокол идеальных денег**
*Адрес = Криптографический хеш (не IP)*
*Post-quantum защита от genesis*