В чем разница между openssl pkeyutl -sign -pkeyopt digest:sha256
и openssl rsautl -sign
? Они делают то же самое?
1 ответ
pkeyutl -sign
с ключом RSA (и rsa_padding_mode
умолчанию pkcs1
что, в частности, означает pkcs1-v1_5) И -pkeyopt digest:$hash
выполняет шаги 2-6 из EMSA-PKCS1-v1_5-ENCODE в разделе 9.2 rfc3447, затем шаг 2 из rfc3447 RSASSA-PKCS1-v1_5-SIGN в разделе 8.2.
Другими словами, он делает все, кроме хэширования данных (но он проверяет длину входного хэша). Обратите внимание, что если имя хеша, которое вы здесь указываете, отличается от хеша, который вы фактически использовали, результирующая подпись не будет проверена правильно.
rsautl -sign
(аналогично по умолчанию) выполняет только шаги 4-6 и 2. Другими словами, он НЕ добавляет кодировку ASN.1 AlgorithmIdentifier к необработанному хэшу, поэтому вам нужно сделать это самостоятельно, если вы хотите, чтобы ваши подписи были поняты и приняты другими. pkeyutl -sign
-pkeyopt digest
также пропускает кодировку ASN.1.
Для полноты, dgst -$hash -sign
или его сокращенная форма $hash -sign
с ключом RSA выполняет всю работу: хэш, кодирование ASN.1, pad 01FF..00 и modexp.