2016-02-25 2 views
2

Я создал открытый ключ и закрытый ключ с OpenPGP-PHP, затем я импортировал их как в GnuPG, который не будет импортировать открытый ключ без указания флаг «-allow-non-self -igned-uid». Затем, когда я пытаюсь расшифровать файл, я получаю следующее:Невозможно дешифровать файл, зашифрованный с помощью openpgp-php в gnupg

gpg --decrypt test.tif.asc 
Generated: Thu, 25 Feb 2016 11:12:28 -0500 
gpg: unknown armor header: 
By: <> 
gpg: unknown armor header: 
Using: OpenPGP for PHP 
gpg: unknown armor header: 
For: TEST 
gpg: unknown armor header: 
gpg: encrypted with 512-bit RSA key, ID 519A1973, created 2016-02-25 
     "TEST" 
gpg: public key decryption failed: Wrong secret key used 
gpg: decryption failed: No secret key 

Но ключ явно существует:

gpg --list-secret-keys 
/home/mike/.gnupg/secring.gpg 
----------------------------- 
sec 512R/519A1973 2016-02-25 
uid     TEST 

сгенерировать их с кодом PHP:

$header = array(
     'Generated' => date("r"), 
     'By' => "Test <[email protected]>", 
     'Using' => "OpenPGP for PHP", 
     'For' => "TEST" 
      ); 

$rsa = new Crypt_RSA(); 
$k = $rsa->createKey(512); 
$rsa->loadKey($k['privatekey']); 

$nkey = new OpenPGP_SecretKeyPacket(array(
      'n' => $rsa->modulus->toBytes(), 
      'e' => $rsa->publicExponent->toBytes(), 
      'd' => $rsa->exponent->toBytes(), 
      'p' => $rsa->primes[1]->toBytes(), 
      'q' => $rsa->primes[2]->toBytes(), 
      'u' => $rsa->coefficients[2]->toBytes() 
      )); 

$uid = new OpenPGP_UserIDPacket("TEST"); 

$wkey = new OpenPGP_Crypt_RSA ($nkey); 
$m = $wkey->sign_key_userid(array($nkey, $uid)); 

// Serialize private key 
$private_bytes = $m->to_bytes(); 
$private_bytes = OpenPGP::enarmor($private_bytes, "PGP PRIVATE KEY BLOCK", $header); 

// Serialize public key message 
$pubm = clone($m); 
$pubm[0] = new OpenPGP_PublicKeyPacket($pubm[0]); 
$public_bytes = OpenPGP::enarmor($public_bytes, "PGP PUBLIC KEY BLOCK", $header); 

И шифрование с использованием:

$pgp_header = array(
     'Generated' => date("r"), 
     'By' => "Test <[email protected]>", 
     'Using' => "OpenPGP for PHP", 
     'For' => "TEST" 
     ); 

// Unarmor the public key for encrypting 
$public_bytes = OpenPGP_Message::parse(OpenPGP::unarmor($public_bytes, "PGP PUBLIC KEY BLOCK")); 

echo encryptData(file_get_contents("test.tif"), "test.tif", $public_bytes, $pgp_header); 

function encryptData($data, $filename, $key, $header) 
{ 
    $data = new OpenPGP_LiteralDataPacket($data, array('format' => 'u', 'filename' => $filename)); 
    $encrypted = OpenPGP_Crypt_Symmetric::encrypt($key, new OpenPGP_Message(array($data))); 

    return(OpenPGP::enarmor($encrypted->to_bytes(), "PGP MESSAGE", $header)); 
} 

Но это Кажется, я определенно чего-то не хватает. Как я могу заставить GnuPG успешно расшифровать мои материалы?

+0

«' $ RSA = новый Crypt_RSA();.. $ к = $ rsa-> createKey (512); '« Блокирует ли размеры ключей RSA <2048 бит? »(должно быть.) –

+0

@ScottArciszewski поднял его до 2048 и все еще получал ту же ошибку! Я сохраню его в 2048, хотя. –

+0

- $ public_bytes va определяется? 'OpenPGP :: unarmor ($ public_bytes,' –

ответ

0

Во-первых: попробуйте зашифровать с помощью OpenPGP-PHP с помощью ключа, сгенерированного с помощью gpg - это работает? (Это делается для меня локально.)

Затем убедитесь, что у вас установлен флаг ключа «зашифровать связь» 0x04 (для этого вам нужно будет добавить пакет подписи, проверьте lib/openpgp_crypt_rsa.php на строке 154 ., чтобы увидеть пакет по умолчанию, генерируется, если вы не предоставите один

Кроме того, там была ошибка в кейген примере Пожалуйста, попробуйте последнюю версию

Смежные вопросы