377 lines
10 KiB
Markdown
377 lines
10 KiB
Markdown
# Криптографическая Система Узлов 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*
|