我正在尝试在 Ubuntu-18.04 和 PHP-7.2 上使用 PHP 的 gnupg_* 扩展编写带有 gpg 加密数据的服务器和客户端 PHP-CLI 脚本。
服务器在发送欢迎信息后,发送自己的公钥,并将其私钥设置为解密密钥,而客户端将公钥设置为加密密钥。
这涉及使用 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 设计问题,被埋在四维数组中。