Также существует более простая, но малоизвестная схема подписи для RSA;
Он практически не поддается подделке при адаптивных атаках с выбранным сообщением в модели случайного оракула.
Сегодня RSA-FDH очень прост;
- Подписать: $\sigma = Sign(H, m) = (H(m))^d \bmod n$
- Проверять: $\{0,1\} = Verify(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$
Подписать тогда было непросто из-за требований к размеру; хэш $Ч$ должен иметь выходной размер, равный размеру модуля RSA. Теперь очевидным выбором является eИксчувствительный Овывод Фсоюзы (XOF) как Встряхнуть128/встряхнуть256 ША-3.
Запросите выходной размер от SHAKE128 (или SHAKE256), равный размеру модуля RSA, хешируйте его, затем подпишите, вот и все!
импортировать хеш-библиотеку
импортировать rsa
(pubkey, privkey) = rsa.newkeys(2048)
FHD = hashlib.shake_128()
FHD.update(b'Сообщение для подписи')
дайджестFDH = int.from_bytes(FHD.digest(255),byteorder='little')
#просто m^d mod n
подписанный = rsa.core.decrypt_int (digestFDH, privkey.d, pubkey.n)
#просто м^е мод н
если дайджестFDH == rsa.core.encrypt_int(signed,pubkey.e,pubkey.n):
распечатать("проверено")
еще:
print("!!!Проверка не удалась. Остановить!!!")
Точное определение, как в статье 1998 г. (без кавычек)
Алгоритм подписи и проверки имеет доступ к оракулу
к хеш-функции $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. Генерация и проверка подписи выполняются следующим образом:
$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{return}y^d \bmod N$
$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$
$\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{if }y = y' \text{ then return }1 \text{ else return } 0$
и обратите внимание, что, по крайней мере, некоторые из элементов $\mathbb{Z}_N^*$ не может быть выведен стандартным XOF. Модуль не является точной степенью числа 2, поэтому нужно выводить на один бит меньше, чем модуль. Библиотека, которую я использовал для примера реализации, использует байты для размера вывода, поэтому она не может охватывать до 8 бит.
Кроме того, исключается вывод всех нулей!.