Skip to content

Instantly share code, notes, and snippets.

@joashp
Created September 4, 2015 15:59
Show Gist options
  • Select an option

  • Save joashp/a1ae9cb30fa533f4ad94 to your computer and use it in GitHub Desktop.

Select an option

Save joashp/a1ae9cb30fa533f4ad94 to your computer and use it in GitHub Desktop.
Simple PHP encrypt and decrypt using OpenSSL
<?php
/**
* simple method to encrypt or decrypt a plain text string
* initialization vector(IV) has to be the same when encrypting and decrypting
*
* @param string $action: can be 'encrypt' or 'decrypt'
* @param string $string: string to encrypt or decrypt
*
* @return string
*/
function encrypt_decrypt($action, $string) {
$output = false;
$encrypt_method = "AES-256-CBC";
$secret_key = 'This is my secret key';
$secret_iv = 'This is my secret iv';
// hash
$key = hash('sha256', $secret_key);
// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
$iv = substr(hash('sha256', $secret_iv), 0, 16);
if ( $action == 'encrypt' ) {
$output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
$output = base64_encode($output);
} else if( $action == 'decrypt' ) {
$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
}
return $output;
}
$plain_txt = "This is my plain text";
echo "Plain Text =" .$plain_txt. "\n";
$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt);
echo "Encrypted Text = " .$encrypted_txt. "\n";
$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt);
echo "Decrypted Text =" .$decrypted_txt. "\n";
if ( $plain_txt === $decrypted_txt ) echo "SUCCESS";
else echo "FAILED";
echo "\n";
?>
@jbvazquez

jbvazquez commented Jan 10, 2018

Copy link
Copy Markdown

Hi is correct if use a secretkey generated with RSA 2048 and as secret_iv a public key?

@twicejr

twicejr commented Jan 29, 2018

Copy link
Copy Markdown

You should always use a random Initialization Vector if you want to protect against replaying attacks. (although the probability of it happening is low)
You can just append or prepend the IV to the output and use it in your decrypt function, it may be exposed publically.

@budhapirthi

Copy link
Copy Markdown

thanks so much for sharing

@Alemalakra

Copy link
Copy Markdown

Nice share fam.

@czubehead

Copy link
Copy Markdown

This is dangerous! IV MUST be random, that is the whole purpose of it. You have just disabled one of the cipher's key mechanisms, well done.

@petemolinero

Copy link
Copy Markdown

@czubehead If it's random, how would you decrypt? How would you modify the code for a more secure encrypt/decrypt?

@spybart

spybart commented Jun 10, 2018

Copy link
Copy Markdown

@petemolinero read the reply by @twicejr and @bladeSk

@Rubinum

Rubinum commented Jul 16, 2018

Copy link
Copy Markdown

This function does two things instead of one and yes functions should do one thing. The name of the function is aweful too! Please don't write such code in that way if you copy that into your projects.

@IwonGunawan

Copy link
Copy Markdown

thank you so much for sharing.
this code help me, very simple and easy to use.

@jagdeepmalhi

Copy link
Copy Markdown

Thanks for sharing.

@legendblogs

Copy link
Copy Markdown

Mcrypt is a replacement for the popular Unix crypt command. the crypt was a file encryption tool that used an algorithm very close to the World War II Enigma cipher. Mcrypt provides the same functionality but uses several modern algorithms such as AES.

class MCrypt {

private $iv = 'abcdef9876541720';
private $key = '1720456789fedcba';

function __construct() {
    
}

/**
 * @param string $str
 * @param bool $isBinary whether to encrypt as binary or not. Default is: false
 * @return string Encrypted data
 */
function encrypt($str, $isBinary = false) {
    $iv = $this->iv;
    $str = $isBinary ? $str : utf8_decode($str);
    $td = mcrypt_module_open('rijndael-128', ' ', 'cbc', $iv);
    mcrypt_generic_init($td, $this->key, $iv);
    $encrypted = mcrypt_generic($td, $str);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $isBinary ? $encrypted : bin2hex($encrypted);
}

/**
 * @param string $code
 * @param bool $isBinary whether to decrypt as binary or not. Default is: false
 * @return string Decrypted data
 */
function decrypt($code, $isBinary = false) {
    $code = $isBinary ? $code : $this->hex2bin($code);
    $iv = $this->iv;
    $td = mcrypt_module_open('rijndael-128', ' ', 'cbc', $iv);
    mcrypt_generic_init($td, $this->key, $iv);
    $decrypted = mdecrypt_generic($td, $code);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $isBinary ? trim($decrypted) : utf8_encode(trim($decrypted));
}

protected function hex2bin($hexdata) {
    $bindata = '';
    for ($i = 0; $i < strlen($hexdata); $i += 2) {
        $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
    }
    return $bindata;
}

}

function encryptkey($key) {
$mcrypt = new MCrypt();
$encrypted = $mcrypt->encrypt($key);
return $encrypted;
}

function decryptkey($key) {
$mcrypt = new MCrypt();
$decrypted = $mcrypt->decrypt($key);
return $decrypted;
}

$value = "Legend Blogs";

echo $value.'
';
echo "Encrypt: ". encryptkey($value).'
';
echo "Decrypt: ". decryptkey(encryptkey($value)).'
';

Complete example at here How do you Encrypt and Decrypt a PHP String

@tonnas

tonnas commented Mar 21, 2019

Copy link
Copy Markdown

Thanks Man !

@josegoyo

josegoyo commented May 15, 2019

Copy link
Copy Markdown

How can I decrypt this in java ?

ghost commented Jul 22, 2019

Copy link
Copy Markdown

Thank you so much, but I have some questions :

  1. Is it safe to use that code in my website when every one know it?
  2. What's the maximum length of the $secret_key and the $secret_iv?
  3. What's the best way to hide that code from everyone?

-Adel Sbeh

@AkshayKhandarkar

Copy link
Copy Markdown

How to add cs5 padding with the encryption?? please, I need to know urgently.

@Josloader3

Copy link
Copy Markdown

great code, thanks a lot

@neutronixx

Copy link
Copy Markdown

Hello thanks for the code, works well, and works with short text strings but how I can encrypt text longer?

@BySkilz0

Copy link
Copy Markdown

Hello from 2021,
Helped me ;)

@LeoDaGuy

Copy link
Copy Markdown

Helped me 👍

@aacassandra

Copy link
Copy Markdown

How can I decrypt this in java ?

simple, you must move to php. haha. just kidding

@GChazaro

GChazaro commented Dec 2, 2024

Copy link
Copy Markdown

Does it work for large amounts of text?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment