Уважаемые пользователи ресурса, ни-какой политики на форуме!
Никаких нациалистических взглядов.
Используйте ресурс по назначению!
На аватарках ни какой символики, причисляющей Вас к каким либо группам!
Не провоцируйте других участников.

Modbus RTU с крипто-ключом

Ответить
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Modbus RTU с крипто-ключом

Сообщение testosteron »

Modbus

https://www.modbus.org/

документация:
----------------------------------------------------------------------------------------
Modbus через последовательную линию
только для устаревших приложений от 1996 года.
не используйте её для новых реализаций.
modbusoverseriallegacy.pdf
----------------------------------------------------------------------------------------
MODBUS over Serial Line Specification and Implementation Guide V1.02
modbusoverserial.pdf
----------------------------------------------------------------------------------------
от Алексея
Modbus_over_serial_line_V1_02.pdf
Modbus_Application_Protocol_V1_1b3.pdf
----------------------------------------------------------------------------------------
Modbus RTU Slave: Описание карты переменных
https://radsel.ru/files/docs/ccu-modbus ... j171698020

Описание протокола Modbus RTU
https://ipc2u.ru/articles/prostye-reshe ... b958302610
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU

Сообщение testosteron »

Библиотеки Modbus RTU:

Modbus-STM32-HAL-FreeRTOS
https://osrtos.com/library/alejoseb-mod ... hatgpt.com

FreeModbus
https://habr.com/ru/articles/279747/?ys ... z189851540
https://www.pvsm.ru/stm32/171050?ysclid ... q974229388
( может у кого готовая есть ? )

В VisualStudio есть готовая!
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU

Сообщение testosteron »

Цифровая подпись

ассиметричное шифрование
закрытый ключ → подписывает
открытый ключ → проверяет

Ed25519 - это алгоритм цифровой подписи

Если Ed25519, то библиотеки такие: Monocypher или TweetNaCl, так-же wolfCrypt и libsodium.

для МК есть библиотека на С - micro-ecc
не использует аппаратное ускорение
Реализует:
Цифровые подписи (ECDSA) - это и нужно
Обмен ключами (ECDH)
// документацию прикрепил
ссылки:
http://kmackay.ca/micro-ecc/
https://github.com/kmackay/micro-ecc
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU

Сообщение testosteron »

Упрощенный пример математики
----------------------------------------------------------------------------------------------
https://symbl.cc/en/unicode-table/#comb ... ical-marks
тут можно скопировать значение степени для вставки на форум
----------------------------------------------------------------------------------------------

Пример расчета:

----------------------------
RSA
Выбираем простые числа.
например:
p=5
q=11

----------------------------
считаем модуль
n=p⋅q = 5⋅11=55
n=55

----------------------------
считаем функцию Эйлера
φ(n)=(p−1)(q−1)=4⋅10=40
φ(n)=40

----------------------------
выбираем открытый ключ "e"
Берём число, которое взаимно просто с 40:
// что это значит:
// у числа "e" и числа "40" не должно быть общих делителей кроме "1".
// То есть:
// НОД(e,40)=1

итого: открытый ключ e=3
e=3
----------------------------
находим закрытый ключ "d"

Нужно:
e⋅d≡1(mod 40) ----- Знак "mod" означает - какой остаток получится при делении на 40

Пробуем:
3⋅27=81
81 mod 40 =1 ( 81/40=2 и остаток 1 - оно то нам и нужно. )

Значит:
d=27

Итого ключи:
Открытый ключ: (e=3,n=55)
Закрытый ключ: (d=27,n=55)

----------------------------
Пусть сообщение — какое то число:
M=7
----------------------------
"Хэш" (максимально упрощённо)
H(M)=7
(в реальности это SHA-256, но здесь просто число)

----------------------------
Подпись (ключевой момент)
Формула RSA подписи:
S=H(M) ͩ mod n -------- ( в степени "d" )

Подставляем значения:
S=7²⁷ mod 55 ------ ( 7 в степени 27 , остаток от деления на 55 )

Считаем по шагам (быстро через степени):

7²⁷ = 65712362363534280139543
65712362363534280139543 : 55 = 1194770224791532366173,5090909091
выбираем только целое число = 1194770224791532366173
теперь считаем сколько целых было: 1194770224791532366173 * 55 = 65712362363534280139515
считаем остаток: 65712362363534280139543 - 65712362363534280139515 = 28
S=28
Подпись получена.

----------------------------------

сообщение: 7
подпись: 28

----------------------------------

Проверка подписи :

Проверяющий знает:
e=3 ( открытый ключ )
n=55 ( модуль )
S=28 ( подпись )

Формула проверки: H′=S ͤ mod n

Подставляем: H′=28³ mod 55

H′=21952 mod 55

ищем остаток от деления на 55
21952 / 55 = 399,12727272727272727272727272727
оставляем только целую часть = 399
считаем 399 * 55 = 21945
находим остаток 21952 - 21945 = 7
H′=7

---------------------------------
Сравним:
исходный хэш : 7
восстановленный хэш : 7

на стороне приемника нужно получить ХЭШ от принятых данных и сравнить с расшифрованным ХЭШем
---------------------------------
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU

Сообщение testosteron »

генератор ассиметричных ключей для ECDSA micro-ecc
https://aae21.ru/keygen/ecc_keygen.html

используем эллиптическую кривую - uECC_secp256r1

случайное число "k" НЕ используется из RNG, а вычисляется - детерминированно по RFC6979

библиотека - micro-ecc
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU с крипто-ключом

Сообщение testosteron »

ХЕШ
SHA256 Хотел сперва эту: mbedtls
https://github.com/Mbed-TLS/mbedtls
но отказался в пользу библиотеки попроще

SHA256 - программный, язык C
https://github.com/ilvn/SHA256?utm_source=chatgpt.com
прикрепил на всякий случай
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU с крипто-ключом

Сообщение testosteron »

калькулятор sha256
https://emn178.github.io/online-tools/sha256.html
( hex число // вводить без всяких префиксов )


Исходные данные = 0x FF223344556677AA ( в Модбасе - big edian = 22ff44336655aa77 )

вычислил ХЕШ - SHA256 ( 32 Байта )
5f20054f7a0a0e2205ed7bc1b87f7da9af111c3ed745dcdee1fbd16cffec8783

-------------------------------------
для теста будем использовать такую пару ключей:

const uint8_t private_key[32] =
{
0xBC, 0x73, 0xB9, 0x0F, 0x8B, 0xA5, 0xDA, 0xA5, 0xAE, 0xFF, 0x87, 0xDD, 0xC8, 0xD1, 0xED, 0x81,
0xA0, 0x3D, 0x11, 0x78, 0x2F, 0xEE, 0x56, 0xA5, 0x14, 0x8F, 0x2F, 0x75, 0xFD, 0xB0, 0x2B, 0x99
};
-------------------------------------
Публичный ключ
019803E6418AF5105716D1DE5E6FD5D94EE9D1A5C249C1DAB0488396A4FF80484580A6525C7D5F99E1D910846FADC79C3BF89C8095D3CE54E0874456AF09D96A

const uint8_t public_key[64] =
{
0x01, 0x98, 0x03, 0xE6, 0x41, 0x8A, 0xF5, 0x10, 0x57, 0x16, 0xD1, 0xDE, 0x5E, 0x6F, 0xD5, 0xD9,
0x4E, 0xE9, 0xD1, 0xA5, 0xC2, 0x49, 0xC1, 0xDA, 0xB0, 0x48, 0x83, 0x96, 0xA4, 0xFF, 0x80, 0x48,
0x45, 0x80, 0xA6, 0x52, 0x5C, 0x7D, 0x5F, 0x99, 0xE1, 0xD9, 0x10, 0x84, 0x6F, 0xAD, 0xC7, 0x9C,
0x3B, 0xF8, 0x9C, 0x80, 0x95, 0xD3, 0xCE, 0x54, 0xE0, 0x87, 0x44, 0x56, 0xAF, 0x09, 0xD9, 0x6A
};
-------------------------------------

цифровая подпись получилась : [64 Байта] ( в памяти устройства - Little Edian )
f423d64f7a60fa0aa1302c382ac981ba026ce7649d29511062225650857d90c92e836f6760eca50f3208d17c590679f05c7f876060bc8418ec81c4ac970a84d3
( В протоколе Модбас - BigEdian )
23f44fd6607a0afa30a1382cc92aba816c0264e7299d1051226250567d85c990832e676fec600fa508327cd10659f0797f5c6087bc60188481ecacc40a97d384
=============================================================
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU с крипто-ключом

Сообщение testosteron »

калькулятор CRC-16
https://inner.su/services/onlayn-kalkul ... s-rtu-tcp/
===================================================================================================
порядок при отправке Modbus = Big Edian ( кроме CRC )
порядок при хранении в памяти = Litle Edian
===================================================================================================

при запросе:
ID = 0x01 ( номер датчика ) [ 1 Байт ]
тип данных = 0x03 ( Holding Registers ) [ 1 Байт ]
start adres = 0x0000 ( с нулевого адреса ) [ 2 Байта ]
количество 0x0004 ( 4 регистра = 8 байт. Так как в 1 регистре 2 байта) [ 2 Байта ]
CRC = 0x4409 ( передом-назад ) [ 2 Байта ]
сформируется запрос: 01-03-00-00-00-04-44-09

на который ведомый должен ответить:
ID = 0x01 [ 1 Байт ]
тип данных = 0x03 [ 1 Байт ]
кол-во = 0x08 - ( а тут измеряется в Байтах - 4 регистра по 2 байта каждый ) [ 1 Байт ]
тело сообщения = 22FF44336655AA77 ( 8 Байт - в моем случае для примера ) [ ровно столько Байт - сколько запросили ]
CRC = 0x2247 [ 2 Байта ] -- ( Litle-Edian - младший байт вперед )
итого = 01030822FF44336655AA772247 ( 01-03-08-22FF44336655AA77-2247 )

================================================================
а если посылка будет иметь цифровую подпись, то нужно запрашивать на 64 байта больше ( на 32 регистра больше )

запрос будет выглядеть так:
ID = 0x01 ( номер датчика )
тип данных = 0x03 ( Holding Registers )
start adres = 0x0000 ( с нулевого адреса )
количество 0x0024 ( 36 регистров = 72 байт.)
CRC = 0x45D1
сформируется запрос: 01 03 00 00 00 24 45 D1

на который ведомый должен ответить:
ID = 0x01
тип данных = 0x03
кол-во = 0x48 - ( 72 Байта - это 8+64 )
тело сообщения = 22FF44336655AA77 ( 8 Байт - в моем случае для примера )
цифровая подпись = 23F44FD6607A0AFA30A1382CC92ABA816C0264E7299D1051226250567D85C990832E676FEC600FA508327CD10659F0797F5C6087BC60188481ECACC40A97D384
CRC = 0x8692
итого = 01034822FF44336655AA7723F44FD6607A0AFA30A1382CC92ABA816C0264E7299D1051226250567D85C990832E676FEC600FA508327CD10659F0797F5C6087BC60188481ECACC40A97D3848692

( 01-03-48-22FF44336655AA77-23F44FD6607A0AFA30A1382CC92ABA816C0264E7299D1051226250567D85C990832E676FEC600FA508327CD10659F0797F5C6087BC60188481ECACC40A97D3848692 )
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU с крипто-ключом

Сообщение testosteron »

--
Аватара пользователя
testosteron
Сообщения: 47
Зарегистрирован: Пн фев 16, 2026 8:05 pm

Re: Modbus RTU с крипто-ключом

Сообщение testosteron »

в modbus протоколе данные передаются Big-Endian двухбайтными словами.

CRC передаётся в Little-Endian порядке
Ответить

Вернуться в «Протоколы»