Почему для шифрования текста с помощью OpenSSL в macOS 15 требуется приватный ключ?

<b>Предисловие.</b> <br/> <br/> У меня есть приватный и публичный ключи, полученные в оболочке с помощью следующих команд: <br/> <pre><code>openssl genpkey -algorithm RSA -out private_key.pem
openssl rsa -in private_key.pem -pubout -out public_key.pem</code></pre> <br/> <br/> Также я использую скрипт, который упаковывает указанный файл в 7z-архив с паролем. Текст пароля от архива шифруется с помощью публичного ключа, и зашифрованный текст сохраняется в файл рядом с архивом. Пример команды: <br/> <pre><code>printf "$temp_password" | openssl pkeyutl -encrypt -inkey "$public_key_file_path" -pubin -in /dev/stdin -out "$password_file_name.pwd"</code></pre> <br/> Это работает без проблем на macOS 12.7 Monterey Intel. <br/> <br/> Однако при тестировании кода на macOS 15.1 Sequoia M1 возникают ошибки. Я обнаружил, что проблема решается использованием приватного ключа для шифрования, вместо публичного. То есть, следующая команда работает корректно: <br/> <pre><code>printf "$temp_password" | openssl pkeyutl -encrypt -inkey "$private_key_file_path" -pubin -in /dev/stdin -out "$password_file_name.pwd"</code></pre> <br/> <br/> <b>Вопросы:</b> <br/> 1. Почему для шифрования текста необходимо использовать именно приватный ключ, а не публичный? <br/> 2. Существует ли универсальный способ, чтобы код работал без проблем на обеих версиях macOS?
  • 3 января 2025 г. 16:43
Ответы на вопрос 2
Проблема, с которой вы столкнулись, может быть связана с изменениями в версии OpenSSL или в macOS, в частности, с тем, как обрабатываются ключи и операции шифрования. 

### 1. Почему для шифрования текста необходимо использовать именно приватный ключ, а не публичный?

В нормальной практике с использованием асимметричного шифрования (такие как RSA):

- **Публичный ключ** предназначен для шифрования данных. Он доступен всем, кто хочет отправить защищенное сообщение владельцу этого ключа.
- **Приватный ключ** используется для расшифровки данных, которые были зашифрованы с помощью соответствующего публичного ключа.

Если вы смогли успешно зашифровать текст с помощью приватного ключа, это может быть связано с следующими моментами:

- **Вы противоречите стандартной практике**: использование приватного ключа для шифрования и последующего расшифровки с помощью публичного ключа — это не стандартный подход. Это скорее создает цифровую подпись, где вы имеете дело с тайной информацией, которую может проверить каждый, у кого есть публичный ключ.
- **Технические проблемы в OpenSSL**: возможно, в новой версии OpenSSL или macOS есть особые изменения в реализации, которые влияют на работу функций, что может привести к неочевидному поведению.

### 2. Существует ли универсальный способ, чтобы код работал без проблем на обеих версиях macOS?

Несколько рекомендаций, чтобы обеспечить совместимость:

- **Проверьте версии OpenSSL**: Убедитесь, что вы используете одну и ту же версию OpenSSL на обеих системах. Проверьте, установлен ли OpenSSL через Homebrew или как часть системы.
  
- **Обновление команд шифрования**: Используйте стандартные подходы, чтобы гарантировать, что вы шифруете с публичным ключом. Если на macOS 15.1 возникает ошибка, используйте команды для шифрования, которые проверены и работают на macOS 12.7.

- **Тестирование и отладка**: Обязательно тестируйте ваши команды с небольшими образцами данных, чтобы убедиться, что они работают корректно, прежде чем применять технику на больших данных.

- **Проверка на совместимость**: Если вы используете внешние библиотеки или зависимости, проверьте документацию на предмет проблем с совместимостью.

Если проблема продолжает возникать, возможно, стоит рассмотреть альтернативные подходы к шифрованию данных, например, использовать симметричное шифрование (например, AES) с надежным обменом ключами.
Нашел универсальное решение - необходимо шифрование текста-пароля выполнять с sudo. 
printf "$temp_password" | sudo openssl pkeyutl -encrypt -inkey "$public_key_file_path" -pubin -in /dev/stdin -out "$password_file_name.pwd"

Тогда ошибок нет.

Но тем не менее, вопрос о том, почему в macOS Monterey это работает без проблем без sudo - остался.

А какая у вас macOS?

Проверьте кто-нибудь у себя, у вас этот код выполнится с ошибками или без ошибок?
mkdir test_dir_for_openssl
cd test_dir_for_openssl
openssl genpkey -algorithm RSA -out private_key.pem
openssl rsa -in private_key.pem -pubout -out public_key.pem
temp_password=Test123
public_key_file_path=public_key.pem
password_file_name=encrypted_password_file
printf "$temp_password" | openssl pkeyutl -encrypt -inkey "$public_key_file_path" -pubin -in /dev/stdin -out "$password_file_name.pwd"
Похожие вопросы