Featured

Програмування SIM карток

UMTC використовує два типи програмованих SIM карток: OYEITIMES (білі китайські) та sysmocom (sysmoUSIM-SJA2/SJS1). Обидва типи підтримують повноцінний LTE, але мають різний workflow програмування.

ℹ️ Що таке Ki та OPC
**Ki** — секретний ключ автентифікації, зашитий в SIM. Ніколи не передається по повітрю. **OPC** — похідний від OP (Operator Key) ключ. UMTC використовує OPC (не OP). **IMSI** — 15-значний ідентифікатор абонента. Для UMTC: `255330000000001` (PLMN 255/33).

OYEITIMES (білі китайські картки)

Програмуються через власний GUI додаток під Windows. Завантажується з сайту виробника разом з USB reader.

Підготовка

  1. Підключи USB reader
  2. Встав картку контактами вниз
  3. Запусти OYEITIMES SIM Editor
  4. Картка має відобразитись у верхній панелі

Workflow програмування

⚠️ Критичний нюанс
**НЕ натискай "Same with GSM"** і не заповнюй ліву (GSM) сторону. Це зіпсує LTE профіль. Заповнюй **тільки праву сторону** — LTE поля.

Поля які треба заповнити (права сторона — LTE):

Поле Приклад Примітка
IMSI (15 digits) 255330000000001 15 цифр, PLMN 255/33
KI 00112233445566778899AABBCCDDEEFF 32 hex символи
OPC 63BFA50EE6523365FF14C1F45F88737D обери OPC radio button, не OP!
ACC 0001 залишити за замовчуванням

Поля які НЕ чіпаємо:
- ICCID — залишити як є (вже прошитий)
- ADM — не змінювати
- Ліва (GSM) колонка — порожня

Порядок дій:
1. Встав значення IMSI15 у відповідне поле
2. Встав KI
3. Вибери radio button "OPC" (не "OP") поруч з полем
4. Встав OPC значення
5. Натисни "Write Card" — і все

💡 Перевірка після запису
Натисни "Read Card" — має відобразити щойно записані значення. Якщо IMSI показується правильно — картка готова.

sysmocom (sysmoUSIM-SJA2 / SJS1)

Програмуються через pySim — Python утиліту від Osmocom. Працює на Linux/macOS/Windows.

Встановлення pySim

git clone https://github.com/osmocom/pysim.git
cd pysim
pip install -r requirements.txt

Програмування картки

# sysmoUSIM-SJA2
./pySim-prog.py -p 0 \
  -t sysmoUSIM-SJA2 \
  -a <ADM_KEY> \
  --mcc 255 --mnc 33 \
  -i 255330000000001 \
  -k 00112233445566778899AABBCCDDEEFF \
  --opc 63BFA50EE6523365FF14C1F45F88737D

# sysmoUSIM-SJS1 (старіша версія)
./pySim-prog.py -p 0 \
  -t sysmoUSIM-SJS1 \
  -a <ADM_KEY> \
  --mcc 255 --mnc 33 \
  -i 255330000000001 \
  -k 00112233445566778899AABBCCDDEEFF \
  --opc 63BFA50EE6523365FF14C1F45F88737D
ℹ️ ADM ключ
ADM ключ надходить разом з карткою від sysmocom (в окремому файлі або email). Для кожної картки унікальний. Зберігай в захищеному місці.

Параметри:
- -p 0 — перший USB reader (якщо є кілька — -p 1, -p 2)
- -t — тип картки (важливо вказати правильно)
- --mcc 255 --mnc 33 — PLMN UMTC
- -i — IMSI (15 цифр)
- -k — Ki ключ
- --opc — OPC ключ (не --op!)

Читання картки

./pySim-read.py -p 0

Виводить IMSI, ICCID та інші параметри. Корисно для перевірки після запису.


Додавання абонента в Open5GS

Після програмування SIM — треба додати абонента в HSS (базу даних Core Network).

Через WebUI

  1. Відкрий http://10.10.10.1:9999 (або адреса VPS)
  2. Subscribers → Add Subscriber
  3. Заповни:
Поле Значення
IMSI 255330000000001
Subscriber Key (K) 00112233445566778899AABBCCDDEEFF
Operator Key (OPc) 63BFA50EE6523365FF14C1F45F88737D
AMF 8000 (за замовчуванням)
APN internet
  1. Натисни Save
⚠️ OPc vs OP в Open5GS
В WebUI є поле "OPc" — переконайся що вводиш саме OPc значення (те ж що записав на картку), а не OP.

Через MongoDB CLI

# На VPS де запущений Open5GS
mongosh open5gs

db.subscribers.insertOne({
  imsi: "255330000000001",
  security: {
    k: "00112233445566778899AABBCCDDEEFF",
    amf: "8000",
    opc: "63BFA50EE6523365FF14C1F45F88737D"
  },
  ambr: {
    downlink: { value: 1, unit: 3 },
    uplink: { value: 1, unit: 3 }
  },
  slice: [{
    sst: 1,
    default_indicator: true,
    session: [{
      name: "internet",
      type: 3,
      ambr: {
        downlink: { value: 1, unit: 3 },
        uplink: { value: 1, unit: 3 }
      },
      qos: { index: 9, arp: { priority_level: 8, pre_emption_capability: 1, pre_emption_vulnerability: 1 } }
    }]
  }]
})

Нумерація IMSI в UMTC

PLMN UMTC: MCC 255, MNC 33 (зарезервований діапазон)

Формат IMSI: 255 33 XXXXXXXXX (9 цифр абонента)

Рекомендована схема нумерації:

Діапазон Призначення
255330000000001255330000000099 Адміністратори / тести
255330000000100255330000000199 1-й підрозділ
255330000000200255330000000299 2-й підрозділ
255330000000900255330000000999 Резерв / запасні

Генерація Ki та OPC

Для кожної картки потрібні унікальні Ki та OPC. Генеруй криптографічно стійкі значення:

# Генерація Ki (32 hex символи = 128 біт)
openssl rand -hex 16

# Генерація OP (з якого потім отримуємо OPC)
openssl rand -hex 16

OPC з OP:

# Python скрипт для обчислення OPC з OP та Ki
from Crypto.Cipher import AES

def compute_opc(ki_hex, op_hex):
    ki = bytes.fromhex(ki_hex)
    op = bytes.fromhex(op_hex)
    cipher = AES.new(ki, AES.MODE_ECB)
    opc = bytes(a ^ b for a, b in zip(cipher.encrypt(op), op))
    return opc.hex().upper()

ki  = "00112233445566778899AABBCCDDEEFF"
op  = "63BFA50EE6523365FF14C1F45F88737D"
print(compute_opc(ki, op))
💡 Спрощення
Простіше записувати OPC напряму (без OP) — і в OYEITIMES, і в Open5GS є поле OPC. Генеруй `openssl rand -hex 16` і використовуй як OPC без проміжного кроку.

Таблиця параметрів карток

Ведіть облік карток у захищеному документі:

ICCID IMSI Ki OPC Статус
1 8938... 2553300000000001 00112... 63BFA... Видана
2 8938... 2553300000000002 AABB... 1234... Запас
🚨 Безпека ключів
Ki та OPC — це секретні ключі. Якщо вони скомпрометовані — зловмисник може клонувати SIM та підключитись до мережі від імені абонента. Зберігай таблицю ключів тільки на зашифрованих носіях.

Troubleshooting

Картка не читається:
- Перевір що картка вставлена правильно (контакти вниз в більшості reader-ів)
- Спробуй інший USB порт
- В pySim: спробуй -p 1 або -p 2

OYEITIMES: "Write failed":
- Картка захищена паролем — потрібен ADM ключ (для деяких OYEITIMES карток)
- Спробуй інший reader

Телефон не підключається після програмування:
- Перевір що IMSI в картці збігається з IMSI в Open5GS
- Перевір що KI однаковий в картці і в Open5GS
- OPC vs OP: переконайся що в обох місцях використовується OPC, не OP
- Перевір PLMN: телефон має знайти мережу 255/33

Open5GS логи для діагностики:

# На VPS
tail -f /var/log/open5gs/hss.log | grep "IMSI"
# Успішна автентифікація: "Authentication of IMSI[255330000000001]"
# Помилка: "MAC failure" — невірний Ki або OPC

Пов'язані статті

  • lte/installation — встановлення LTE стеку
  • ran/srs-epc — Open5GS Core Network конфігурація
  • lte/bbu — ZTE BBU налаштування
  • plmn — що таке PLMN
  • imsi — структура IMSI
  • ki — ключ автентифікації Ki

Шлях: lte/sim-programming.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications