ТРОЙНОЕ шифрование/дешифрование DES с использованием php

У меня есть этот КОД ШИФРОВАНИЯ TRIPLE DES В PHP

    $encryption_key = "CE51E06875F7D964";
    $data='tokenNo=test&securityCode=111' ;
    echo $desEncryptedData = encryptText_3des($data, $encryption_key);//outputs 3des encrypted data

function encryptText_3des($plainText, $key) {
    $key = hash("md5", $key, TRUE); 
    for ($x=0;$x<8;$x++) {
        $key = $key.substr($key, $x, 1);
    }
    $padded = pkcs5_pad($plainText,
        mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
    return $encrypted;
}
 function pkcs5_pad ($text, $blocksize)   
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

Я могу зашифровать данные как xcFEvIdLXc2fjhG1i4iPOQu5L6ahxwZVucDOPqeMM2E=

Теперь у меня есть ключ, смогу ли я расшифровать эти данные в текстовом формате?

я пробовал так

            $encryption_key = "CE51E06875F7D964";
        $data='xcFEvIdLXc2fjhG1i4iPOQu5L6ahxwZVucDOPqeMM2E=' ; //encrypted data
        echo $desEncryptedData = encryptText_3des($data, $encryption_key);//outputs 3des encrypted data

    function encryptText_3des($plainText, $key) {
        $key = hash("md5", $key, TRUE); 
        for ($x=0;$x<8;$x++) {
            $key = $key.substr($key, $x, 1);
        }
        $padded = pkcs5_unpad($plainText,
            mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
        $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
        return $encrypted;
    }

    function pkcs5_unpad($text)   

    {
        $pad = ord($text{strlen($text)-1});
        if ($pad > strlen($text)) return false;
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
        return substr($text, 0, -1 * $pad);
    }

Но я не мог этого сделать. Я делаю неправильно? Пожалуйста, предложите мне способ расшифровать это? Используется ли сам ключ шифрования для расшифровки данных в тройном DES? Пожалуйста, помогите


person Piya    schedule 23.03.2014    source источник
comment
Шифрование такого рода данных (файлы cookie или параметры ответа), как известно, сложно выполнить правильно. Режим CBC выявляет тривиальную уязвимость оракула заполнения. Повторные атаки еще проще. Вывод ключа в этом случае также вызывает сомнения.   -  person ntoskrnl    schedule 23.03.2014
comment
Лучше не использовать PHP mcrypt, это заброшенное программное обеспечение, оно не обновлялось годами и не поддерживает стандартное заполнение PKCS#7 (урожденное PKCS#5), только нестандартное заполнение нулями, которое даже нельзя использовать с двоичным кодом. данные. mcrypt содержит множество нерешенных ошибок, начиная с 2003 года. Расширение mcrypt устарело и будет удалено. в PHP 7.2. Вместо этого рассмотрите возможность использования defuse или RNCryptor, они обеспечивают полное решение, поддерживаются и являются правильными.   -  person zaph    schedule 03.11.2017
comment
Вывод ключа плохой, используйте PBKDF2 или аналогичный метод получения ключа.   -  person zaph    schedule 03.11.2017
comment
@ntoskrnl Атака оракула заполнения CBC работает только в том случае, если злоумышленнику возвращаются ошибки заполнения.   -  person zaph    schedule 03.11.2017


Ответы (4)


Это решение:

public function encrypt($data, $secret)
{
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    //Pad for PKCS7
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    //Encrypt data
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

    return base64_encode($encData);
}

public function decrypt($data, $secret)
{
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
}

С Уважением.

person Damian    schedule 28.01.2015
comment
Ваша функция расшифровки возвращает пустую строку! Пожалуйста, исправьте это. - person Black; 12.11.2016

https://github.com/iam-raihan96/3DES-ECB-Cryptography-in-PHP

здесь я написал 3DES-ECB Криптография на PHP. там вы получите два файла класса "Crypt_mcrypt", используя "mcrypt" и "Crypt_openssl", используя "openssl". . так что вы можете использовать любой из них, но это

настоятельно рекомендуется использовать "Crypt_openssl"

Если вы вводите слово mcrypt в свой код, вы, вероятно, делаете ошибку. Хотя можно предоставить относительно безопасную криптографическую библиотеку, основанную на mcrypt (более ранняя версия defuse/php- шифрование), переключение вашего кода на openssl обеспечит лучшую безопасность, производительность, удобство сопровождения и переносимость. Еще лучше: вместо этого используйте libsodium.

person Raihan Al-Mamun    schedule 09.07.2017
comment
самый точный результат 3des ????✨ - person Rizki Noor Hidayat Wijaya; 08.01.2021

Для PHP 7.1 и выше функция mcrypt устарела. Вот альтернатива с использованием openssl_encrypt.

$ciphertext = openssl_encrypt('string to be encrypted', 'DES-EDE3', 'key', OPENSSL_RAW_DATA);
$ciphertext = base64_encode($ciphertext);

Вы можете использовать этот онлайн-инструмент Triple DES-шифрования для перекрестной проверки .

Для другого доступного шифра вы можете вызвать метод PHP openssl_get_cipher_methods()

person Sem    schedule 16.08.2019

Эй, приятель @black, функция расшифровки идеальна, дело в том, что вам нужно передать зашифрованные данные с помощью функции шифрования.

<?php 
  $encryption_key = "CE51E06875F7D964";
  $data='tokenNo=test&securityCode=111' ;
  // the below will return the encoded data you need to put the value in the variable $asl.
  echo encrypt($data,$encryption_key);
  function encrypt($data, $secret)
  {
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

     //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);
    //Pad for PKCS7
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = $blockSize - ($len % $blockSize);
    $data .= str_repeat(chr($pad), $pad);

    //Encrypt data
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

    return base64_encode($encData);
  }

  //the below is the encryption of $data = 'token.....' which there above 
  $asl = 'xcFEvIdLXc0LX+lk46iIFY09GF+FL+SWM0PTNw669VE=';
  // this echo will provide you the $data which is there in the begining
  echo decrypt($asl , $encryption_key);

  function decrypt($data, $secret)
  {
    //Generate a key from a hash
    $key = md5(utf8_encode($secret), true);

    //Take first 8 bytes of $key and append them to the end of $key.
    $key .= substr($key, 0, 8);

    $data = base64_decode($data);

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');

    $block = mcrypt_get_block_size('tripledes', 'ecb');
    $len = strlen($data);
    $pad = ord($data[$len-1]);

    return substr($data, 0, strlen($data) - $pad);
  }

?>
person Umair Baig    schedule 03.11.2017