Я собираюсь оставить здесь ответ, так как многие примеры в сети для PHP GnuPG очень просты, и, надеюсь, это избавит кого-то от разочарования.
По сути, он отражает принцип работы инструмента командной строки GnuPG. Вам необходимо импортировать ключ, если его еще нет в связке ключей gpg, тогда вам нужно выбрать ключ получателя, который будет использоваться для шифрования / дешифрования.
gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
Если вы сделали то, что сделал я, и передали ключ в качестве получателя, это не сработает!
Непонятно, что это за поле ни в руководстве по GPG, ни в документация PHP, в которой это поле называется« отпечатком пальца ». Проверьте связку ключей gpg на наличие только что импортированного ключа с помощью:
gpg --list-keys
Это выведет что-то вроде этого:
pub rsa2048 2019-04-14 [SC] [expires: 2021-04-14]
0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA
uid [ultimate] Dean Or
sub rsa2048 2019-04-14 [E] [expires: 2021-04-14]
Это даст вам UID, а во второй строке - отпечаток пальца, связанный с каждым ключом. Насколько я могу судить, вы можете использовать UID и отпечаток пальца в качестве получателя.
Итак, ваш PHP-код для шифрования может выглядеть так:
// Encrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient public key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-public-key.asc');
}
$gpg->addencryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
echo $gpg->encrypt('This is a test!');
Тогда код получателя будет выглядеть так:
// Decrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient private key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-private-key.asc');
}
$gpg->adddecryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA', '');
echo $gpg->decrypt($encyptedMessage);
Обратите внимание, что отпечатки пальцев одинаковы как для открытого, так и для закрытого ключа получателя.
Также существует известная проблема, когда adddecryptkey не принимает парольную фразу! Вам нужно либо удалить кодовую фразу, либо изменить свою версию GnuPG.
person
Dean Or
schedule
19.04.2019