Не удается расшифровать зашифрованное сообщение pgp openpgpjs (JS) с помощью gnupg (Ubuntu GPG через PHP)

В настоящее время я разрабатываю защищенный pgp веб-чат, в котором шифрование выполняется на стороне клиента (Javascript с использованием библиотеки openpgpjs) и хранится в зашифрованном виде в базе данных mysql.

Чтобы отправить данные нескольким пользователям, сервер должен расшифровать сохраненное сообщение с помощью кода PHP (с использованием библиотеки PHP gnupg, которая использует gpg на сервере Ubuntu) и повторно зашифровать его с помощью открытых ключей пользователей, прежде чем он отправит им документ, чтобы они могли расшифровать его с помощью javascript.

Проблема здесь: я могу использовать openpgpjs для расшифровки зашифрованных сообщений openpgpjs, и я могу использовать gnupg для расшифровки зашифрованных сообщений gnupg. НО я не могу использовать openpgpjs для расшифровки зашифрованных сообщений gnupg, и наоборот, я не могу использовать gnupg для расшифровки зашифрованных сообщений openpgpjs.

После тестирования некоторых сценариев я сравнил выходные данные зашифрованного текста «Hallo!» который был сгенерирован с тем же открытым ключом, но с использованием разных библиотек.

Итак, два выхода:

"Привет!" зашифровано библиотекой openpgpjs:

-----BEGIN PGP MESSAGE-----
Version: OpenPGP.js v1.3.0
Comment: http://openpgpjs.org

wcFMA2jCJsaw5XYZAQ//XAy31wZyCGTMBv5VIxj6MMeNNGPGXPg72hskWWL8
XQ1r5EAFtqzXU3l7qPvF00d41IKv0L/JHXhz8pBK6ydPtkhiLiX6pEQPUqcx
ifBD68WPvYK/xb9LiGdvPOYN6YqPvqlUky4BcF1fG7b4IlSJGRKgTwnMiHOr
uVu1EOcNLQk6iSwQ1dE18DsJJb/B5zkNrDOjGnloz6LeOXmS3q4 j xA5t2N
DNhr008qXwAw3DsyZ2 QbVHnl8gKBcl2jFmsF5Y/NC4U3jGgnd35uk59AfaW
qPN GKgupP58P6DgzchFUrErrCAEI5S2RC JCAgZm5FJdTWKNwXThODNbLmq
NnBmDja vb/Xlb2l6eKwWdPjulW6QUxi/36aFz16cYso6qtRL6KDLlx/6blb
mKyB2N0mcWQTG V lOh4v2TYjXuZxdJnTmVgwFdpOYSQ5HJNH8olR52OvIPr
m0 DXDuLXtLvsa9SL4CaW9HJ6lkBnQoMBfi8jQb5LqyZOwH53kSuq3imnXdD
QbjVIeJs7RnMDBMc8KPgTYKGZ9incjXGQLphKAylTdXsPKJwyXjJq8xiUygK
asMu0mXKAESm9iW5F5UniN1PifXYi2oD4Y8VCPLsdM3tE/8lZkNa28zPxVEP
8QrwFtVpnRKkg7OyeOq80YzUZVNougujpjANxqhJiqDSPgElygmj/aVUeKyw
kSm0X/C6lAQD3wozzxCZ466fc6/KDrpcTlhQasqWgWydHHcfRG1FILbPflek
g5CZZrwI
=TJcV
-----END PGP MESSAGE-----

"Привет!" зашифровано библиотекой gnupg:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.22 (GNU/Linux)

hQIMA2jCJsaw5XYZAQ//az5Kc+kbX499ZwPUpDH+owUBkW92TLkN0DQ7sxKUHbGL
B/t7aC8T1G9xqvqrKKFAi3Eidp7RaLHMt/UIr45ZatGRHv6gpBS5LIhzzLx0cyFj
BSzftaV4wyZDM2PBx70rXp9xmYYqsw7bXvtMw7Jp6xrCyOFjVLeCv4sBSmV4rln3
aQepCihyJxWwelmBCGrF8SEClNFkeDC1wo0vfQ8XimFrMuecZWQ3hZ5ORhwvl1Hb
vJQIJ0Uoq8FrN85gpJVZpBsVleLJDBjLTSGVAH++Yirdh+Fv7sxpGolxL3EdjPUg
RfXy8LcTV6PqkgxogPmbCJJ9PEUdDOZHjRbseRArYk32pa7ETiZRDzYL2Oyud5St
1N7SH87PdpFcmZNRI1jM920ZIQv+nOMhwrV60yu2Higc+LXJon+dS9GhsA5roFj5
PXkGWzApGMS9CbJc3vXSEkczWITI1PL5hhjTNXttkeUmvZPIRVK9NPKLMmE5l/N+
GIjKImJZm8YoZBTYOPl06ftxAXnrcnSDzBLdhCe7E0TRVb/dr4PCdv/UBpXA4Boh
LbjyOsc9PkfM51xJPAXX7qfOggT1frnRTFGVcyqrrQrHtYXrTFOQHGJq0a3vVovF
T5fcjzrHkUFVMfAYkvC9xTuMkMKusmhBV1z5unxvHJ5udUZI8V2wlXfJA8S+vITS
QQEmpx+9oO2qi3MAALCtmoB2txjrHKSjxFZp3y/nZbFCtFJrZLXh+hC03SkUmp0z
/NCJQZ971OUwQ6oRR6j5+Nd+
=hFES
-----END PGP MESSAGE-----

как видите, они явно разные.

Итак, мой вопрос: есть ли разница в используемых ими алгоритмах / версиях pgp? На openpgpjs.org сказано, что openpgpjs использует openpgp .. но это должно быть совместимо с gnupgp, не так ли? И: Есть ли способ (и что мне для этого делать?) Совместным образом использовать openpgpjs и gnupg, чтобы я мог зашифровать и расшифровать сообщения другим способом?

Заранее спасибо!


person Timo Widmaier    schedule 12.11.2015    source источник
comment
Я думаю, что форматирование нарушило вывод, который вы предоставили. Пожалуйста, скопируйте сообщения OpenPGP еще раз и обязательно отформатируйте их как код, а не цитируйте его (см. FAQ подробнее о форматировании).   -  person Jens Erat    schedule 12.11.2015
comment
Спасибо за ответ. Я отредактировал формат =) теперь все должно быть в порядке.   -  person Timo Widmaier    schedule 12.11.2015
comment
Проблема с вашим первым сообщением, которое все еще содержит пробелы.   -  person Jens Erat    schedule 12.11.2015
comment
ДАААААААААААААМНИТ! : D JENS ‹3 Вы меня правильно поняли;) Я отправляю pgp-сообщения с запросом AJAX (POST) в php-скрипт на стороне сервера, и некоторые специальные символы заменяются пробелами ... Я возьму посмотрите на это и скажите, решило ли это проблему =) спасибо m8   -  person Timo Widmaier    schedule 12.11.2015
comment
Защита ASCII - это метод, который используется для устранения именно этой проблемы. Если вы узнаете, в чем именно возникла проблема, и сможете объяснить проблему, я был бы рад, если бы вы разместили пример кода того, чего не следует делать и как исправить вместо этого (это, вероятно, также будет полезно для других).   -  person Jens Erat    schedule 13.11.2015
comment
Проблема определенно заключается в искажении защищенных данных ASCII в запросе Ajax POST - ищите там!   -  person Peter Kalef ' DidiSoft    schedule 13.11.2015
comment
Я попробую это сделать с помощью функции encodeURIComponent () JS и decodeURIComponent (), чтобы правильно замаскировать защищенное ASCII сообщение pgp для его транспортировки через запрос POST и декодирования на стороне сервера. Я отвечу, как только я протестирую это   -  person Timo Widmaier    schedule 13.11.2015
comment
ты где прав. Теперь я кодирую сообщения PGP в base64, прежде чем отправлять их на сервер с запросом AJAX, и он работает, я могу расшифровать их с помощью gnupg в коде php. Позже я добавлю пример кода.   -  person Timo Widmaier    schedule 15.11.2015
comment
добавлен пример ответа.   -  person Timo Widmaier    schedule 15.11.2015


Ответы (1)


Итак, я понял это, и проблема была не внутри библиотек, они совместимы с другими, это было при транспортировке зашифрованных сообщений PGP через запрос AJAX POST.

Проблема заключалась в том, что запрос AJAX POST или GET заменяет некоторые символы сообщения pgp (например, «+») из-за синтаксиса URL (POST и GET отправляют данные через синтаксис URL, даже в AJAX Javascript).

Решение: кодируйте сообщения pgp в BASE64 перед их отправкой в ​​запросе AJAX и декодируйте его на стороне сервера перед дешифровкой.

Пример:

Код Javascript для openpgpjs (асинхронное шифрование сообщения и отправка его через AJAX на сервер для обработки данных в PHP).

<script src="./lib/js/openpgp.min.js"></script>

<script>
function doEncrypt(inMessage, inRemotePublicKey)
{
    var key = inRemotePublicKey;
    var publicKey = openpgp.key.readArmored(key);

    openpgp.encryptMessage(publicKey.keys, inMessage).then(function(pgpMessage) {
        message = pgpMessage;
    }).catch(function(error) { 
        alert(error);
    }); 
}
</script>

<script>
var message = "";
doEncrypt(message, server_publicKey);
var check = function(){
    if(message != ""){
        message = btoa(message);
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() 
        {
            if (xmlhttp.readyState == && xmlhttp.status == 200) 
            {
                alert(xmlhttp.responseText);
            }
        }
        xmlhttp4.open("POST","http://someserver.com/ajax.decryptPGP.php", true);
        xmlhttp4.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp4.send("message=" + message);
    }
    else {
        setTimeout(check, 100);
    }
}
check();
</script>

Код PHP для gnupg (расшифровка сообщения на PHP и выполнение любых действий на PHP).

<?php
    $res = gnupg_init();
    gnupg_adddecryptkey($res,"<key_fingerprint>","");

    $message = base64_decode($_POST["message"]);
    $message= gnupg_decrypt($res, $message);

    echo 'DECRYPTED JS<pre>' . $message. '</pre><hr />';
?>
person Timo Widmaier    schedule 15.11.2015