2016-01-18 5 views
1

Я пытаюсь передать зашифрованные данные через цикл while, чтобы расшифровать данные из базы данных. Я могу получить какой-то результат. Хотя, поскольку дешифровка зависит от того, соответствует ли строка ключу. Если ключ не совпадает, он ничего не отображает, потому что все строки объединяются, а не разбиваются на каждую строку таблицы.While Loop зашифрованные данные

Что я вижу случиться:

Если зашифрованы данные линии 1:

Если зашифрованы данные линии 2:

+-------------------+ 
| client_name  | 
+-------------------+ 
| 1234    | 
| 5678    | 
+-------------------+ 

Результат с циклом while: . То, что я пытаюсь достичь, заключается в том, что цикл while переходит в линию и выводит для расшифровки.

Вот что я для выхода во время цикла:

<?php 
    $data = mysql_query("SELECT * FROM invoices WHERE username = '$username'") or die(mysql_error()); 
    while($info = mysql_fetch_array($data)) 
    { 
    $security = new Security(); 
    echo "<a href='#' class='list-group-item'>".$security->decrypt($info['client_name'])." <span class='label label-default pull-right'>Invoice 20</span></a>"; 
    } 
?> 

Вот что у меня есть для дешифровки: (На основании - http://wpy.me/blog/15-encrypt-and-decrypt-data-in-php-using-aes-256)

<?php class Security { 

      # Private key 
      public static $salt = 'ZfTfbipGsZ4yz34jFrGHagahptzLN7ROigy'; 


      # Encrypt a value using AES-256. 
      public static function encrypt($plain, $key = null, $hmacSalt = null) { 
       if(empty($key)) { 
        $key = self::$salt; 
       } 

       self::_checkKey($key, 'encrypt()'); 

       if ($hmacSalt === null) { 
        $hmacSalt = self::$salt; 
       } 

       $key = substr(hash('sha256', $key . $hmacSalt), 0, 32); # Generate the encryption and hmac key 

       $algorithm = MCRYPT_RIJNDAEL_128; # encryption algorithm 
       $mode = MCRYPT_MODE_CBC; # encryption mode 

       $ivSize = mcrypt_get_iv_size($algorithm, $mode); # Returns the size of the IV belonging to a specific cipher/mode combination 
       $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM); # Creates an initialization vector (IV) from a random source 
       $ciphertext = $iv . mcrypt_encrypt($algorithm, $key, $plain, $mode, $iv); # Encrypts plaintext with given parameters 
       $hmac = hash_hmac('sha256', $ciphertext, $key); # Generate a keyed hash value using the HMAC method 
       return $hmac . $ciphertext; 
      } 

      # Check key 
      protected static function _checkKey($key, $method) { 
       if (strlen($key) < 32) { 
        echo "Invalid key $key, key must be at least 256 bits (32 bytes) long."; die(); 
       } 
      } 

      # Decrypt a value using AES-256. 
      public static function decrypt($cipher, $key = null, $hmacSalt = null) { 
       if(empty($key)) { 
        $key = self::$salt; 
       } 

       self::_checkKey($key, 'decrypt()'); 

       if (empty($cipher)) { 
        echo 'The data to decrypt cannot be empty.'; die(); 
       } 
       if ($hmacSalt === null) { 
        $hmacSalt = self::$salt; 
       } 

       $key = substr(hash('sha256', $key . $hmacSalt), 0, 32); # Generate the encryption and hmac key. 

       # Split out hmac for comparison 
       $macSize = 64; 
       $hmac = substr($cipher, 0, $macSize); 
       $cipher = substr($cipher, $macSize); 

       $compareHmac = hash_hmac('sha256', $cipher, $key); 
       if ($hmac !== $compareHmac) { 
        return false; 
       } 

       $algorithm = MCRYPT_RIJNDAEL_128; # encryption algorithm 
       $mode = MCRYPT_MODE_CBC; # encryption mode 
       $ivSize = mcrypt_get_iv_size($algorithm, $mode); # Returns the size of the IV belonging to a specific cipher/mode combination 

       $iv = substr($cipher, 0, $ivSize); 
       $cipher = substr($cipher, $ivSize); 
       $plain = mcrypt_decrypt($algorithm, $key, $cipher, $mode, $iv); 
       return rtrim($plain, "\0"); 
      } 

     } 
?> 

Что бы вы посоветовали мне делать в моем цикле while для вывода каждой точки данных отдельно?

+0

Я не получить эту проблему? Сейчас идет линия для линии. Это просто «эхо», которое перекликается с ним на одной линии. Добавьте '
' для каждой итерации? И вы должны поместить экземпляр класса Security перед циклом while. –

+0

Я думаю, ваша проблема в том, что вы не получаете вывод на отдельных строках, но я не уверен. Возможно, у вас проблемы с расшифровкой, так как выглядит так же, как и вход. Если все, что вам нужно, это отдельные строки, возможно, добавление «эха»

«'поможет? –

+0

в коде, который вы пытаетесь расшифровать с помощью 128-битного алгоритма. YET вы проверяете длину ключа в 256 бит .... не вычисляет, ваш код никогда не будет работать правильно. Вообще. – specializt

ответ

-1

Просто сделайте так:

if($data->num_rows() > 0){ 
    // create her security object not inside loop. 
    $security = new Security(); 

    foreach($data->result() as $row){ 
     echo "<a href='#' class='list-group-item'>".$security->decrypt($row->client_name)." <span class='label label-default pull-right'>Invoice 20</span></a><br/>"; 
    } 
} 
+2

Вы действительно должны объяснить, что вы делаете, а не просто публиковать кусок кода. Мы должны помогать друг другу учиться, а не просто выполнять свою работу за них. –

+0

@MagnusEriksson Да, вы правы! –

+0

Другое дело ... '$ data-> result()' ... что это? «$ data» - это ресурс результата mysql, который не имеет никакого метода ':: result()', насколько я знаю? –