繁体   English   中英

无法使用gnupg解密openpgpjs(JS)加密的pgp消息(Ubuntu GPG通过PHP)

[英]Can't decrypt openpgpjs (JS) encrypted pgp message with gnupg (Ubuntu GPG via PHP)

我目前正在开发一种pgp安全的网络聊天,其中的加密是在客户端(使用openpgpjs库的Javascript)进行的,并加密存储在mysql DB中。

为了将数据发送给多个用户,服务器必须使用PHP代码解密存储的消息(使用gnupg PHP库,该库在Ubuntu服务器上使用gpg),并在用户将文档发送到之前使用用户的公钥对其进行重新加密。他们,以便他们可以使用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兼容,不是吗? AND:有没有一种方法(以及我应该怎么做?)以兼容的方式一起使用openpgpjs和gnupg,这样我就可以通过另一个人对消息进行加密和解密了?

提前致谢!

所以我想通了,库中没有问题,它们与另一个库兼容,这是通过AJAX POST请求传输加密的PGP消息。

问题是,由于URL语法的原因,AJAX POST或GET请求正在替换pgp消息的某些字符(如“ +”)(即使在AJAX Javascript中,POST和GET也通过URL语法发送数据)。

解决方案:在AJAX请求中发送pgp消息之前,先在BASE64中对其进行编码,然后在解密之前在服务器端对其进行解码。

例:

openpgpjs的Javascript代码 (对消息进行异步加密并通过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>

gnupg的PHP代码 (在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 />';
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM