PHP encrypt-store-decrypt используя libsodium + mysql - PullRequest
0 голосов
/ 13 сентября 2018

Я нахожусь в проекте по разработке веб-приложения для хранения данных судебного процесса и сообщений между посредником и клиентом.Все должно быть зашифровано.В последнее время я изучаю новые методы шифрования / дешифрования, и я строю этот кусок кода, чтобы проверить его.Может кто-нибудь посоветовать мне, если у меня все хорошо или нет?

<?php

if (!sodium_crypto_aead_aes256gcm_is_available()) {
    echo ":(";
    die();
}

function create_key() {
    // generate a key
    $key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES);
    // store the key in a folder, for development proposes it's in the root folder
    fopen('a1/'.sodium_bin2hex($key), "w") or die("Unable to open file!");
    return $key;
}

function create_nonce() {
    // generate a nonce
    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
    // store the nonce in a folder, for development proposes it's in the root folder
    fopen('a2/'.sodium_bin2hex($nonce), "w") or die("Unable to open file!");
    return $nonce;
}

function encrypt ($message_to_encrypt) {
    // encript the given message
    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt($message_to_encrypt, "blabla", $nonce = create_nonce(), $key = create_key());
    return $ciphertext;
}


function decrypt ($message_to_decrypt) {
    // get the keys and ninces from folder
    $dir_path = 'a1/';
    if (is_dir($dir_path)) {
        $keys_array = scandir($dir_path);
        unset($keys_array[0]);
        unset($keys_array[1]);
    }
    $dir_path = 'a2/';
    if (is_dir($dir_path)) {
        $nonces_array = scandir($dir_path);
        unset($nonces_array[0]);
        unset($nonces_array[1]);
    }
    // development propose counter
    $i = 1;
    // for each key, try every nonce to get a match
    foreach ($keys_array as $key) {
        foreach ($nonces_array as $nonce) {
            $decrypted = sodium_crypto_aead_aes256gcm_decrypt($message_to_decrypt, "blabla", sodium_hex2bin($nonce), sodium_hex2bin($key));
            // if we found a match, return the decrypted string
            if (!$decrypted === false) {
                return $i . " - " .  $decrypted. "<br />";
                die();
            }
            $i++;
        }
    }
}

$message = "just a test message to encrypt";
echo "message to encrypt - " . $message;
echo "<p>";

$encrypted_mgs = encrypt($message);
echo "encrypted message - " . $encrypted_mgs;
echo "<p>";

$decrypted_mgs = decrypt($encrypted_mgs);
echo "decrypted message - " . $decrypted_mgs;
echo "<p>";

echo "end.";
...