шифрование — Как расшифровать симметрично зашифрованное сообщение OpenPGP с помощью PHP?

У меня есть сообщение OpenPGP, которое выглядит примерно так, данное мне в файле:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.9 (MingW32)

jA0EAgMCtCzaGHIQXY9g0sBnAeDOQ9GuVA/uICuP+7Z2dnjNCLgRN0J/TzJs1qcW
aJYBTkH5KQCClCxjwTYbHZCox1sENfIS+KxpCKJQqAX3SNEFm0ORNE6RNwEgb1Zj
uOdIw8auxUsjmQKFLAcZIPKjBjyJqSQVfmEoteVn1n+pwm8RdIZevCHwLF2URStB
nBVuycaxcaxcaxcxccxcxacqweqweqwe123fsMqQPaTusOBGpEQrWC9jArtvYEUpY
aNF6BfQ0y2CYrZrmzRoQnmtnVu10PagEuWmVxCucyhVwlthVgN0iBog9jhjliQkc
rrDTupqB4IimMEjElGUHtkuvrCQ0jQnOHEAJmmefMDH0NkYKGd5Ngt21I5ge5tob
/uBjHKMxjNgg1nWfg6Lz4jqoKe/EweuEeg==
=+N9N
-----END PGP MESSAGE-----

и мне дали 15-символьную фразу для расшифровки, я полагаю. Но я действительно не имею ни малейшего представления, чтобы расшифровать файл с помощью PHP. Я смотрю на Страница руководства PHP GnuPG и под gnugpg_decrypt() Пример, который дает этот код:

$res = gnupg_init();
gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC","test");
$plain = gnupg_decrypt($res,$encrypted_text);
echo $plain;

Итак, взглянем на эту функцию gnupg_adddecryptkeyупомянул мне нужен отпечаток пальца. Что это на самом деле? И где это взять?

4

Решение

Отпечаток пальца — это хеш-сумма, рассчитанная для открытого ключа и некоторых метаданных, таких как время создания ключа. Он также возвращается после импорта ключа через gnupg_import как fingerprint приписывать.

Это для криптографии с открытым / закрытым ключом, которая, по-видимому, не используется: при шифровании парольной фразой вы пропускаете часть криптографии с открытым / закрытым ключом и напрямую используете симметричное шифрование для сообщения с ключом сеанса (иногда также называется шифровальный блок или симметричный ключ), полученный из вашей парольной фразы.

Симметричное шифрование не поддерживается модулем PHP GnuPG. Нет функций для выполнения симметричного дешифрования, и это ограничение также описано в исходная документация модуля:

Этот класс предоставляет объектно-ориентированный интерфейс для GNU Privacy Guard (GPG).

Хотя GPG может поддерживать криптографию с симметричным ключом, этот класс предназначен только для упрощения криптографии с открытым ключом.

Вы должны будете выполнить расшифровку вручную, позвонив gpg, Пример командной строки будет

gpg --symmetric --decrypt [file]

(в качестве альтернативы, вы также можете предоставить ввод через STDIN). Для передачи ключевой фразы, посмотрите на GnuPG --passphrase... опции:

--passphrase-fd n

Прочитайте фразу-пароль из файлового дескриптора n. Только первая строка будет прочитана из файлового дескриптора n. Если вы используете 0 для n, фраза-пароль будет считана из STDIN. Это может
использовать только в том случае, если указана только одна фраза-пароль.

--passphrase-file file

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

--passphrase string

Используйте строку в качестве пароля. Это можно использовать только в том случае, если указана только одна фраза-пароль. Очевидно, это очень сомнительная безопасность в многопользовательской системе. Не использовать
этот вариант, если вы можете избежать этого.

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

7

Другие решения

Этот ответ совместим не только с PHP, но и с GnuGPG в целом. Чтобы суммировать ответ Йенса Эрата и добавить этап шифрования для всех, кто сталкивался с этим вопросом, вот решение, если предположить, что существует файл под названием passwords.txt:

// encrypt
gpg --output passwords.gpg --symmetric passwords.txt
// decrypt
gpg —decrypt  passwords.gpg
3

По вопросам рекламы [email protected]