Распутывание вывода gnupg_keyinfo()
Я пытаюсь написать серверные и клиентские сценарии PHP-CLI с данными, зашифрованными gpg, используя расширения PHP gnupg_* для Ubuntu-18.04 и PHP-7.2.
После отправки приветственного сообщения сервер отправляет свой открытый ключ и устанавливает свой закрытый ключ в качестве ключа дешифрования, в то время как клиент устанавливает открытый ключ в качестве ключа шифрования.
Это включает использование gnupg_keyinfo() и извлечение отпечатка пальца из сложного массива информации.
Формат информации неясен (по крайней мере, мне!).
Серверный скрипт имеет:
putenv('GNUPGHOME=/home/****/.gnupg');
$gpg = gnupg_init();
$info = gnupg_keyinfo($gpg, "username");
$gpg_fingerprint = $info[0][0]["subkeys"]["fingerprint"];
$reply = gnupg_adddecryptkey(gpg, $gpg_fingerprint, $gpg_passphrase);
и клиентский скрипт имеет:
putenv('GNUPGHOME=/home/****/.gnupg');
$gpg = $gnupg_init();
$info = gnupg_keyinfo($gpg, $public_key);
$gpg_fingerprint = $info[0]["fingerprint"];
$reply = gnupg_addencryptkey($gpg, $gpg_fingerprint);
Очевидно, что обе строки "$gpg_fingerprint = " неверны, но какими они должны быть?
Если отпечаток пальца - это единственная вещь, которая однозначно идентифицирует ключ, почему не так легко получить доступ?
Или есть более простой способ сделать это?
1 ответ
Я нашел скрипт, который получает отпечатки пальцев:
$gpg = gnupg_init();
$infos = gnupg_keyinfo($gpg, $email);
$countkeys = count($infos);
if($countkeys == 0) { print "No keys match $email\n"; exit; }
// choose which key if more than 1
$keychoice = 0;
if($countkeys > 1)
{ print "$email matches $countkeys keys\n";
for($i=0; $i<$countkeys; $i++)
{ $name = $infos[$i]['uids'][0]['name'];
$comment = $infos[$i]['uids'][0]['comment'];
$timestamp = $infos[$i]['subkeys'][0]['timestamp'];
$fingerprint = $infos[$i]['subkeys'][0]['fingerprint'];
print "$i: $name, $comment, $timestamp, $fingerprint)."\n";
}
loop2:
print "n?: ";
$keychoice = trim(fgets(STDIN));
if(($keychoice < 0) || ($keychoice >= $countkeys)) { print "invalid choice\n"; goto loop2; }
}
// get fingerprint
$fingerprint = $infos[$keychoice]['subkeys'][0]['fingerprint'];
print "Fingerprint: $fingerprint\n";
Поскольку для gnupg_addencryptkey() требуется отпечаток пальца, может показаться, что проблема разработки gnupg в том, что он скрыт в 4-мерном массиве.