如何使用gnupg在PHP中导入pgp私钥?

时间:2016-12-22 23:23:37

标签: php linux apache gnupg

我需要使用预先生成的私钥(private.pgp)和密码来签署MD5哈希。 (例如123456abc)在apache2上运行的php脚本中。我也在使用gnupg。

这就是我现在这样做的方式:

<?php
 $keyring = "/pubkeys/.gnupg";  //this direcrtory owned by www-data
 putenv("GNUPGHOME=$keyring"); 

 $res = gnupg_init();
 var_dump($res); //for debug

 $info = gnupg_import($res,'private.pgp');
  var_dump($info); //for debug

 ?>

因此,gnupg_import()会返回 false 。为什么会这样? 我也尝试使用这个php脚本从同一目录中的文件中读取密钥,但是出现了同样的错误。请帮忙。

谢谢。

2 个答案:

答案 0 :(得分:1)

假设您使用的是基于Ubuntu / Debian的操作系统,这就是我要处理的情况: 安装依赖项。

  1. sudo apt-get更新
  2. sudo apt-get install software-properties-common gnupg gnupg2
  3. sudo add-apt-repository -y ppa:ondrej / php
  4. sudo apt-get install php7.4- {gnupg,intl,mbstring,cli,xml}

创建简单测试脚本的步骤。

  1. 创建一个名为 test_pgp
  2. 的目录
  3. cd / test_pgp
  4. 生成OpenPGP密钥 gpg --full-generate-key (遵循提示,但不要 输入密码)。
  5. 导出公钥 gpg --armor --export your_email@example.com> public_key.asc
  6. 导出私钥 gpg --armor --export-secret-keys your_email@example.com> private_key.asc

执行上面的步骤 4和5 之后,您应该有两个文件 private_key.asc public_key.asc 现在,在同一文件夹中创建 pgp_example.php 文件,并添加以下代码行:

<?php
$gpg = new gnupg();

$privateAsciiKey = file_get_contents('private_key.asc');
$publicAsciiKey = file_get_contents('public_key.asc');

/**
 * import private and public keys
 */
$privateKey = $gpg->import($privateAsciiKey);
$publicKey = $gpg->import($publicAsciiKey);
$fingerprint = $publicKey['fingerprint'];
$passphrase = ''; // empty string because we didn't set a passphrase.
$plain_text = "Put Some text to encrypt here";

// catch errors
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// encrypt plain text
try{
    $gpg->addencryptKey($fingerprint);
    $ciphertext = $gpg->encrypt($plain_text);
    echo "\n". $ciphertext ."\n";
}
catch(Exception $e){
    die('Error '.$e->getMessage());
}

// decrypt text
try{
    $gpg->adddecryptkey($fingerprint, $passphrase);
    $plain_text = $gpg->decrypt($ciphertext);
    echo "\n". $plain_text ."\n";
}
catch(Exception $e){
    die('Error: '. $e->getMessage());
}

要执行此代码,请打开终端并运行 php pgp_example.php

答案 1 :(得分:0)

该手册是您的朋友:php.net/manual/en/function.gnupg-import.php第二个参数应该是数据,而不是文件名。                     –Sammitch