шифрование — не удается расшифровать файл, зашифрованный с помощью openpgp-php в gnupg

Я создал открытый ключ и закрытый ключ с помощью 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 успешно расшифровывать мои вещи?

2

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]