Как запечатать сообщение в JavaScript для связи с PHP openssl_open в AES256 - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение 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, ноэто начало ...

...