Encrypting data in php

Encrypting data in php

  • Different ways to write a PHP code
  • How to write comments in PHP ?
  • Introduction to Codeignitor (PHP)
  • How to echo HTML in PHP ?
  • Error handling in PHP
  • How to show All Errors in PHP ?
  • How to Start and Stop a Timer in PHP ?
  • How to create default function parameter in PHP?
  • How to check if mod_rewrite is enabled in PHP ?
  • Web Scraping in PHP Using Simple HTML DOM Parser
  • How to pass form variables from one page to other page in PHP ?
  • How to display logged in user information in PHP ?
  • How to find out where a function is defined using PHP ?
  • How to Get $_POST from multiple check-boxes ?
  • How to Secure hash and salt for PHP passwords ?
  • Program to Insert new item in array on any position in PHP
  • PHP append one array to another
  • How to delete an Element From an Array in PHP ?
  • How to print all the values of an array in PHP ?
  • How to perform Array Delete by Value Not Key in PHP ?
  • Removing Array Element and Re-Indexing in PHP
  • How to count all array elements in PHP ?
  • How to insert an item at the beginning of an array in PHP ?
  • PHP Check if two arrays contain same elements
  • Merge two arrays keeping original keys in PHP
  • PHP program to find the maximum and the minimum in array
  • How to check a key exists in an array in PHP ?
  • PHP | Second most frequent element in an array
  • Sort array of objects by object fields in PHP
  • PHP | Sort array of strings in natural and standard orders
  • How to pass PHP Variables by reference ?
  • How to format Phone Numbers in PHP ?
  • How to use php serialize() and unserialize() Function
  • Implementing callback in PHP
  • PHP | Merging two or more arrays using array_merge()
  • PHP program to print an arithmetic progression series using inbuilt functions
  • How to prevent SQL Injection in PHP ?
  • How to extract the user name from the email ID using PHP ?
  • How to count rows in MySQL table in PHP ?
  • How to parse a CSV File in PHP ?
  • How to generate simple random password from a given string using PHP ?
  • How to upload images in MySQL using PHP PDO ?
  • How to check foreach Loop Key Value in PHP ?
  • How to properly Format a Number With Leading Zeros in PHP ?
  • How to get a File Extension in PHP ?
  • How to get the current Date and Time in PHP ?
  • PHP program to change date format
  • How to convert DateTime to String using PHP ?
  • How to get Time Difference in Minutes in PHP ?
  • Return all dates between two dates in an array in PHP
  • Sort an array of dates in PHP
  • How to get the time of the last modification of the current page in PHP?
  • How to convert a Date into Timestamp using PHP ?
  • How to add 24 hours to a unix timestamp in php?
  • Sort a multidimensional array by date element in PHP
  • Convert timestamp to readable date/time in PHP
  • PHP | Number of week days between two dates
  • PHP | Converting string to Date and DateTime
  • How to get last day of a month from date in PHP ?
  • PHP | Change strings in an array to uppercase
  • How to convert first character of all the words uppercase using PHP ?
  • How to get the last character of a string in PHP ?
  • How to convert uppercase string to lowercase using PHP ?
  • How to extract Numbers From a String in PHP ?
  • How to replace String in PHP ?
  • How to Encrypt and Decrypt a PHP String ?
  • How to display string values within a table using PHP ?
  • How to write Multi-Line Strings in PHP ?
  • How to check if a String Contains a Substring in PHP ?
  • How to append a string in PHP ?
  • How to remove white spaces only beginning/end of a string using PHP ?
  • How to Remove Special Character from String in PHP ?
  • How to create a string by joining the array elements using PHP ?
  • How to prepend a string in PHP ?
Читайте также:  Open file in new window javascript

Источник

mcrypt_encrypt

This function has been DEPRECATED as of PHP 7.1.0 and REMOVED as of PHP 7.2.0. Relying on this function is highly discouraged.

Description

mcrypt_encrypt (
string $cipher ,
string $key ,
string $data ,
string $mode ,
string $iv = ?
): string | false

Encrypts the data and returns it.

Parameters

One of the MCRYPT_ciphername constants, or the name of the algorithm as string.

The key with which the data will be encrypted. If the provided key size is not supported by the cipher, the function will emit a warning and return false

The data that will be encrypted with the given cipher and mode . If the size of the data is not n * blocksize, the data will be padded with ‘ \0 ‘.

The returned crypttext can be larger than the size of the data that was given by data .

One of the MCRYPT_MODE_modename constants, or one of the following strings: «ecb», «cbc», «cfb», «ofb», «nofb» or «stream».

Used for the initialization in CBC, CFB, OFB modes, and in some algorithms in STREAM mode. If the provided IV size is not supported by the chaining mode or no IV was provided, but the chaining mode requires one, the function will emit a warning and return false .

Return Values

Returns the encrypted data as a string or false on failure.

Examples

Example #1 mcrypt_encrypt() Example

# the key should be random binary, use scrypt, bcrypt or PBKDF2 to
# convert a string into a key
# key is specified using hexadecimal
$key = pack ( ‘H*’ , «bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3» );

# show key size use either 16, 24 or 32 byte keys for AES-128, 192
# and 256 respectively
$key_size = strlen ( $key );
echo «Key size: » . $key_size . «\n» ;

$plaintext = «This string was AES-256 / CBC / ZeroBytePadding encrypted.» ;

# create a random IV to use with CBC encoding
$iv_size = mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_128 , MCRYPT_MODE_CBC );
$iv = mcrypt_create_iv ( $iv_size , MCRYPT_RAND );

# creates a cipher text compatible with AES (Rijndael block size = 128)
# to keep the text confidential
# only suitable for encoded input that never ends with value 00h
# (because of default zero padding)
$ciphertext = mcrypt_encrypt ( MCRYPT_RIJNDAEL_128 , $key ,
$plaintext , MCRYPT_MODE_CBC , $iv );

# prepend the IV for it to be available for decryption
$ciphertext = $iv . $ciphertext ;

# encode the resulting cipher text so it can be represented by a string
$ciphertext_base64 = base64_encode ( $ciphertext );

echo $ciphertext_base64 . «\n» ;

# Resulting cipher text has no integrity or authenticity added
# and is not protected against padding oracle attacks.

$ciphertext_dec = base64_decode ( $ciphertext_base64 );

# retrieves the IV, iv_size should be created using mcrypt_get_iv_size()
$iv_dec = substr ( $ciphertext_dec , 0 , $iv_size );

# retrieves the cipher text (everything except the $iv_size in the front)
$ciphertext_dec = substr ( $ciphertext_dec , $iv_size );

# may remove 00h valued characters from end of plain text
$plaintext_dec = mcrypt_decrypt ( MCRYPT_RIJNDAEL_128 , $key ,
$ciphertext_dec , MCRYPT_MODE_CBC , $iv_dec );

The above example will output:

Key size: 32 ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU= This string was AES-256 / CBC / ZeroBytePadding encrypted.

See Also

  • mcrypt_decrypt() — Decrypts crypttext with given parameters
  • mcrypt_module_open() — Opens the module of the algorithm and the mode to be used

User Contributed Notes 16 notes

If you’re writing code to encrypt/encrypt data in 2015, you should use openssl_encrypt() and openssl_decrypt(). The underlying library (libmcrypt) has been abandoned since 2007, and performs far worse than OpenSSL (which leverages AES-NI on modern processors and is cache-timing safe).

Also, MCRYPT_RIJNDAEL_256 is not AES-256, it’s a different variant of the Rijndael block cipher. If you want AES-256 in mcrypt, you have to use MCRYPT_RIJNDAEL_128 with a 32-byte key. OpenSSL makes it more obvious which mode you are using (i.e. ‘aes-128-cbc’ vs ‘aes-256-ctr’).

OpenSSL also uses PKCS7 padding with CBC mode rather than mcrypt’s NULL byte padding. Thus, mcrypt is more likely to make your code vulnerable to padding oracle attacks than OpenSSL.

Finally, if you are not authenticating your ciphertexts (Encrypt Then MAC), you’re doing it wrong.

Solving 3DES incompatibilities with .NET’s TripleDESCryptoServiceProvider

mcrypt’s 3DES only accepts 192 bit keys, but Microsoft’s .NET and many other tools accept both 128 and 192 bit keys.
If your key is too short, mcrypt will ‘helpfully’ pad null characters onto the end, but .NET refuses to use a key where the last third is all null (this is a Bad Key). This prevents you from emulating mcrypt’s «short key» behaviour in .NET.

How to reconcile this? A little DES theory is in order
3DES runs the DES algorithm three times, using each third of your 192 bit key as the 64 bit DES key

Encrypt Key1 -> Decrypt Key2 -> Encrypt Key3

and both .NET and PHP’s mcrypt do this the same way.
The problem arises in short key mode on .NET, since 128 bits is only two 64 bit DES keys
The algorithm that they use then is:

Encrypt Key1 -> Decrypt Key2 -> Encrypt Key1

mcrypt does not have this mode of operation natively.
but before you go and start running DES three times yourself, here’s a Quick Fix
$my_key = «12345678abcdefgh» ; // a 128 bit (16 byte) key
$my_key .= substr ( $my_key , 0 , 8 ); // append the first 8 bytes onto the end
$secret = mcrypt_encrypt ( MCRYPT_3DES , $my_key , $data , MCRYPT_MODE_CBC , $iv ); //CBC is the default mode in .NET
?>

And, like magic, it works.

There’s one more caveat: Data padding
mcrypt always pads data will the null character
but .NET has two padding modes: «Zeros» and «PKCS7»
Zeros is identical to the mcrypt scheme, but PKCS7 is the default.
PKCS7 isn’t much more complex, though:
instead of nulls, it appends the total number of padding bytes (which means, for 3DES, it can be a value from 0x01 to 0x07)
if your plaintext is «ABC», it will be padded into:
0x41 0x42 0x43 0x05 0x05 0x05 0x05 0x05

You can remove these from a decrypted string in PHP by counting the number of times that last character appears, and if it matches it’s ordinal value, truncating the string by that many characters:
$block = mcrypt_get_block_size ( ‘tripledes’ , ‘cbc’ );
$packing = ord ( $text < strlen ( $text ) - 1 >);
if( $packing and ( $packing < $block ))for( $P = strlen ( $text ) - 1 ; $P >= strlen ( $text ) — $packing ; $P —) if( ord ( $text < $P >) != $packing ) $packing = 0 ;
>
>
>
$text = substr ( $text , 0 , strlen ( $text ) — $packing );
?>

And to pad a string that you intend to decrypt with .NET, just add the chr() value of the number of padding bytes:
$block = mcrypt_get_block_size ( ‘tripledes’ , ‘cbc’ );
$len = strlen ( $dat );
$padding = $block — ( $len % $block );
$dat .= str_repeat ( chr ( $padding ), $padding );
?>

That’s all there is to it.
Knowing this, you can encrypt, decrypt, and duplicate exactly any .NET 3DES behaviour in PHP.

The encryption has no authenticity check. It can be achieved with three methods, described in http://en.wikipedia.org/wiki/Authenticated_encryption#Approaches_to_Authenticated_Encryption
Encrypt-then-MAC (EtM), Encrypt-and-MAC (E&M), MAC-then-Encrypt (MtE).

The following is a suggestion for MtE:

public static function getMacAlgoBlockSize ( $algorithm = ‘sha1’ )
switch( $algorithm )
case ‘sha1’ :
return 160 ;
>
default:
return false ;
break;
>
>
>

public static function decrypt ( $message , $key , $mac_algorithm = ‘sha1’ ,
$enc_algorithm = MCRYPT_RIJNDAEL_256 , $enc_mode = MCRYPT_MODE_CBC )
$message = base64_decode ( $message );
$iv_size = mcrypt_get_iv_size ( $enc_algorithm , $enc_mode );

$iv_dec = substr ( $message , 0 , $iv_size );
$message = substr ( $message , $iv_size );

$message = mcrypt_decrypt ( $enc_algorithm , $key , $message , $enc_mode , $iv_dec );

$mac_block_size = ceil (static:: getMacAlgoBlockSize ( $mac_algorithm )/ 8 );
$mac_dec = substr ( $message , 0 , $mac_block_size );
$message = substr ( $message , $mac_block_size );

$mac = hash_hmac ( $mac_algorithm , $message , $key , true );

if( $mac_dec == $mac )
return $password ;
>
else
return false ;
>
>

public static function encrypt ( $message , $key , $mac_algorithm = ‘sha1’ ,
$enc_algorithm = MCRYPT_RIJNDAEL_256 , $enc_mode = MCRYPT_MODE_CBC )

$mac = hash_hmac ( $mac_algorithm , $message , $key , true );
$mac = substr ( $mac , 0 , ceil (static:: getMacAlgoBlockSize ( $mac_algorithm )/ 8 ));
$message = $mac . $message ;

$iv_size = mcrypt_get_iv_size ( $enc_algorithm , $enc_mode );
$iv = mcrypt_create_iv ( $iv_size , MCRYPT_RAND );

$ciphertext = mcrypt_encrypt ( $enc_algorithm , $key ,
$message , $enc_mode , $iv );

return base64_encode ( $iv . $ciphertext );
>
?>

Источник

Оцените статью