У меня есть приложение PHP, которое может общаться с другими приложениями PHP.Эти приложения обмениваются зашифрованными данными.
Центральное приложение знает все открытые ключи других приложений.
А другие приложения знают только открытый ключ центрального приложения.
Данные шифруются благодаря PHP-методу openssl_seal.
И расшифровываются благодаря PHP-методу openssl_open.
Я использую шифровальный метод "AES256" и генерирую элемент "iv".
В PHP нет никаких проблем, все в лучшем случае влучший из всех возможных миров ...
Но теперь я хотел бы сделать то же самое с приложением Ionic (на основе cordova и Angular 5).
Я пытался использовать JSEncrypt и CryptoJS,но PHP не объясняет, как работает openssl_seal, и у меня возникают проблемы с экспортом моего кода PHP в Javascript one ...
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" ... Толькопустая строка ... Я хотел бы иметь возможность сделать метод openssl_seal (как в PHP один) в JS и openssl_open (как в PHP) с использованием CryptoJS и JSEncrypt.Я думаю, что это возможно, возможно, кто-то уже сделал это ...
Редактировать
Если кого-то интересует эта проблема, возможно, я нашел отрывок: http://geekswithblogs.net/Strenium/archive/2013/01/27/converting-phprsquos-ldquoopenssl_sealrdquo-and-ldquoopenssl_openrdquo-into-.net.aspx
Это для .NET, ноэто начало ...