Идея в том, чтобы даже теоретически невозможно было проверить подпись быстрее, чем за x секунд процессорного времени (на средней машине).
Вот сколько на средней машине займет 1 млн. нахождений хеша от хеша?
Хотя, мне вот недавно сообщили, что циклическое получение хешей (т.е. хеш от хеша много раз подряд) — теоретически можно упростить. Насколько это просто и можно ли что-нибуль придумать, чтобы упрощение стало невозможным — пока не могу сказать.
RSA — старый и надежный. И хотя современная криптография активно пропагандирует алгоритмы на эллиптических кривых — RSA позиции не охотно уступает.
Единственная проблема в отношении генерации серийных номеров с RSA — попись (и серийный номер) получается длинной.
Предложенный мной алгоритм — абсолютно не претендует на роль аналога RSA. А вот для генерации серийников для простых программ (с десятками тысяч пользователей) — вполне подойдет.
Имхо, у этих гигантов свой подход к бизнесу: сначала их пользователи юзают версию незаконно, привыкают к ней, потом этих пользователей подталкивают (всяческими методами) использовать продукт легально.
Закрытый ключ в этом алгоритме — это массив случайно сгенерированных чисел. Этот массив условно разбивается на группы по 5 байт. Находится хеш каждой группы (для усложнения находится и хеш от хеша несколько сотен тысяч раз). Эти хеши образуют открытый ключ (их можно укоротить для экономии места на диске).
Подпись закрытым ключем делается так:
Находится хеш исходного сообщения. Берем 3 первых байта этого хеша, и находим в ЗАКРЫТОМ ключе элемент (из 5-ти байт) с таким порядковым номером. Если получилось число большее, чем всего есть элементов — используем остаток от деления.
Проверка подписи открытым ключем так:
Находится хеш исходного сообщения. Берем 3 первых байта этого хеша, и находим в ОТКРЫТОМ ключе элемент с таким порядковым номером. Если хеш подписи равен этому элементу открытого ключа — значит подпись верна. Иначе — подпись не верна.
Надеюсь не слишком запутано. Для большей ясности можно посмотреть пример (есть только на C#).
Вот сколько на средней машине займет 1 млн. нахождений хеша от хеша?
Хотя, мне вот недавно сообщили, что циклическое получение хешей (т.е. хеш от хеша много раз подряд) — теоретически можно упростить. Насколько это просто и можно ли что-нибуль придумать, чтобы упрощение стало невозможным — пока не могу сказать.
Единственная проблема в отношении генерации серийных номеров с RSA — попись (и серийный номер) получается длинной.
Предложенный мной алгоритм — абсолютно не претендует на роль аналога RSA. А вот для генерации серийников для простых программ (с десятками тысяч пользователей) — вполне подойдет.
Закрытый ключ в этом алгоритме — это массив случайно сгенерированных чисел. Этот массив условно разбивается на группы по 5 байт. Находится хеш каждой группы (для усложнения находится и хеш от хеша несколько сотен тысяч раз). Эти хеши образуют открытый ключ (их можно укоротить для экономии места на диске).
Подпись закрытым ключем делается так:
Находится хеш исходного сообщения. Берем 3 первых байта этого хеша, и находим в ЗАКРЫТОМ ключе элемент (из 5-ти байт) с таким порядковым номером. Если получилось число большее, чем всего есть элементов — используем остаток от деления.
Проверка подписи открытым ключем так:
Находится хеш исходного сообщения. Берем 3 первых байта этого хеша, и находим в ОТКРЫТОМ ключе элемент с таким порядковым номером. Если хеш подписи равен этому элементу открытого ключа — значит подпись верна. Иначе — подпись не верна.
Надеюсь не слишком запутано. Для большей ясности можно посмотреть пример (есть только на C#).