Я создал открытый ключ и закрытый ключ с помощью OpenPGP-PHP, затем импортировал их оба в GnuPG, который не будет импортировать открытый ключ без указания флага «—allow-non-selfsigned-uid». Затем, когда я пытаюсь расшифровать файл, я получаю следующее:
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 успешно расшифровывать мои вещи?
Во-первых: попробуйте зашифровать с помощью OpenPGP-PHP с помощью ключа, сгенерированного с помощью gpg — это работает? (Это для меня на местном уровне.)
Затем убедитесь, что для ключа, который вы генерируете, установлен флаг ключа шифрования сообщений 0x04 (для этого вам нужно будет добавить пакет подписи, проверьте lib/openpgp_crypt_rsa.php
в строке 154, чтобы увидеть сгенерированный по умолчанию пакет, если вы его не предоставили.
Также была ошибка в примере с кейгеном. Пожалуйста, попробуйте последнюю версию.
Других решений пока нет …