我需要使用第三方提供给我的公钥,在MediaWiki环境中使用PGP加密和ASCII装甲一个小字符串/标记。这给了我:
我打算在阅读之后使用GnuPG lib: http://devzone.zend.com/1278/using-gnupg-with-php/
哪些用户应将PGP公钥存储在其.gnupg文件夹中?
更新1
到目前为止,我正在测试硬编码公钥(现在,只是为了测试它)
// GnuPG stuff
putenv("GNUPGHOME=/tmp");
$pubkey = "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.6 (GNU/Linux)
...key...
-----END PGP PUBLIC KEY BLOCK-----";
$ token="some text";
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
try
{
$info = $gpg->import($pubkey);
// var_dump($info); // to see fingerprint
$info = $gpg -> addencryptkey("...fingerprint...");
$enc = $gpg -> encrypt($token);
}
catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage();
}
$token = urlencode($enc);
echo $token, "\n";
似乎加密,现在我只需要弄清楚我是否需要/可以剥离
Encrypted Data: -----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.5 (GNU/Linux)
因为我正在加密URL的令牌
答案 0 :(得分:3)
可以使用PHP的gnupg-functions启用Ascii装甲输出。看看setarmor
。
在创建$gpg
对象后,最好直接添加此行:
$gpg -> setarmor(1);
但是文件说ascii装甲将是默认的;你得到什么输出,你想要哪个?邮寄时,发送ascii装甲很方便;否则你通常直接选择较小的二进制格式。从未见过带有“标题”的ascii装甲OpenPGP。
对于较小的问题:
最好远离exec_shell()... true?
如果它已被禁用,则无法做出决定。只要PHP的gnupg函数具有您需要的所有功能,就更喜欢它们;他们从麻烦的接口gpg中拯救你(没有直接的API,而是命令行工具)。引入任何漏洞的机会也较小。
哪些用户应将PGP公钥存储在其.gnupg文件夹中?
为网络服务器选择可读的文件夹(可能不可写?)但使用HTTP无法访问(因此没人能够获取您的密钥)。您似乎已经意识到如何设置此路径。
似乎加密,现在我只需要弄清楚我是否需要/可以剥离
[剪断]
我会使用一些正则表达式。
preg_match('/[\n\r]([=\n\r[:alnum:]]+)[\n\r]/', $token, $matches);
应该做;也许它更优雅地将所有行剥离为空或包含斜杠或冒号。
答案 1 :(得分:1)
在基本级别,请尝试以下代码。它没有添加ASCII装甲,但它确实将它变成了一种屏幕友好(非二进制)格式,你可以轻松装备自己。
<?php
$data = 'Secret info';
$encrypted = null;
$ok = openssl_public_encrypt($data, $encrypted, $pubKey);
if ($ok) {
// Optionally, encode it so you can echo it onscreen
$encrypted = base64_encode($encrypted);
echo $encrypted . "\n";
} else {
echo "Failed to encrypt\n";
}
我不知道您是否可以直接将PGP公钥导入OpenSSH,但如果您需要,this answer可能会帮助您在密钥格式之间进行转换。