Меню Рубрики

Установка mcrypt для php

Как установить MCrypt для PHP 7.x

Расширение MCrypt предназначено для шифрования/дешифрования данных. Оно было признано устаревшим и в итоге, начиная с версии PHP 7.2 его убрали из ядра php. Однако, могут возникнуть ситуации, когда это расширение может понадобится, когда, например, вы работаете с какой-то устаревшей cms или просто старой программой и нет времени или желания переделывать программу.

Расширение MCrypt было перенесено в PECL по адресу https://pecl.php.net/package/mcrypt. На момент написания статьи последняя версия 1.0.3, которая поддерживает PHP 7.2, PHP 7.3 и PHP 7.4, а так же обещает поддержку PHP 8, который пока еще не вышел.

Как установить MCrypt для PHP 7.2, 7.3, 7.4 для Linux

Необходимо выполнить обновление репозитария и затем установить расширение:

После установки найдите куда установился файл mcrypt.so. Скорее всего это /usr/lib/php/modules/mcrypt.so или /usr/lib64/php/modules/mcrypt.so

Затем нужно найти php.ini. Не могу указать точный путь, т.к. на разных системах это могут быть абсолютно разные места, например, /etc/php.ini, либо /etc/php/7.2/cli/php.ini или /opt/php72/etc и др. Так же, php.ini может быть в папке пользователя.

В php.ini найдите где добавляются другие расширения (строки начинающиеся «extension=»), либо просто в конце файла, каким-нибудь редактором добавьте строку:

где вместо path_to_mcrypt напишите свой путь, который находили ранее.

Как установить MCrypt для PHP 7.2, 7.3, 7.4 для Windows

Скачайте архив расширения со страницы PECL https://pecl.php.net/package/mcrypt/1.0.3/windows для нужной версии PHP. Если не уверены, какая именно версия Thread Safe (TS) x86, Non Thread Safe (NTS) x86 или тоже x64 нужна, скачайте все четыре версии. Потом просто попробуете каждую из них и какая заработает, ту и оставите.

В скачанном архиве вам нужен файл php_mcrypt.dll — его нужно распаковать в папку, где установлен ваш PHP в подкаталог ext, где находятся и все другие расширения.

В php.ini найдите где добавляются другие расширения (строки начинающиеся «extension=»), либо в конце файла, добавьте строку:

где вместо path_to_mcrypt напишите путь, куда распаковали dll-файл.

Вместо полного пути к библиотеки, можно так же в php.ini написать:

Проверить установку можно просто на одном из сайтов своего сервера выполнить php-код: phpinfo();. При этом, должна появиться секция mcrypt:

На этом установка MCrypt для PHP 7.2, 7.3, 7.4 завершена.

источник

Mcrypt

User Contributed Notes 8 notes

If you’re wanting to use mcrypt on a newer version of PHP where it’s been deprecated try the shim for it instead:

These are two simple functions I built for 256-bit encryption/decryption with mcrypt. I’ve decided to use MCRYPT_RIJNDAEL_128 because it’s AES-compliant, and MCRYPT_MODE_CBC. (ECB mode is inadequate for many purposes because it does not use an IV.)

This function stores a hash of the data to verify that the data was decrypted successfully, but this could be easily removed if necessary.

function encrypt ( $decrypted , $password , $salt = ‘!kQm*fF3pXe1Kbm%9’ ) <
// Build a 256-bit $key which is a SHA256 hash of $salt and $password.
$key = hash ( ‘SHA256’ , $salt . $password , true );
// Build $iv and $iv_base64. We use a block size of 128 bits (AES compliant) and CBC mode. (Note: ECB mode is inadequate as IV is not used.)
srand (); $iv = mcrypt_create_iv ( mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_128 , MCRYPT_MODE_CBC ), MCRYPT_RAND );
if ( strlen ( $iv_base64 = rtrim ( base64_encode ( $iv ), ‘=’ )) != 22 ) return false ;
// Encrypt $decrypted and an MD5 of $decrypted using $key. MD5 is fine to use here because it’s just to verify successful decryption.
$encrypted = base64_encode ( mcrypt_encrypt ( MCRYPT_RIJNDAEL_128 , $key , $decrypted . md5 ( $decrypted ), MCRYPT_MODE_CBC , $iv ));
// We’re done!
return $iv_base64 . $encrypted ;
>

function decrypt ( $encrypted , $password , $salt = ‘!kQm*fF3pXe1Kbm%9’ ) <
// Build a 256-bit $key which is a SHA256 hash of $salt and $password.
$key = hash ( ‘SHA256’ , $salt . $password , true );
// Retrieve $iv which is the first 22 characters plus ==, base64_decoded.
$iv = base64_decode ( substr ( $encrypted , 0 , 22 ) . ‘==’ );
// Remove $iv from $encrypted.
$encrypted = substr ( $encrypted , 22 );
// Decrypt the data. rtrim won’t corrupt the data because the last 32 characters are the md5 hash; thus any \0 character has to be padding.
$decrypted = rtrim ( mcrypt_decrypt ( MCRYPT_RIJNDAEL_128 , $key , base64_decode ( $encrypted ), MCRYPT_MODE_CBC , $iv ), «\0\4» );
// Retrieve $hash which is the last 32 characters of $decrypted.
$hash = substr ( $decrypted , — 32 );
// Remove the last 32 characters from $decrypted.
$decrypted = substr ( $decrypted , 0 , — 32 );
// Integrity check. If this fails, either the data is corrupted, or the password/salt was incorrect.
if ( md5 ( $decrypted ) != $hash ) return false ;
// Yay!
return $decrypted ;
>
?>

Читайте также:  Установка привода ворот somfy

people using phpmyadmin are redirected to this manual if they don’t have mcrypt installed. If you want to install mcrypt on debian, first check your php version:

Then install the appropriate version of mcrypt (php5-mcrypt if your php version is 5.x)

yourserver# apt-get install php4-mcrypt
. or.
yourserver# apt-get install php5-mcrypt

If you want a quick way to see what ciphers, modes, key, block and iv sizes are supported on your server, try something like the following.

Note: I used this simple bash: `locate libmcrypt` from terminal on Mac OS X to determine the install paths to the algorithms and modes directories. Lots of function calls generate warnings for certain ciphers, hence the use of error suppression.

= mcrypt_list_modes ();
$algorithms = mcrypt_list_algorithms ();
foreach( $algorithms as $cipher )
<
echo «

» . $cipher . «

\n» ;
@ $td = mcrypt_module_open (
$cipher ,
‘/usr/local/libmcrypt-2.5.8/modules/algorithms/’ ,
$mode ,
‘/usr/local/libmcrypt-2.5.8/modules/modes/’ );
@ $key_size = mcrypt_enc_get_key_size ( $td );
@ $block_size = mcrypt_get_block_size ( $cipher , $mode );
@ $iv_size = mcrypt_get_iv_size ( $cipher , $mode );
@ mcrypt_module_close ( $td );
echo »
\n» ;
$td = NULL ;
$key_size = NULL ;
$block_size = NULL ;
$iv_size = NULL ;
>
>

источник

Mcrypt

Содержание

  • mcrypt_cbc — Шифрует/дешифрует данные в режиме CBC
  • mcrypt_cfb — Кодирует/раскодирует данные в режиме CFB
  • mcrypt_create_iv — Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника
  • mcrypt_decrypt — Расшифровывает данные с заданными параметрами
  • mcrypt_ecb — Устарело: Шифрует и дешифрует данные в режиме ECB
  • mcrypt_enc_get_algorithms_name — Возвращает имя алгоритма
  • mcrypt_enc_get_block_size — Возвращает размер блока алгоритма
  • mcrypt_enc_get_iv_size — Возвращает размер инициализирующего вектора для алгоритма
  • mcrypt_enc_get_key_size — Возвращает максимальную допустимую длину ключа алгоритма
  • mcrypt_enc_get_modes_name — Возвращает имя используемого режима
  • mcrypt_enc_get_supported_key_sizes — Возвращает массив с допустимыми размерами ключа для используемого алгоритма
  • mcrypt_enc_is_block_algorithm_mode — Проверяет, используется ли блочный режим
  • mcrypt_enc_is_block_algorithm — Проверяет, использует ли алгоритм блочные режимы
  • mcrypt_enc_is_block_mode — Проверяет, возвращает ли текущий режим блоки
  • mcrypt_enc_self_test — Запуск самопроверки открытого модуля
  • mcrypt_encrypt — Шифрует текст с заданными параметрами
  • mcrypt_generic_deinit — Эта функция деинициализирует модуль шифрования
  • mcrypt_generic_end — Функция прерывает шифрование
  • mcrypt_generic_init — Функция инициализирует все буферы, необходимые для шифрования
  • mcrypt_generic — Функция шифрует данные
  • mcrypt_get_block_size — Возвращает размер блока для указанного шифра
  • mcrypt_get_cipher_name — Получает имя указанного шифра
  • mcrypt_get_iv_size — Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима
  • mcrypt_get_key_size — Получить размер ключа заданного шифра
  • mcrypt_list_algorithms — Получить список всех поддерживаемых алгоритмов шифрования
  • mcrypt_list_modes — Получить список всех поддерживаемых режимов шифрования
  • mcrypt_module_close — Закрывает модуль mcrypt
  • mcrypt_module_get_algo_block_size — Возвращает размер блока указанного алгоритма
  • mcrypt_module_get_algo_key_size — Возвращает максимальный размер ключа открытого режима
  • mcrypt_module_get_supported_key_sizes — Возвращает список поддерживаемых размеров ключей для открытого алгоритма
  • mcrypt_module_is_block_algorithm_mode — Проверяет, является ли заданный модуль блочным или нет
  • mcrypt_module_is_block_algorithm — Проверяет, является ли заданный алгоритм блочным или нет
  • mcrypt_module_is_block_mode — Проверить, возвращает ли указанный режим данные блоками или нет
  • mcrypt_module_open — Открывает модуль шифрования с использованием указанных алгоритма и режима
  • mcrypt_module_self_test — Функция запускает самопроверку указанного модуля
  • mcrypt_ofb — Шифрует и дешифрует данные в режиме OFB
  • mdecrypt_generic — Дешифровка данных

User Contributed Notes 24 notes

if you don’t have mcrypt installed, try phpseclib — http://phpseclib.sourceforge.net

includes pure-php implementations of des, 3des, rc4, aes, and rijndael. uses mcrypt if it’s available and a pure-php implementation otherwise. it also has the distinction of having the fastest existent pure-php aes implementation as per section 3.5.5. «Speed Comparisons» of the documentation.

mcrypt_ecb with base64_decode gave some problems, i found out that it had to be chopped to work:

( mcrypt_ecb ( MCRYPT_BLOWFISH , $key , base64_decode ( $input ), MCRYPT_DECRYPT ));
?>

For those of you that need to use PKCS#5 padding, the mcrypt API’s for PHP do not support it. However, you can DIY using the following:

function encrypt_something ( $input )
<
$size = mcrypt_get_block_size ( ‘des’ , ‘ecb’ );
$input = pkcs5_pad ( $input , $size );

Читайте также:  Установка клавиш ноутбука асус

$key = ‘YOUR SECRET KEY HERE’ ;
$td = mcrypt_module_open ( ‘des’ , » , ‘ecb’ , » );
$iv = mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
mcrypt_generic_init ( $td , $key , $iv );
$data = mcrypt_generic ( $td , $input );
mcrypt_generic_deinit ( $td );
mcrypt_module_close ( $td );
$data = base64_encode ( $data );
return $data ;
>

function pkcs5_pad ( $text , $blocksize )
<
$pad = $blocksize — ( strlen ( $text ) % $blocksize );
return $text . str_repeat ( chr ( $pad ), $pad );
>

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 );
>
?>

mysql AES_ENCRYPT() compatibly function for PHP :

function mysql_aes_encrypt ( $val , $ky ) <
$mode = MCRYPT_MODE_ECB ;
$enc = MCRYPT_RIJNDAEL_128 ;
$val = str_pad ( $val , ( 16 *( floor ( strlen ( $val ) / 16 )+( strlen ( $val ) % 16 == 0 ? 2 : 1 ))), chr ( 16 -( strlen ( $val ) % 16 )));
return mcrypt_encrypt ( $enc , $ky , $val , $mode , mcrypt_create_iv ( mcrypt_get_iv_size ( $enc , $mode ), MCRYPT_DEV_URANDOM ));
>
?>

Please note that if the strlen($ky)>16 then this function will not be compatible.

DEBIAN users: avoid mcrypt installation headaches.
to add mcrypt support to an existing php installation, get root and run

apt-get install php4-mcrypt

restart your webserver, and voila.

I’ve spent the majority of the day attempting to get mcrypt to work under IIS6 with Windows Server 2003 (Web Edition) and PHP 5.0.4

There seems to be some incompatability with enabling certain extensions (mcrypt being one) when you are running PHP as ISAPI in this environment.

The way to solve the problem (the error will be that it cannot load php_mcrypt.dll — access is denied) is to run in CGI. While this isn’t supposed to be as good performance wise, if you need the mcrypt support (or Oracle support, too, I believe) then this is the only way I’ve found to do it.

Attention when using keys longer than the actual key size (i.e. 160 bit instead of 128 bit).

It will work inbetween PHP scripts, but might cause problems when using openssl or other packages with this integration of mcrypt. Cut them always to the supported size (mcrypt_enc_get_key_size) to avoid sleepless hours.

The Pear class Crypt/Blowfish.php will use the mcrypt module if available but the mcrypt module is not required.

Some very easy Pear and example pseudocode to protect your data by encrypting your databases with a one-way hash and blowfish symmetric encryption.
http://en.wikibooks.org/wiki/Cryptography/Database_protection

Using a one-way hash and blowfish symmetric encryption.
1. Insert a record of John Doe in an encrypted database.
2. Get the encrypted record of user John Doe and decrypt the data.

1. Insert a record of John Doe in an encrypted database.
require_once( «Crypt/Blowfish.php» ); // a Pear class

$aRecord [ ’email’ ] = «johndoe@anisp.localhost» ; // The Primary key
$aRecord [ ‘name’ ] = «John Doe» ;
$aRecord [ ‘creditnr’ ] = «0192733652342» ;

// crypt — one-way encryption
$cipher_key = crypt ( $aRecord [ ’email’ ] , «AN_SECRET_COMPANY_SALT» );

$bf = new Crypt_Blowfish ( ‘ecb’ );
$bf -> setKey ( $cipher_key );

// crypt_blowfish symmetric encryption to encrypt the data
$aRecord [ ’email’ ] = $bf -> encrypt ( $aRecord [ ’email’ ] );
$aRecord [ ‘name’ ] = $bf -> encrypt ( $aRecord [ ‘name’ ] );
$aRecord [ ‘creditnr’ ] = $bf -> encrypt ( $aRecord [ ‘creditnr’ ] );

$result = sqlInsert ( $aRecord ) ;
?>

2. Get the encrypted record of user John Doe and decrypt the data.
require_once( «Crypt/Blowfish.php» ); // a Pear class

// crypt — one-way encryption
$cipher_key = crypt ( $primary_key , «AN_SECRET_COMPANY_SALT» );

$bf = new Crypt_Blowfish ( ‘ecb’ );
$bf -> setKey ( $cipher_key );

// crypt_blowfish symmetric encryption to ecrypt the primary key for a sql select
$select_key = $bf -> encrypt ( $primary_key ) ;

$aRecord = sqlSelectWithPKEY ( $select_key );

// crypt_blowfish symmetric encryption to decrypt the data
$aRecord [ ’email’ ] = $bf -> decrypt ( $aRecord [ ’email’ ] );
$aRecord [ ‘name’ ] = $bf -> decrypt ( $aRecord [ ‘name’ ] );
$aRecord [ ‘creditnr’ ] = $bf -> decrypt ( $aRecord [ ‘creditnr’ ] );
?>

Thanks for reading this.

This works completely with mysql aes, even long keys.

function mysql_aes_decrypt ( $val , $ky )
<
$key = «\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0» ;
for( $a = 0 ; $a strlen ( $ky ); $a ++)
$key [ $a % 16 ]= chr ( ord ( $key [ $a % 16 ]) ^ ord ( $ky [ $a ]));
$mode = MCRYPT_MODE_ECB ;
$enc = MCRYPT_RIJNDAEL_128 ;
$dec = @ mcrypt_decrypt ( $enc , $key , $val , $mode , @ mcrypt_create_iv ( @ mcrypt_get_iv_size ( $enc , $mode ), MCRYPT_DEV_URANDOM ) );
return rtrim ( $dec ,(( ord ( substr ( $dec , strlen ( $dec )- 1 , 1 ))>= 0 and ord ( substr ( $dec , strlen ( $dec )- 1 , 1 )) 16 )? chr ( ord ( substr ( $dec , strlen ( $dec )- 1 , 1 ))): null ));
>

Читайте также:  Установка пониженной в раздатку уаз

function mysql_aes_encrypt ( $val , $ky )
<
$key = «\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0» ;
for( $a = 0 ; $a strlen ( $ky ); $a ++)
$key [ $a % 16 ]= chr ( ord ( $key [ $a % 16 ]) ^ ord ( $ky [ $a ]));
$mode = MCRYPT_MODE_ECB ;
$enc = MCRYPT_RIJNDAEL_128 ;
$val = str_pad ( $val , ( 16 *( floor ( strlen ( $val ) / 16 )+( strlen ( $val ) % 16 == 0 ? 2 : 1 ))), chr ( 16 -( strlen ( $val ) % 16 )));
return mcrypt_encrypt ( $enc , $key , $val , $mode , mcrypt_create_iv ( mcrypt_get_iv_size ( $enc , $mode ), MCRYPT_DEV_URANDOM ));
>
?>

the encrypted result data maybe binary data and It make errors in sql query.
so use the base64_encode/base64_decode function with mcrypt()
try below

( mcrypt_ecb ( MCRYPT_BLOWFISH , $key , $input , MCRYPT_ENCRYPT ));

mcrypt_ecb ( MCRYPT_BLOWFISH , $key , base64_decode ( $input ), MCRYPT_DECRYPT );
?>

mcrypt module initialization failed

I found this circumstance:

usemcrypt.php:
function protect () <
//some mcrypt/decrypt command
>
?>

filea.php:
include_once( ‘usemcrypt.php’ );

function a () <
protect ();
> ?>

fileb.php
function b () <
include_once( ‘usemcrypt.php’ );
protect ();
>
?>

filea.php and a() work fine
fileb.php and b() will report a mcrypt module initialization failed

I am assuming you can’t pull that module in on the fly. If you use a file that calls mcrypt, it has to be included at the head, not in a function.

The follow function is a implementation of the RC4 cypher algorithm in pure PHP code.

The function is used to encrypt and decrypt data.

/**
* Crypt/decrypt strings with RC4 stream cypher algorithm.
*
* @param string $key Key
* @param string $data Encripted/pure data
* @see http://pt.wikipedia.org/wiki/RC4
* @return string
*/
function rc4 ( $key , $data )
<
// Store the vectors «S» has calculated
static $SC ;
// Function to swaps values of the vector «S»
$swap = create_function ( ‘&$v1, &$v2’ , ‘
$v1 = $v1 ^ $v2;
$v2 = $v1 ^ $v2;
$v1 = $v1 ^ $v2;
‘ );
$ikey = crc32 ( $key );
if (!isset( $SC [ $ikey ])) <
// Make the vector «S», basead in the key
$S = range ( 0 , 255 );
$j = 0 ;
$n = strlen ( $key );
for ( $i = 0 ; $i 255 ; $i ++) <
$char = ord ( $key < $i % $n >);
$j = ( $j + $S [ $i ] + $char ) % 256 ;
$swap ( $S [ $i ], $S [ $j ]);
>
$SC [ $ikey ] = $S ;
> else <
$S = $SC [ $ikey ];
>
// Crypt/decrypt the data
$n = strlen ( $data );
$data = str_split ( $data , 1 );
$i = $j = 0 ;
for ( $m = 0 ; $m $n ; $m ++) <
$i = ( $i + 1 ) % 256 ;
$j = ( $j + $S [ $i ]) % 256 ;
$swap ( $S [ $i ], $S [ $j ]);
$char = ord ( $data [ $m ]);
$char = $S [( $S [ $i ] + $S [ $j ]) % 256 ] ^ $char ;
$data [ $m ] = chr ( $char );
>
return implode ( » , $data );
>
?>

And some code for LM hash:

function LMhash ( $string )
<
$string = strtoupper ( substr ( $string , 0 , 14 ));

$p1 = LMhash_DESencrypt ( substr ( $string , 0 , 7 ));
$p2 = LMhash_DESencrypt ( substr ( $string , 7 , 7 ));

return strtoupper ( $p1 . $p2 );
>

function LMhash_DESencrypt ( $string )
<
$key = array();
$tmp = array();
$len = strlen ( $string );

for ( $i = 0 ; $i 7 ; ++ $i )
$tmp [] = $i $len ? ord ( $string [ $i ]) : 0 ;

$key [] = $tmp [ 0 ] & 254 ;
$key [] = ( $tmp [ 0 ] 7 ) | ( $tmp [ 1 ] >> 1 );
$key [] = ( $tmp [ 1 ] 6 ) | ( $tmp [ 2 ] >> 2 );
$key [] = ( $tmp [ 2 ] 5 ) | ( $tmp [ 3 ] >> 3 );
$key [] = ( $tmp [ 3 ] 4 ) | ( $tmp [ 4 ] >> 4 );
$key [] = ( $tmp [ 4 ] 3 ) | ( $tmp [ 5 ] >> 5 );
$key [] = ( $tmp [ 5 ] 2 ) | ( $tmp [ 6 ] >> 6 );
$key [] = $tmp [ 6 ] 1 ;

$is = mcrypt_get_iv_size ( MCRYPT_DES , MCRYPT_MODE_ECB );
$iv = mcrypt_create_iv ( $is , MCRYPT_RAND );
$key0 = «» ;

foreach ( $key as $k )
$key0 .= chr ( $k );
$crypt = mcrypt_encrypt ( MCRYPT_DES , $key0 , «KGS!@#$%» , MCRYPT_MODE_ECB , $iv );

return bin2hex ( $crypt );
>
?>

Some optimization?

when compiling php —with-mcrypt, phpinfo() says, that mcrypt ist enabled, but
«Supported ciphers none» and
«Supported modes none»

In order to get mcrypt to work in php, you have to configure and compile the libmcrypt source package with the following options:
./configure —disable-posix-threads —enable-dynamic-loading

источник