• Как реализовать шифрование данных на php?

    ZaitsZaits
    @ZaitsZaits
    Web-разработчик
    Попробуйте так:

    JS:
    /**
     * Зашифровать сообщение AES ключом
     * 
     * @param string шифруемое сообщение
     * @param key ключ, 8 символов от 0 до F
     * @return string зашифрованное сообщение
     */
    function encrypt (string, key){
      var mykey = CryptoJS.enc.Hex.parse(key+key+key+key);
      var iv  = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
      string='_crc_'+string+String.fromCharCode(0);
      var len=string.length;
      var ost=len%16;
      for (var i=0;i<ost-1;i++)
          string=string+String.fromCharCode(getRandomInt(65,90));
      var encrypted = CryptoJS.AES.encrypt(
        string, 
        mykey, 
        {
          keySize: 128 / 8, 
          iv: iv, 
          mode: CryptoJS.mode.CBC, 
          padding: CryptoJS.pad.Pkcs7
        }
      );
      var encr=encrypted.ciphertext.toString(CryptoJS.enc.Hex);
      return encr;
    }
    
    /**
     * Расшифровать сообщение AES ключом
     * 
     * @param crypted зашифрованные данные
     * @param key ключ, 8 символов от 0 до F
     * @return string расшифрованное сообщение
     */
    function decrypt(crypted, key) {
      try {
        var mykey = CryptoJS.enc.Hex.parse(key+key+key+key);
        var iv  = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
        var ciphertext = CryptoJS.enc.Hex.parse(crypted);
        var encrypted = new Object();
        encrypted.ciphertext = ciphertext;
        var decrypted = CryptoJS.AES.decrypt(
          encrypted, 
          mykey, 
          {
            keySize: 128 / 8, 
            iv: iv, 
            mode: CryptoJS.mode.CBC, 
            padding: CryptoJS.pad.Pkcs7
          }
        );
        var decr=CryptoJS.enc.Utf8.stringify(decrypted);
      
        var decr2 = "";
        var endIndex = 0;
        for (var i = 0; i<decr.length; i++) {
          if (decr.charCodeAt(i)==0) {
            endIndex=i;
            break;
          }
        }
        
        decr2=decr.substr(0, endIndex);
        
        if (decr2.indexOf('_crc_') !== 0) throw new Error(); 
          
        return decr2.substr(5);
          
      } catch (e) {
          throw "Ошибка расшифровки ответа сервера"; 
      }
    }


    PHP:
    function encrypt ($string, $key) {
        
      //проверяем, чтобы длина ключа была 8 символов
      if (mb_strlen($key,'utf-8') !== 8) 
        throw new Exception ("Длина ключа должна быть 8 символов");
    
      //устанавливаем тип алгоритма
      $keySize      = MCRYPT_RIJNDAEL_128;
      $mode         = MCRYPT_MODE_CBC;
    
      //формируем полный ключ, полный ключ состоит из повторяющихся четыре раза ключа, итого 32 байта
      $fullkeystring=$key.$key.$key.$key;
    
      //преобразуем ключ из строки в байтовый массив
      $mykey=pack("H*",strtoupper($fullkeystring));
    
      //IV используем нулевой
      $iv=pack("H*",'00000000000000000000000000000000');
    
      //добавляем к сообщению заголовок, по которому потом будем определять, расшифровалось или нет, в конец записываем 0
      $string='_crc_'.$string.chr(0);
    
      //дополняем строку до границы разным мусором
      $len=strlen($string);
      $ost=$len % 16;
      for ($i=0;$i<$ost-1;$i++) 
        $string=$string.chr(rand(65, 90));
    
      //шифруем
      $ciphertext = mcrypt_encrypt($keySize, $mykey, $string, $mode, $iv); 
    
      //преобразуем байтовый массив в строку содержащую шестнадцатеричный код, и возвращаем ее
      return strtoupper(bin2hex($ciphertext));
    }
    
    function decrypt ($crypted, $Key) {
    
      //проверяем, чтобы длина ключа была 8 символов
      if (mb_strlen($Key,'utf-8') !== 8) 
        throw new Exception ("Неверная длина ключа");
    
      //устанавливаем тип алгоритма
      $keySize      = MCRYPT_RIJNDAEL_128;
      $mode         = MCRYPT_MODE_CBC;
    
      //формируем полный ключ, полный ключ состоит из повторяющихся четыре раза ключа, итого 32 байта
      $fullkeystring=$Key.$Key.$Key.$Key;
    
      //преобразуем ключ из строки в байтовый массив
      $mykey=pack("H*",strtoupper($fullkeystring));
    
      //IV используем нулевой
      $iv=pack("H*",'00000000000000000000000000000000');
    
      //преобразуем строку к верхнему регистру, а затем из шестнадцатеричного кода преобразуем в массив байтов
      $BinMessage=pack("H*",strtoupper($crypted));
    
      //дешифруем сообщение
      $decrypt=mcrypt_decrypt($keySize, $mykey, $BinMessage, $mode, $iv); 
    
      //обрезаем пробелы
      $result = trim($decrypt);
    
      //проверяем, корректно ли расшифровалось, или нет
      if (strpos($result,'_crc_') !== false && strpos($result,'_crc_') === 0) {
    
        //убираем лишний мусор содержащейся в конце строки
        if (strpos($result, chr(0))>0)
          $result = substr($result, 0, strpos($result, chr(0)));
    
        return substr ($result, 5);  //если все нормально, возвращаем строку
      }
      else throw new Exception ("Неверный ключ шифрования");
    }
    Ответ написан
    Комментировать