PHP ASCII Armored PGP加密字符串

时间:2013-01-10 20:55:09

标签: php gnupg

我需要使用第三方提供给我的公钥,在MediaWiki环境中使用PGP加密和ASCII装甲一个小字符串/标记。这给了我:

  • 需要使用PHP
  • 最好远离exec_shell()... true?
  • 网络服务器环境

我打算在阅读之后使用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的令牌

2 个答案:

答案 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可能会帮助您在密钥格式之间进行转换。