#php #.net #openssl
#php #.net #openssl
Вопрос:
Нам нужно зашифровать данные для стороннего сервиса. Сервис предоставляет этот пример кода на PHP. Вывод примера кода состоит из двух значений — $encryptedText
и $aesKeyEncrypted
.
$plainText = 'Test payload'; $privateKeyPem = '-----BEGIN RSA PRIVATE KEY----- ... '; $aesKey = openssl_random_pseudo_bytes(16); $encryptedText = openssl_encrypt($plainText, "AES-128-ECB", $aesKey, OPENSSL_RAW_DATA); $privateKey = openssl_pkey_get_private($privateKeyPem); openssl_private_encrypt($aesKey, $aesKeyEncrypted, $privateKey);
Однако наш код находится в .NET 6. Как сделать то же самое с помощью классов криптографии .NET 6?
Я обнаружил, что могу использовать RandomNumberGenerator.GetBytes(16)
вместо openssl_random_pseudo_bytes(16)
, но я понятия не имею, как реализовать остальное.
Комментарии:
1. Пожалуйста, обратите внимание, что Stackoverflow не является бесплатной службой преобразования кода. Ваш PHP-код представляет собой гибридную схему шифрования , в которой вы генерируете случайный (длиной 16 байт) ключ для шифрования AES в режиме ECB. AES шифруется на втором этапе с использованием шифрования RSA. Поскольку часто используются оба шифрования, не должно возникнуть проблем с поиском множества примеров.
2. Конечно, я пытался. Например — 1) Большинство образцов в Интернете, которые я нашел, либо использовали архаичные API, либо API, устаревшие в .NET 6. 2) AES/SymmetricAlgorithm требует вектора инициализации, но в примере PHP нет признаков его передачи, поэтому я сомневаюсь, что IV используется в версии PHP, но я не нашел инструкции, как «не использовать» его.
3. Режим ЕЦБ является единственным режимом AES, который не требует внутривенного введения
4. Спасибо. Я смог сопоставить
openssl_encrypt
вызов в .NET 6. Но я все еще не справляюсь с сопоставлениемopenssl_private_encrypt
, так как оно шифрует любые данные с помощью закрытого ключа. В .NET 6 я нашел двух кандидатов,RSA.Encrypt
которые используют открытый ключ вместо закрытого ключаRSA.SignHash
иSignData
ожидают, что зашифрованные данные являются хэшем, а не принимают какие — либо данные. Как таковой, ни один из них не подходит. Есть какие-нибудь намеки?