Я относительно новичок в OpenPGP, но в настоящее время я пытаюсь зашифровать сообщение на устройстве пользователя с помощью OpenPGP.js и расшифровать это сообщение, используя OpenPGP PHP на моем сервере. Обе стороны могут шифровать и дешифровать свои собственные сообщения сейчас — проблема: как только я шифрую сообщение на стороне клиента, отправляю его на сервер и пытаюсь расшифровать его там, оно не работает, и наоборот.
Есть ли какие-то моменты, которые я могу проверить, в чем проблема?
Я пытался с помощью онлайн-сервис PGP для расшифровки и расшифровки и он без проблем декодирует сообщения на стороне сервера (OpenPGP PHP) и выдает ошибку «несоответствие контрольной суммы» на зашифрованных сообщениях на стороне клиента, так что я думаю, что это, вероятно, на стороне клиента. Я использую localstorage для хранения закрытых и открытых ключей на стороне клиента и файлов .asc на стороне сервера, если это имеет значение. Обмен открытым ключом работает правильно.
СТОРОНА СЕРВЕРА:
ENCRYPT:
$key = OpenPGP_Message::parse(OpenPGP::unarmor($public, "PGP PUBLIC KEY BLOCK"));
$data = new OpenPGP_LiteralDataPacket($string, array('format' => 'u', 'filename' => 'stuff.txt'));
$encrypted = OpenPGP_Crypt_Symmetric::encrypt($key, new OpenPGP_Message(array($data)));
$enc = OpenPGP::enarmor($encrypted->to_bytes(), "PGP MESSAGE");
$enc = wordwrap($enc, 64, "\n", 1);
return $enc;
расшифровывать:
$keyEncrypted = OpenPGP_Message::parse(OpenPGP::unarmor($>private, 'PGP PRIVATE KEY BLOCK'));
$text = "";
foreach($keyEncrypted as $p) {
if(!($p instanceof OpenPGP_SecretKeyPacket)) continue;
$key = OpenPGP_Crypt_Symmetric::decryptSecretKey($pass, $p);
$msg = OpenPGP_Message::parse(OpenPGP::unarmor($encrypted, 'PGP MESSAGE'));
$decryptor = new OpenPGP_Crypt_RSA($key);
$decrypted = $decryptor->decrypt($msg);
$text = $decrypted->packets[0]->data;
}
return $text;
КЛИЕНТ:
ENCRYPT:
const options = {
data: string,
publicKeys: openpgp.key.readArmored(key).keys
}
openpgp.encrypt(options).then(ciphertext => {
encrypted = ciphertext.data;
callback(encrypted);
})
расшифровывать:
const privKeyObj = openpgp.key.readArmored(storage.get("crypt.private")).keys[0]
await privKeyObj.decrypt(storage.get("crypt.pass"))
const options = {
message: openpgp.message.readArmored(encrypted), // parse armored message
publicKeys: openpgp.key.readArmored(storage.get("crypt.public")).keys, // for verification (optional)
privateKeys: [privKeyObj] // for decryption
}
openpgp.decrypt(options).then(plaintext => {
console.log(plaintext.data);
callback(plaintext.data);
});
Задача ещё не решена.
Других решений пока нет …