В настоящее время я разрабатываю защищенный pgp веб-чат, где шифрование выполняется на стороне клиента. (Javascript с использованием библиотеки openpgpjs) и хранится в зашифрованном виде в базе данных MySQL.
Для отправки данных многопользовательскому серверу необходимо расшифровать сохраненное сообщение с помощью PHP-кода. (используя PHP-библиотеку gnupg, которая использует gpg на сервере Ubuntu) и повторно зашифруйте его открытыми ключами пользователей, прежде чем он отправит им документ, чтобы они могли расшифровать его с помощью javascript.
Проблема здесь: я могу использовать openpgpjs для расшифровки зашифрованных сообщений openpgpjs, и я могу использовать gnupg для расшифровки зашифрованных сообщений gnupg.
НО я не могу использовать openpgpjs для расшифровки зашифрованных сообщений gnupg и наоборот Я не могу использовать gnupg для расшифровки зашифрованных сообщений openpgpjs.
После тестирования некоторых сценариев я сравнил вывод зашифрованного текста «Привет!» который был создан с тем же открытым ключом, но с использованием разных библиотек.
Итак, два выхода:
«Алло!» зашифрованы библиотекой 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, чтобы я мог шифровать и дешифровать сообщения через другое?
Заранее спасибо!
Так что я понял это, и проблема заключалась не в библиотеках, они совместимы с другими, это было в транспортировке зашифрованных сообщений 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 />';
?>
Других решений пока нет …