PHP - Tool per crittografia file online

Per permettere un certo livello di riservatezza nelle comunicazioni si deve ricorrere a sistemi che vadano a cifrare i dati in transito, facendo in modo che solo il diretto interessato sia in grado di risalire al messaggio reale inviato; questo tipo di comunicazione deve essere supportata da strumenti che permettano, conosciuta la chiave di decodifica, di andare a decifrare i messaggi/file che sono stati precedentemente cifrati.

Di seguito potete trovare un semplice tool in PHP che permette, una volta ospitato su un server web e utilizzato via browser, di cifrare/decifrare un file con la password da voi scelta.

<?php$ALGORITHM = 'AES-128-CBC';$IV    = '12dasdq3g5b2434b';$error = '';if (isset($_POST) && isset($_POST['operazione'])) {    $password   = isset($_POST['password']) && $_POST['password']!='' ? $_POST['password'] : null;  $operazione = isset($_POST['operazione']) && in_array($_POST['operazione'],array('c','d')) ? $_POST['operazione'] : null;  $file     = isset($_FILES) && isset($_FILES['file']) && $_FILES['file']['error'] == UPLOAD_ERR_OK ? $_FILES['file'] : null;    if ($password === null) {    $error .= 'Password non valida<br>';  }  if ($operazione === null) {    $error .= 'Operazione non valida<br>';  }  if ($file === null) {    $error .= 'Errore nella ricezione del file<br>';  }    if ($error === '') {      $contenuto = '';    $nomefile  = '';      $contenuto = file_get_contents($file['tmp_name']);    $filename  = $file['name'];      switch ($operazione) {      case 'c':        $contenuto = openssl_encrypt($contenuto, $ALGORITHM, $password, 0, $IV);        $filename  = $filename . '.crypto';        break;      case 'd':        $contenuto = openssl_decrypt($contenuto, $ALGORITHM, $password, 0, $IV);        $filename  = preg_replace('#\.crypto$#','',$filename);        break;    }        if ($contenuto === false) {      $error .= 'Errore nei dati di cifratura/decifratura';    }        if ($error === '') {          header("Pragma: public");      header("Pragma: no-cache");      header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");      header("Cache-Control: post-check=0, pre-check=0", false);      header("Expires: 0");      header("Content-Type: application/octet-stream");      header("Content-Disposition: attachment; filename=\"" . $filename . "\";");      $size = strlen($contenuto);      header("Content-Length: " . $size);      echo $contenuto;          die;          }    }  }?><html>  <head>    <title>Cifratura/Decifratura file</title>    <meta charset="utf-8">    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">  </head>  <body>    <div class="container">      <div class="row">        <div class="col-12" >          <h1>Utility per cifratura e decifratura di file</h1>        </div>      </div>      <?php if ($error != '') { ?>      <div class="row">        <div class="col-12 alert alert-danger" role="alert">          <?php echo ($error); ?>        </div>      </div>      <?php } ?>      <form class="form" enctype="multipart/form-data" method="post" id="form1" name="form1" auto-complete="off">        <div class="form-row">          <div class="form-group">            <label for="file">File da elaborare</label>            <input type="file" name="file" id="file" placeholder="Selezionare file" required class="form-control-file"/>          </div>        </div>        <div class="form-row">          <div class="form-group">            <label for="password">Password</label>            <input type="password" name="password" id="password" placeholder="Indicare la password" required class="form-control" />          </div>        </div>        <div class="form-row">          <div class="form-group">            <label for="operazione">Operazione</label>            <select name="operazione" id="operazione" required class="form-control">              <option value="">Selezionare azione</option>              <option value="c">Cifra</option>              <option value="d">Decifra</option>            </select>          </div>        </div>        <div class="form-row">          <button type="submit" class="btn btn-primary" onclick="setTimeout('document.form1.reset();',1000)">Esegui</button>          <button type="reset" class="btn btn-reset">Annulla</button>         </div>      </form>    </div>    <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>    <script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.bundle.min.js"></script>  </body></html>