我有一个可以与其他PHP应用程序通信的PHP应用程序。
这些应用程序交换加密的数据。
中央应用程序知道其他应用程序的所有公钥。
其他应用只知道中央应用的公钥。
借助openssl_seal PHP方法对数据进行加密。
而且由于使用了openssl_open PHP方法,因此可以解密。
我使用“ AES256”密码方法并生成一个“ iv”元素。
在PHP中完全没有问题,在所有可能的世界中,一切都是最好的……
但是,现在,我想使用Ionic应用程序(基于cordova和Angular 5)做同样的事情。
我尝试使用JSEncrypt和CryptoJS,但是PHP并没有说明openssl_seal的工作方式,并且在将PHP代码导出到Javascript中时遇到了一些麻烦……
function encrypt($message)
{
$envKeys = [];
$encMessage = '';
$pubKey = "-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES256'));
if (openssl_seal($message, $encMessage, $envKeys, [$pubKey], 'AES256', $iv) === false) {
throw new Exception("Erreur lors du cryptage du message !");
}
return [base64_encode($encMessage), base64_encode($envKeys[0]), base64_encode($iv)];
}
function decrypt($messageCrypte, $key, $iv)
{
$privateKey = "-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
";
$message = '';
openssl_open(base64_decode($messageCrypte), $message, base64_decode($key), $privateKey, 'AES256', base64_decode($iv));
return $message;
}
$crypted = encrypt('Test');
$embed = "<script>var encrypted = '$crypted[0]'; var envelope = '$crypted[1]'; var iv = '$crypted[2]'; </script>";
<html>
<head>
<script type="text/javascript" src="crypto-js.js"></script>
<script type="text/javascript" src="jsencrypt.js"></script>
<?php echo $embed; ?>
<script>
var private_key = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`;
var crypt = new JSEncrypt();
crypt.setPrivateKey(private_key);
var theKey = CryptoJS.enc.Utf8.parse(crypt.decrypt(envelope));
console.log('The key', theKey);
console.log('ciphertext', CryptoJS.enc.Base64.parse(encrypted));
var decrypted = CryptoJS.AES.decrypt(
{ciphertext: CryptoJS.enc.Base64.parse(encrypted)},
theKey,
{iv: CryptoJS.enc.Base64.parse(iv)}
);
console.log('Decrypted', decrypted.toString());
</script>
</head>
<body>
</body>
</html>
我没有原始消息“ Test”……只有空字符串…… 我希望能够使用CryptoJS和JSEncrypt在JS中创建一个openssl_seal(如PHP一个)方法和一个openssl_open(如PHP一个)。 我认为有可能,也许有人已经做到了……
如果有人对此问题感兴趣,我可能会找到线索:http://geekswithblogs.net/Strenium/archive/2013/01/27/converting-phprsquos-ldquoopenssl_sealrdquo-and-ldquoopenssl_openrdquo-into-.net.aspx
它用于.NET,但这只是一个开始……