Как переписать эти вызовы PHP OpenSSL в криптографии .NET?

#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 ожидают, что зашифрованные данные являются хэшем, а не принимают какие — либо данные. Как таковой, ни один из них не подходит. Есть какие-нибудь намеки?