Уважаемые пользователи ресурса, ни-какой политики на форуме!
Никаких нациалистических взглядов.
Используйте ресурс по назначению!
На аватарках ни какой символики, причисляющей Вас к каким либо группам!
Не провоцируйте других участников.
Никаких нациалистических взглядов.
Используйте ресурс по назначению!
На аватарках ни какой символики, причисляющей Вас к каким либо группам!
Не провоцируйте других участников.
Modbus RTU с крипто-ключом
- testosteron
- Сообщения: 47
- Зарегистрирован: Пн фев 16, 2026 8:05 pm
Modbus RTU с крипто-ключом
Modbus
https://www.modbus.org/
документация:
----------------------------------------------------------------------------------------
Modbus через последовательную линию
только для устаревших приложений от 1996 года.
не используйте её для новых реализаций. ----------------------------------------------------------------------------------------
MODBUS over Serial Line Specification and Implementation Guide V1.02 ----------------------------------------------------------------------------------------
от Алексея ----------------------------------------------------------------------------------------
Modbus RTU Slave: Описание карты переменных
https://radsel.ru/files/docs/ccu-modbus ... j171698020
Описание протокола Modbus RTU
https://ipc2u.ru/articles/prostye-reshe ... b958302610
https://www.modbus.org/
документация:
----------------------------------------------------------------------------------------
Modbus через последовательную линию
только для устаревших приложений от 1996 года.
не используйте её для новых реализаций. ----------------------------------------------------------------------------------------
MODBUS over Serial Line Specification and Implementation Guide V1.02 ----------------------------------------------------------------------------------------
от Алексея ----------------------------------------------------------------------------------------
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
Библиотеки 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 есть готовая!
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
Цифровая подпись
ассиметричное шифрование
закрытый ключ → подписывает
открытый ключ → проверяет
Ed25519 - это алгоритм цифровой подписи
Если Ed25519, то библиотеки такие: Monocypher или TweetNaCl, так-же wolfCrypt и libsodium.
для МК есть библиотека на С - micro-ecc
не использует аппаратное ускорение
Реализует:
Цифровые подписи (ECDSA) - это и нужно
Обмен ключами (ECDH)
// документацию прикрепил
ссылки:
http://kmackay.ca/micro-ecc/
https://github.com/kmackay/micro-ecc
ассиметричное шифрование
закрытый ключ → подписывает
открытый ключ → проверяет
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
- Сообщения: 47
- Зарегистрирован: Пн фев 16, 2026 8:05 pm
Re: Modbus RTU
генератор ассиметричных ключей для ECDSA micro-ecc
https://aae21.ru/keygen/ecc_keygen.html
используем эллиптическую кривую - uECC_secp256r1
случайное число "k" НЕ используется из RNG, а вычисляется - детерминированно по RFC6979
библиотека - 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 с крипто-ключом
ХЕШ
SHA256 Хотел сперва эту: mbedtls
https://github.com/Mbed-TLS/mbedtls
но отказался в пользу библиотеки попроще
SHA256 - программный, язык C
https://github.com/ilvn/SHA256?utm_source=chatgpt.com
прикрепил на всякий случай
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 с крипто-ключом
калькулятор 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
=============================================================
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 с крипто-ключом
калькулятор 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 )
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
- testosteron
- Сообщения: 47
- Зарегистрирован: Пн фев 16, 2026 8:05 pm
Re: Modbus RTU с крипто-ключом
в modbus протоколе данные передаются Big-Endian двухбайтными словами.
CRC передаётся в Little-Endian порядке
CRC передаётся в Little-Endian порядке