Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2

Hardware Key

22.02.2023, 16:02. Показов 1571. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Есть "ключ" который вставляется в USB. SDK ключа предоставляет чтение/запись в память ключа и шифрование, пара ф-ций encrypt/decrypt, шифрованная инфа уникальна для каждого ключа.

Ну сделал так чтобы приложение (на старте) сообщало и завершалось при отсутствии ключа или если в нем не записаны нужные данные. Теперь надо сделать так чтобы приложение не могло писать файлы данных. Вернее без ключа пусть пишутся невалидные данные, и втихаря, без всяких месяг юзверю. Хочется сделать без "if'ов". Просто использовать шифрование не годится, нормальные файлы должны читаться с др ключом, демо-версией и др приложениями.

Что посоветуете ?

Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2023, 16:02
Ответы с готовыми решениями:

При запуске вылазит Hardware Monitor Press any key to restart
При запуске вылазит Hardware Monitor Press any key to restart а дальше без изменений не реагирует на клавиатур все встало стопором

Преобразовать многомерный массив [key][key][key] => value
Как из такого массива: max => '20', min => '0', placeholder => 1 => 'value 1', 2 => 'value 2',

#1170 - BLOB/TEXT column 'id' used in key specification without a key length
После выполнения этого кода: CREATE TABLE forum_themes( id TINYTEXT, name TINYINT, autor_name TINYTEXT, create_date DATETIME...

29
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
25.02.2023, 15:34  [ТС]
Апну темку, актуально. Попробуем с чего-то начать. Напр так работать будет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char crypted[4];    // зашифрованная строка, хранится в ключе
const char reply[4] = { 1, 2, 3, 4 };  // "правельный ответ"
 
// пишем данные или мусор
void WriteCryptData( const void * data, size_t size )
{
  char temp[4];
  decrypt(crypted, temp);
  if (memcmp(temp, reply, 4) == 0)
   WriteData(data, size);
  else
   WriteDummy(size);
}
Но уж очень наивно Сам такое в молодости сколько раз забивал nop'ами. Учтем что decrypt/encrypt - вызовы внешние и присесть на места их вызовов несложно

Не по теме:

Молчание удивляет, думал тут много знатоков кода:) И Шамиль куда-то исчез..

0
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 411
25.02.2023, 16:12
Замените
C++
1
2
3
4
if (memcmp(temp, reply, 4) == 0)
   WriteData(data, size);
else
   WriteDummy(size);
на
C++
1
2
3
for (int n = 0; n < size; n++)
    data[n] = data[n] ^ temp[n%4] ^ reply[n%4];
WriteData(data, size);
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
26.02.2023, 07:14
Цитата Сообщение от Igor3D Посмотреть сообщение
присесть на места их вызовов несложно
Да, это узкое место. Я бы склонировал эти ф-ции в пару десятков разных.
Еще неприятностей можно добавить размазав проверки по разным участкам кода и сделав их рандомными.
Или по расписанию. Ну, скажем, "неделька" -- одна проверка срабатывает по понедельникам, вторая по вторникам - и так далее.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
26.02.2023, 09:51  [ТС]
Цитата Сообщение от UnknownSoldier Посмотреть сообщение
Замените
Безусловно лучше, но по-прежнему все сосредоточено в одном месте. Обдумывал такой вариант (псевдокод)
C++
1
2
3
4
data[0] = origin ^ mask0 ^ mask1
...
... 
data[0] ^= mask2   // должно дать origin
Правда "разнести" эти строки достаточно далеко не так уж просто (запись жмет). Да, но тогда как мне заготовить эти маски?

Цитата Сообщение от vantfiles Посмотреть сообщение
Еще неприятностей можно добавить..
Так я и себе добавляю забот
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
26.02.2023, 13:16
Цитата Сообщение от Igor3D Посмотреть сообщение
Так я и себе добавляю забот
Голубчик, ну а как Вы хотели, понятно, что нет непрошибаемых защит, понятно, что это война пушек и брони, но если покумекать, защиту можно разбросать по исходнику довольно легко.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
26.02.2023, 14:08  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
Голубчик, ну а как Вы хотели, понятно, что нет непрошибаемых защит, понятно, что это война пушек и брони, но если покумекать, защиту можно разбросать по исходнику довольно легко.
Ах как Вы добродушны и снисходительны Ну хорошо, вот 3 маски (см выше), их разбросать - не проблема. Но откуда их взять (т.е. как привязать к ключу) ?

Не по теме:

Подозреваю что дальше общих слов дело не пойдет. Ладно, посмотрим, в людей надо верить :)

0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
01.03.2023, 16:01
Цитата Сообщение от Igor3D Посмотреть сообщение
Просто использовать шифрование не годится, нормальные файлы должны читаться с др ключом, демо-версией и др приложениями.
Не шифруйте, а подписывайте ключом хранящимся на устройстве USB. Т.е. сформировали блок данных, подписали, записали в файл сформированный блок, сертификат ключа и подпись. Другие программы (в т.ч. демо-версии) должны воспринимать файл валидным тогда и только тогда, когда ключ и подпись проходят проверку.

Такой подход дает преимущество в том, что как программу ни ломай, валидный файл все равно формировать не сможешь, т.к. нужен ключ, а ключа-то и нет. И даже если сломать программу так, что она будет писать неподписанные данные или подписывать их левым ключом и будет корректно читать такие файлы, то передавать файлы пользователям оригинальной версии бесполезно, у них будет лишь "неверный формат файла" при попытке открытия.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
01.03.2023, 16:25  [ТС]
Не очень понял
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Другие программы (в т.ч. демо-версии) должны воспринимать файл валидным тогда и только тогда, когда ключ и подпись проходят проверку.
Так откуда напр демо-версия возьмет ключ если она предназначена для работы без оного?

Цитата Сообщение от Sindbad_M Посмотреть сообщение
Такой подход дает преимущество в том, что как программу ни ломай, валидный файл все равно формировать не сможешь, т.к. нужен ключ, а ключа-то и нет. И даже если сломать программу так, что она будет писать неподписанные данные или подписывать их левым ключом и будет корректно читать такие файлы, то передавать файлы пользователям оригинальной версии бесполезно, у них будет лишь "неверный формат файла" при попытке открытия.
Не уловил идею. Есть 2 легальных юзера с разными ключами - как они будут читать файлы друг друга?
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
01.03.2023, 17:03
Цитата Сообщение от Igor3D Посмотреть сообщение
Так откуда напр демо-версия возьмет ключ если она предназначена для работы без оного?
У вас есть ваш личный ключ. Его секретную часть вы храните как зеницу ока, а публичную часть внедряете в код каждой из программ, не важно, демо-версия это или полноценная версия. Этим ключом вы будет удостоверять ключи лицензий, которые будут внедрятся в устройства USB.

Для каждого устройства USB вы формируете ключ. Секретную часть ключа записываете на устройство и больше её нигде и быть не должно, только на устройстве в неизвлекаемом виде. А публичную часть ключа подписываете своим личным ключом и тоже записываете на устройство USB. Собственно, публичный ключ подписанный вашей личной подписью это и есть сертификат ключа. USB устройство должно уметь отдавать записанный в него сертификат по запросу.

Собственно, так можно проверить валидность самого устройства защиты. Запрашиваем сертификат. Проверяем подпись с помощью публичной части личного ключа внедренного в программу, убеждаемся что публичный ключ с USB подписан нами. Далее обращаемся к USB с запросом зашифровать или подписать какие-нибудь данные, проверяем полученные в ответ данные и убеждаемся, что шифрование производится именно тем ключом, сертификат которого мы перед этим получили.

Вернемся к файлам.
При записи:
- формируем блок данных
- обращаемся к устройству с запросом подписания хеша этого блока
- сохранияем в файл: блок данных, сертификат полученный от устройства и подпись полученную от устройства.
При чтении:
- читаем из файла сертификат
- проверяем сертификат с помощью публичной части личного ключа внедренного в программу, убеждаемся что публичная часть ключа используемого для подписания блока данных валидна. В противно случае "неверный формат файла"
- читаем блок данных и проверяем подпись публичной частью ключа из сертификата. Если проверка не проходит "неверный формат файла". Если проходит - значит все Ок, в момент записи файла у пользователя был доступ к одному из легальных устройств защиты.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
01.03.2023, 18:03  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
так можно проверить валидность самого устройства защиты.
Как я это решал:

- читаю, грубо говоря, "ID ключа" + "ID юзера" из памяти ключа (пишутся туда при авторизации ключа)
- читаю еще 16 шифрованных байт из памяти ключа
- вызываю ф-цию ключа "decrypt", в рез-те расшифровки 16 байт должны получиться те же "ID ключа" + "ID юзера". Иначе ключ невалиден

Полагаю Вы говорите о том же. Но вникнуть в Вашу терминологию мне не удается, каждая фраза "бьет по ушам". Напр
Цитата Сообщение от Sindbad_M Посмотреть сообщение
проверяем сертификат с помощью публичной части личного ключа внедренного в программу
Шо тут надо делать ??? Шо за "публичная часть личного" ??? Я вроде ничего не "внедрял", выполняемые файлы одинаковы у всех юзеров. Можно как-то по-простому/народному? Спасибо за понимание
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
01.03.2023, 18:35
Цитата Сообщение от Igor3D Посмотреть сообщение
Шо за "публичная часть личного" ???
Вы себе как представляете, что такое "электронная подпись"? Вокруг этого понятия вся современная криптография и выстроена. И терминология оттуда. https://ru.wikipedia.org/wiki/... тым_ключом

Цитата Сообщение от Igor3D Посмотреть сообщение
- читаю, грубо говоря, "ID ключа" + "ID юзера" из памяти ключа (пишутся туда при авторизации ключа)
- читаю еще 16 шифрованных байт из памяти ключа
- вызываю ф-цию ключа "decrypt", в рез-те расшифровки 16 байт должны получиться те же "ID ключа" + "ID юзера". Иначе ключ невалиден
Т.е. одно и то же устройство всегда отдает одни и те же данные по запросу? Другими словами, обмен данными для устройства всегда повторяется раз за разом? Что мешает воспроизвести дубликат устройства, отвечая на все запросы точно также как отвечает оригинальное устройство?
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
01.03.2023, 20:28  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Т.е. одно и то же устройство всегда отдает одни и те же данные по запросу? Другими словами, обмен данными для устройства всегда повторяется раз за разом? Что мешает воспроизвести дубликат устройства, отвечая на все запросы точно также как отвечает оригинальное устройство?
Согласен (неважно насколько сложно "воспроизвести" технически). Думал об этом, но ничего толкового не придумал. Что посоветуете? (без отсылок к (обильной) теории и.т.п.)
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
01.03.2023, 21:39
Цитата Сообщение от Igor3D Посмотреть сообщение
Что посоветуете? (без отсылок к (обильной) теории и.т.п.)
я же уже посоветовал. Асимметричная криптография.

Это та же самая технология с помощью которой браузеры (у всех пользователей одинаковые!) отличают оригинальные сайты от подделок. Причем, сайтов же миллионы, браузеру не нужно знать о всех сайтах заранее, нужно лишь уметь проверять "правильный секретный ключ", который храниться на сервере вместе с сайтом и с помощью которого сервер подписывает свои странички отправляемые пользователям. Наверняка слышали, что некоторое время назад сайты Госуслуг, Росреестра и т.д. перестали открываться в "иностранных" браузерах, но открываются в Яндекс-браузере. Это потому, что "иностранцы" перестали доверять ключам этих сайтов и больше не считают их "правильными".

Добавлено через 11 минут
Продолжая аналогию: Hardware USB Key - сервер, ключом которого подписываются файлы. Программа должна уметь проверять, доверенным ли ключом подписан файл и если ключ не прошел проверку, файл не открывать. Таким образом, сколько бы разных пользователей с разными Hardware USB Key ни сохраняло файлы, все они будут проходить проверку и открываться на других компьютерах. Подделать Hardware USB Key или создать его копию невозможно, поэтому любые файлы сохраненные в ломанной версии программы проверку валидности не пройдут.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
02.03.2023, 09:45  [ТС]
Хорошо, попробуем по-другому
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Продолжая аналогию: Hardware USB Key - сервер, ключом которого подписываются файлы. Программа должна уметь проверять, доверенным ли ключом подписан файл и если ключ не прошел проверку, файл не открывать. Таким образом, сколько бы разных пользователей с разными Hardware USB Key ни сохраняло файлы, все они будут проходить проверку и открываться на других компьютерах. Подделать Hardware USB Key или создать его копию невозможно, поэтому любые файлы сохраненные в ломанной версии программы проверку валидности не пройдут.
Я понял идею (надеюсь). Но вот мой ключ. Его API имеет пару ф-ций read/write и пару encrypt/decrypt. По существу это все. Подключается API либой (на выбор static/dynamic), так что все вызовы прекрасно видны. Выходит мой ключ шифрует "симметрично"? Как мне перейти к "асимметричному" шифрованию? Ведь проверить валидность зашифрованного (того что сделал encrypt) я не могу.

Проблема "эмуляции" (списать все обращения к ключу и воспроизвести) сводится к тому же. Нужно чтобы при каждом запуске был "свежачок", но тогда с чем его (мне) сравнивать? Тем более той памяти у ключа с гулькин "нос"
0
485 / 411 / 126
Регистрация: 23.05.2016
Сообщений: 1,653
02.03.2023, 13:58
Igor3D, вы сами разрабатываете аппаратный ключ или его вам дали готовым и модификации он не подлежит? Естественно, всё это что я пишу имеет смысл только если можно влезть в аппаратный ключ и "научить" его требуемым вещам.

Если же аппаратный ключ уже изменению не подлежит, то нужно более подробное описание функций encrypt/decrypt, может это уже то, что нужно. Хотя, интуитивно, то что нужно должны были назвать signature, для идентификации в первую очередь подпись нужна, а не шифрование.

Аппаратный ключ должен не только иметь память, но и иметь собственный контроллер/процессор для выполнения вычислений. Немного памяти это сколько? Производительности детской игрушки Ардуино вполне достаточно для этих целей. А бывают ли сейчас менее производительные контроллеры?

Цитата Сообщение от Igor3D Посмотреть сообщение
Нужно чтобы при каждом запуске был "свежачок", но тогда с чем его (мне) сравнивать?
Протокол обмена, например, такой:
- Берем текущие дату и время, передаем их аппаратному ключу
- аппаратный ключ подписывает полученные данные и возвращает подпись
- проверяем подпись и убеждаемся в её корректности
В этом случае каждый обмен данными будет уникальным и его перехват никак не поможет подделать аппаратный ключ.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
02.03.2023, 14:23  [ТС]
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Igor3D, вы сами разрабатываете аппаратный ключ или его вам дали готовым и модификации он не подлежит? Естественно, всё это что я пишу имеет смысл только если можно влезть в аппаратный ключ и "научить" его требуемым вещам.
Конечно "дали готовым", и ничего там дорабатывать я не могу. Просто предыдущие ключи перестали как выпускаться так и поддерживаться последними ОС - вот и возникла необходимость. SDK там открытое, компания (производитель ключей) довольно известная. Если нужна ссылка - дайте знать, сообщу в личке (лишний раз трепаться ни к чему). Да и грузить Вас этой докой негуманно, я ее читал - ну там "обо всем", много об удаленной лицензии, утилитах, энвелопах и др. Но у меня задача так не стоит. Нужно чтобы юзер получил свой (авторизованный) ключ 1 раз - и все, может перетыкивать его на любую (свою) машину без всяких инетов.

Цитата Сообщение от Sindbad_M Посмотреть сообщение
Немного памяти это сколько?
До 4К
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
03.03.2023, 15:51  [ТС]
И тишина. Ладно, попробую "подытожить". Для меня самое неприятное - не вижу как бороться с "эмулятором", т.е. тупо записываются все обращения к ключу и все его ответы. Ну хорошо, вот я вызвал encrypt для какого-то рандомного значения (всякий раз разного). Получил шифрованный вариант. И... что с ним делать? Единственное - сравнить с тем что записано в ключе. Ну неявно конечно, замаскировать, окружить облаком "холостых". Но в ключе можно записать очень немного.

И, по ходу дела
Цитата Сообщение от Sindbad_M Посмотреть сообщение
Программа должна уметь проверять, доверенным ли ключом подписан файл и если ключ не прошел проверку, файл не открывать. Таким образом, сколько бы разных пользователей с разными Hardware USB Key ни сохраняло файлы, все они будут проходить проверку и открываться на других компьютерах.
А если забьет nop'ами эту проверку? Наверно все-таки шифровать надо. Ну это уже "дело техники". А главное - не могу я обеспечить такие проверки в нескольких приложениях, я всеми просто не владею.

В общем, как всегда, стройная теория и серая реальность
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
05.03.2023, 11:09
Мне было бы интересно сравнить цену нормального ключа и Вашу зарплату.
Есть подозрение, что трудозатраты таки выше.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,830
Записей в блоге: 2
05.03.2023, 11:44  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
Мне было бы интересно сравнить цену нормального ключа и Вашу зарплату.
Есть подозрение, что трудозатраты таки выше.
Эта банальная арифметика здесь не очень к месту, т.к. авторизованный ключ поставляется каждому юзеру. Нужно сделать так чтобы без него приложение не работало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2023, 11:44
Помогаю со студенческими работами здесь

Ошибка при работе с указателем! (key[0]->pr) x006790b8 {size=3 d=2 key=0x0067dcc8 {0xfdfdfdfd {pr=? }
#ifndef DHEAP_H #define DHEAP_H #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;cmath&gt; #include &lt;cstdlib&gt; #include &quot;Graph.h&quot; ...

Violation of Primary key constraint 'PK_otdel'. Cannot insert dupllicate key in object 'dbo.otdel'.
void __fastcall TAddOtdForm::AddOtdButton1Click(TObject *Sender) { int kodotd; MainForm-&gt;OtdelADOQuery1-&gt;Last(); kodotd =...

Что значит данный код, а точнее key:={'+key+'}
begin result:=key; key:= AnsiLowerCase(key); if length(key)&gt;1 then begin if key='space' then...

Работа со словарем - ошибка: An item with the same key has already been added. Key
Здравствуйте, имеется такой код для записи словаря в файл using (var writer = new StreamWriter(&quot;2&quot; + s +...

SQLite - оптимальный размер транзакции, стоит ли использовать FOREIGN KEY, связь PRIMARY KEY и INDEX
1. Оптимальный размер транзакции 1.1. Есть ли какое-то ограничение на размер или содержание одной транзакции? 1.2. Может ли размер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru