В вашем вопросе путаница. Генерация подписи для RSA требует модульного возведения в степень с использованием значений закрытого ключа , а не открытого ключа. Модульное возведение в степень также используется для шифрования с открытым ключом. Но хотя используется та же математическая формула - по крайней мере, на первый взгляд - это не означает, что генерация подписи - это шифрование с закрытым ключом , потому что такой вещи не существует . Текущие стандарты PKCS # 1 делают все возможное, чтобы объяснить этот факт, хотя ранее PKCS # 1 стандарты, используемые для идентификации генерации подписи с шифрованием RSA.
То, что вы пытаетесь сделать, это подтвердите сообщение. Эту функцию вы ожидаете, а не знак . Проверка выполняется с помощью доверенного открытого ключа , а не с помощью закрытого ключа. Вы не пытаетесь декодировать сообщение, вы пытаетесь проверить, действительно ли байты сообщения подписаны закрытым ключом, принадлежащим той же паре ключей, что и доверенный открытый ключ. Как правило, сообщение не восстановлено, даже частично. PKCS # 1 называется генерацией подписи с приложением, которое отличается от других схем, называемых генерацией подписи , дающей восстановление сообщения . Приложение - это значение подписи , оно должно быть добавлено (включено) в сообщение для любого использования.
На самом деле, тот факт, что вы можете по крайней мере восстановить хэш свыше сообщение относится к некоторым схемам, таким как генерация подписи PKCS # 1 (официально называется RSASSA-PKCS1-v1_5
в стандарте ). Другие схемы, такие как PSS в том же стандарте, могут даже не восстанавливать хэш. Это нормально, пока проверка (которая может иметь место с учетом данных и, следовательно, хэша) может быть успешной или неудачной. Другими словами, проверка должна, по крайней мере, привести к логическому значению true / false, но для этого не нужно генерировать какую-либо другую информацию.
Или в упрощенном псевдокоде:
ciphertext = encrypt(publicKey, plaintext)
(recovered) plaintext = decrypt(privateKey, ciphertext)
и
signature = sign(privateKey, data)
verificationResult = verify(publicKey, data, signature)
где алгоритм хеширования данных равен параметр конфигурации для алгоритма генерации и проверки подписи. Если вы хотите включить его, вы можете, например, включить его в качестве начального параметра:
signature = sign(SHA256alg, privateKey, data)
verificationResult = verify(SHA256alg, publicKey, data, signature)
Наконец, вы говорите о «декодировании». Вы декодируете сообщения, которые были кодированы , используя схему кодирования. Кодирование / декодирование не предполагает наличие ключа. Вместо этого мы говорим о шифровании / дешифровании и генерации / проверке подписи. Примерами кодирования являются шестнадцатеричные числа / основание 64, которые преобразуют двоичный код в текст. Кодировка символов , например UTF-8, предназначена для преобразования текста в двоичный файл.