downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

mcrypt_cbc> <mcal_week_of_year
[edit] Last updated: Mon, 01 Nov 2010

view this page in

LXXX. Mcrypt 暗号化関数

導入

この関数は、CBC, OFB, CFB, ECB 暗号モードの DES, TripleDES, Blowfish (デフォルト), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 , GOST のような広範なブロックアルゴリズムをサポートする mcrypt ライブラリへのインターフェースです。加えて、"フリーではない" と思われる RC6 および IDEA もサポートします。

要件

ここで示す関数は、mcrypt を 使用して動作します。この拡張モジュールを使用するには、http://mcrypt.sourceforge.net/ から libmcrypt-x.x.tar.gz をダウンロードし、含まれているインストール用の指示に従ってください。 Windows ユーザは、コンパイル済みの mcrypt バイナリを http://ftp.emini.dk/pub/php/win32/mcrypt/ から入手することが可能です。

PHP 5.0.0 以降では、libmcrypt のバージョン 2.5.6 以降が必要です。

libmcrypt 2.4.x とリンクした場合、加えてブロックアルゴリズム: CAST, LOKI97, RIJNDAEL, SAFERPLUS, SERPENT および次のストリーム暗号: ENIGMA (crypt), PANAMA, RC4, WAKE がサポートされます。 libmcrypt 2.4.x を使用した場合、暗号モード nOFB もサポートされます。

インストール手順

この拡張機能を利用可能にするためには、 PHP を --with-mcrypt パラメータを 付けてコンパイルする必要があります。DIR は mcrypt のインストール ディレクトリです。必ず、 --disable-posix-threadsを付けて libmcrypt をコンパイルするようにしてください。

実行時設定

php.ini の設定により動作が変化します。

表 1. Mcrypt 設定オプション

名前デフォルト変更の可否変更履歴
mcrypt.algorithms_dirNULLPHP_INI_ALLPHP 4.0.2 以降で使用可能です。
mcrypt.modes_dirNULLPHP_INI_ALLPHP 4.0.2 以降で使用可能です。
PHP_INI_* 定数の詳細および定義については 付録G を参照してください。

リソース型

リソース型は定義されていません。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

mcryptは 4 つのブロック暗号モード(CBC, OFB, CFB, ECB)で実行可能です。 libmcrypt-2.4.x 以降にリンクした場合、ブロック暗号モード nOFG と STREAM モードでも実行可能です。MCRYPT_MODE_mode 形式を関数で使用する 際には、いくつかの制約があります。ここで、これらの各モードの通常の 使用法の概要を示します。詳細なリファレンスおよび議論に関しては、 Applied Cryptography by Schneier (ISBN 0-471-11709-9) を参照ください。

  • MCRYPT_MODE_ECB (electronic codebook) は、他のキーを暗号化すると いったランダムデータに適しています。出力データが短くランダムであると いう ECB の短所は、都合の良い逆の効果を持っています。

  • MCRYPT_MODE_CBC (cipher block chaining)は、特に、ECB よりも著しく 高いセキュリティでファイルを暗号化する用途に適しています。

  • MCRYPT_MODE_CFB (cipher feedback) は、1 バイト毎に暗号化する必要がある バイトストリームを暗号化する際に最も適したモードです。

  • MCRYPT_MODE_OFB (output feedback、8 ビット形式) はCFBと互換性が ありますが、エラーの伝播が許容されないアプリケーションに使用する ことが可能です。このモードは(8 ビットモードで処理を行うため)安全では なく、使用は推奨されません。

  • MCRYPT_MODE_NOFB (output feedback, nビット形式) は OFB と互換ですが、 アルゴリズムのブロックサイズを変更可能なため、より安全です。

  • MCRYPT_MODE_STREAM は、WAKE や RC4 のようないくつかのストリーム アルゴリズムを読み込む追加のモードです。

他のモードおよびランダムデバイス定数:

MCRYPT_ENCRYPT (integer)

MCRYPT_DECRYPT (integer)

MCRYPT_DEV_RANDOM (integer)

MCRYPT_DEV_URANDOM (integer)

MCRYPT_RAND (integer)

Mcrypt 暗号

以下に、mcrypt 拡張モジュールにより現在サポートされている暗号のリストを 示します。サポートされる暗号の完全なリストについては、 mcrypt.h の最後にある define を参照ください。 mcrypt-2.2.x API に関する一般的な規則は、 MCRYPT_暗号名で PHP から暗号をアクセス可能であるということです。 mcrypt-2.4.x および mcrypt-2.5.x の API についてもこれらの定数は 使用できますが、mcrypt_module_open() を コールする際に文字列で暗号名を指定することも可能です。

  • MCRYPT_3DES

  • MCRYPT_ARCFOUR_IV (libmcrypt > 2.4.x のみ)

  • MCRYPT_ARCFOUR (libmcrypt > 2.4.x のみ)

  • MCRYPT_BLOWFISH

  • MCRYPT_CAST_128

  • MCRYPT_CAST_256

  • MCRYPT_CRYPT

  • MCRYPT_DES

  • MCRYPT_DES_COMPAT (libmcrypt 2.2.x only)

  • MCRYPT_ENIGMA (libmcrypt > 2.4.x のみ、 MCRYPT_CRYPTへのエイリアス)

  • MCRYPT_GOST

  • MCRYPT_IDEA (non-free)

  • MCRYPT_LOKI97 (libmcrypt > 2.4.x のみ)

  • MCRYPT_MARS (libmcrypt > 2.4.xのみ, non-free)

  • MCRYPT_PANAMA (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_128 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_192 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RIJNDAEL_256 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RC2

  • MCRYPT_RC4 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6 (libmcrypt > 2.4.xのみ)

  • MCRYPT_RC6_128 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6_192 (libmcrypt 2.2.xのみ)

  • MCRYPT_RC6_256 (libmcrypt 2.2.xのみ)

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_SAFERPLUS (libmcrypt > 2.4.xのみ)

  • MCRYPT_SERPENT(libmcrypt > 2.4.xのみ)

  • MCRYPT_SERPENT_128 (libmcrypt 2.2.xのみ)

  • MCRYPT_SERPENT_192 (libmcrypt 2.2.xのみ)

  • MCRYPT_SERPENT_256 (libmcrypt 2.2.xのみ)

  • MCRYPT_SKIPJACK (libmcrypt > 2.4.xのみ)

  • MCRYPT_TEAN (libmcrypt 2.2.xのみ)

  • MCRYPT_THREEWAY

  • MCRYPT_TRIPLEDES (libmcrypt > 2.4.xのみ)

  • MCRYPT_TWOFISH (mcrypt 2.x より古いバージョン、 またはmcrypt > 2.4.xの場合)

  • MCRYPT_TWOFISH128 (TWOFISHxxx は 2.x の新しいバージョンで使用可能ですが、2.4.x では使用できません)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_WAKE (libmcrypt > 2.4.xのみ)

  • MCRYPT_XTEA (libmcrypt > 2.4.xのみ)

(CFB および OFB モードでは)それぞれの暗号関数に初期化ベクトル(IV) を指定する必要があり、(CBC モードでは)IV を指定することが可能です。 IV はユニークである必要があり、暗号化/復号化の際に同じである 必要があります。暗号化されて保存されたデータの場合、関数の出力を (ファイル名の MD5 キーのように) 保存されたデータの位置を表す インデックスとして使用することができます。もしくは、暗号化された データと共に IV を渡すことができます(このトピックに関する議論については、 Applied Cryptography by Schneier (ISBN 0-471-11709-9) の 9.3 章を参照ください)。

mcrypt は、上に示した暗号を用いて暗号化および復号化を 行うことが可能です。libmcrypt-2.2.xとリンクした場合、4つの重要な mcrypt コマンド (mcrypt_cfb(), mcrypt_cbc(),mcrypt_ecb(), mcrypt_ofb()) は、MCRYPT_ENCRYPT および MCRYPT_DECRYPT という 2つのモードの両方で実行可能です。

例 1. 入力値を 2.2.x において ECB モードの TripleDES で暗号化する

<?php
$key
= "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>
この例では、$encrypted_data に文字列として 暗号化されたデータが返されます。

libmcrypt 2.4.x または 2.5.x とリンクした場合、上記の関数も利用可能 ですが、新しい関数を使用されることを推奨します。

例 2. 2.4.x 以降において ECB モードで TripleDES により入力を暗号化する

<?php
    $key
= "this is a secret key";
   
$input = "Let us meet at 9 o'clock at the secret place.";

   
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
   
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
   
mcrypt_generic_init($td, $key, $iv);
   
$encrypted_data = mcrypt_generic($td, $input);
   
mcrypt_generic_deinit($td);
   
mcrypt_module_close($td);
?>
この例は、$encrypted_data に文字列として 暗号化されたデータを取得します。詳細な例については、 mcrypt_module_open() を参照してください。

目次
mcrypt_cbc -- CBC モードでデータを暗号化/復号化する
mcrypt_cfb -- CFB モードでデータを暗号化/復号化する
mcrypt_create_iv --  乱数ソースから初期化ベクトル(IV)を生成する
mcrypt_decrypt --  指定したパラメータで暗号化されたテキストを復号化する
mcrypt_ecb -- 非推奨: ECB モードでデータを暗号化/復号化する
mcrypt_enc_get_algorithms_name -- オープンされたアルゴリズムの名前を返す
mcrypt_enc_get_block_size -- オープンされたアルゴリズムのブロックサイズを返す
mcrypt_enc_get_iv_size -- オープンされたアルゴリズムの IV の大きさを返す
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 --  指定した暗号/モードの組み合わせに属する IV の大きさを返す
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 -- データを復号化する


mcrypt_cbc> <mcal_week_of_year
[edit] Last updated: Mon, 01 Nov 2010
 
add a note add a note User Contributed Notes Mcrypt 暗号化関数
patrickdk at patrickdk dot com 06-Aug-2010 10:30
This works completely with mysql aes, even long keys.

<?php
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));
}
?>
p ete postma - googlemail.com 30-Oct-2009 09:42
mcrypt module initialization failed

I found this circumstance:

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

filea.php:
<?php
include_once('usemcrypt.php');

function
a() {
 
protect();
}
?>

fileb.php
<?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.
manyagain 04-Jul-2009 08:44
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.
Rafael M. Salvioni 27-Nov-2008 04:26
The follow function is a implementation of the RC4 cypher algorithm in pure PHP code.

The function is used to encrypt and decrypt data.

<?php
/**
 * 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);
}
?>
artem at it-nt dot ru 29-May-2008 12:25
And some code for LM hash:

<?php
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?
phpknights at pookmail dot com 01-Feb-2008 01:18
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.
<?php

       
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.
<?php

       
require_once("Crypt/Blowfish.php");  // a Pear class

       
$primary_key = "johndoe@anisp.localhost";

       
// 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.
Kevin 23-Jan-2008 09:37
Solved Problem:

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
Ivan Frederiks 28-Apr-2007 07:03
To enable mcrypt extension under Windows you need to:
1) uncomment line "extension=php_mcrypt.dll" in php.ini
2) download libmcrypt.dll from http://files.edin.dk/php/win32/mcrypt/ and put it to System32 directory (for example C:\Windows\System32).
Tested on Windows XP+Apache 1.3.37+PHP 4.4.6 (as SAPI module!!!)

P.S.
I wrote this because I got "Cannot load mcrypt extension. Please check your PHP configuration." from phpMyAdmin when I simply uncommented "extension=php_mcrypt.dll" line.
duerra_NOT_THIS_ at pushitlive dot net 20-Sep-2006 12:56
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:

<?php

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);
}
?>
rolf at winmutt dot com 10-Mar-2006 12:19
mysql AES_ENCRYPT() compatibly function for PHP :

<?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.
vincent at verbrugh dot nl 01-Mar-2006 01:55
If you plan to use Mcrypt Encryption to store encrypted data (e.g. passwords) in a (MySQL) database make sure to set the column to BLOB rather than VARCHAR. Otherwise the data may change which can give unexpected results if you decrypt the value.
Jerry Hathaway 16-Feb-2006 10:23
After benchmarking AES in 256-bit operation, I've concluded that CBC is far faster than OFB.  Using a 14.9 MiB file, on average...

Encrypt in CBC:   1.9 seconds
Encrypt in OFB:   45.7 seconds (same as CFB)
Just reading the file:  ~.53 seconds

After some research, I've concluded that OFB and CFB are slightly more secure than CBC, however I believe the performance difference to be due to an implementation issue.

As a side note on ECB:  As stated in the wiki linked to below, ECB is wholly inadequate.  It not use an IV (whether it was supplied ot MCrypt or not), meaning the same key and plaintext always produce the same ciphertext and it doesn't hide patterns.  The site shows an excellent example of this.

Very useful info:
http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
triptripon at gmail dot com 05-Feb-2006 03:28
Regarding storing the result on a postgres DB that uses Unicode (follow up to a post below).
You don't need to change the DB's encoding to ASCII.
Simply use BASE64 to encode the result, it's perfectly safe.
use base64_decode before you decrypt.
-- Tomer Levinboim
coz AT metamule D0T com 04-Nov-2005 05:15
If you're going to encrypt data with something like this and store it in postgres.

<?php
function encrypt($string, $key){
       
$result = '';
        for(
$i=1; $i<=strlen($string); $i++){
           
$char = substr($string, $i-1, 1);
           
$keychar = substr($key, ($i % strlen($key))-1, 1);
           
$char = chr(ord($char)+ord($keychar));
           
$result.=$char;
        }
        return
$result;
    }
?>

Make sure when you create your database to set the encoding to SQL_ASCII because you won't be able to store this data in a database that uses UNICODE
joseph-at-digiweb-dot-net-dot-nz 30-Oct-2005 05:22
A further note for those doing interop between PHP and Java:

If you're using the BouncyCastle library on the Java side, then you can use the ZeroBytePadding mode now available in it. Mcrypt pads the data with Nulls rather than spaces....

I've sucessfully done interop using Blowfish/CBC/ZeroBytePadding between PHP and Java this way.
paul dot lewis at absolutegenius dot co dot uk 13-Jul-2005 08:33
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.
MGTech 20-May-2005 12:02
Please, mind that a XOR Encryption can't compete with a block cipher like AES or IDEA, but if you really want to use a stream cipher the more secure RC4 is the right alternative.
A XOR Encryption is only a bit useful if you encrypt data for private use, otherwise it is a frankly a security risk.
Jurgen Schwietering 23-Nov-2004 01:20
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.
Anonymous 19-Nov-2004 08:18
Or, if you don't have the mcrypt library, you can just use these functions:

<?php
function Encrypt($string, $key)
{
$result = '';
for(
$i=1; $i<=strlen($string); $i++)
{
$char = substr($string, $i-1, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return
$result;
}

function
Decrypt($string, $key)
{
$result = '';
for(
$i=1; $i<=strlen($string); $i++)
{
$char = substr($string, $i-1, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return
$result;
}
?>

It's very simple encryption, but as long as the key stays secret, very powerful.
dzelko at hotmail dot com 14-May-2004 12:11
Windows IIS Users - Problems installing/using mcrypt and other extensions
::
I've noticed a lot of users complaining in forums that they have difficult time getting mcrypt extension to function/ finding or installing working .dlls when using IIS:
::
Easy solution that works well for me: (IIS 6 on Win 2003 Svr and IIS on XP Pro) #customized install later for increased security#
1. Install current stable php version using windows installer #gets php up and running quickly#
2. Download Windows Binary Package
3. Extract Package Library to PHP folder installer generates - overwrite all
4. Edit php.ini as appropriate.  (specifically for mcrypt uncomment mcrypt=php_mcrypt.dll)
::
No mo' problems.
groundzero at zuavra dot net 09-Jan-2004 05:08
If you've ever compiled PHP from source (any version) you may be familiar with the [in]famous MCRYPT_BLOWFISH_128 compilation error that appears when you attempt to compile --with-mcrypt. It occurs often on Debian but not only there. The problem: during compilation, the PHP configure script always assumes that libmcrypt has been built in conjunction with libltdl. Whenever that is not the case, PHP compilation will fail later saying certain headers (such as the above blowfish example) are missing from mcrypt.h (which is misleading, they're not supposed to be there nor looked after if libltdl was properly involved). Solution: make sure your libmcrypt was linked against libltdl before you even start configuring PHP. You can check by running 'ldd lybmcrypt.so' and verifying that libltdl appears in the output. libltdl can be found in libltld[3][-dev] on Debian or in libtool-libs on Red Hat.
simms 03-Oct-2003 02:03
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.
steve@itemfront dot ltd dot uk 29-Sep-2003 05:17
Just spent a while getting mcrypt support working with php. Used libmcrypt version 2.5.7 with php 4.3.3. Out of the box it just won't work. Configure as follows:

libmcrypt:

  ./configure --disable-posix-threads --enable-dynamic-loading

php: ( as you can see, it's built for a SunONE server, but that's the easy bit to configure! )

./configure  --with-nsapi=/usr/iplanet/servers --enable-sigchld --with-ldap --with-zlib-dir=/usr/lib --with-mcrypt=<srcdir>/libmcrypt-2.5.7

hth, steve
herowekker at hotmail dot com 31-Jul-2003 05:55
mcrypt_ecb with base64_decode gave some problems, i found out that it had to be chopped to work:

<?php
chop
(mcrypt_ecb(MCRYPT_BLOWFISH,$key,base64_decode($input),MCRYPT_DECRYPT));
?>
scott at boothcreek dot com 28-Mar-2002 01:28
If you are using ECB mode to encrypt it does not seem to use the iv (initialization vector) for much of anything, given the same key it will always decrypt it no matter what the iv is.  If you use CBC mode you must decrypt with the same iv that you encrypted with.

 If you use a different iv before decrypting, your decrypt will not work.  IMHO it seems better to use CBC mode than ECB as ECB will always encrypt to the same cipher text given the same plain text  (leaving you open to know plaintext attacks).  CBC uses the random iv which means text encrypts to different things.  You probably could get the same effect from using random keys in ECB mode.

Read that in the Schneier book - Applied Cryptography (ISBN 0-471-11709-9)  This book is a must for anyone seriously using any type of encryption.
pawelNOSPAM at rsc dot pl 02-Aug-2001 06:37
If you compiled mcrypt and php without problem, but phpinfo() shows there are no supported ciphers and modes, try to change mode to 755 on libdirs (/usr/local/libmcrypt, /usr/local/libcrypt).
mountie at paygate dot net 10-Feb-2000 05:21
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

<?php
base64_encode
(mcrypt_ecb(MCRYPT_BLOWFISH,$key,$input,MCRYPT_ENCRYPT));

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

 
show source | credits | sitemap | contact | advertising | mirror sites