OpenPGP шифрование не работает между системами - PullRequest
0 голосов
/ 04 июля 2018

Я относительно новичок в 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);
        });
...