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

search for in the

mcrypt_module_self_test> <mcrypt_module_is_block_mode
Last updated: Fri, 22 Aug 2008

view this page in

mcrypt_module_open

(PHP 4 >= 4.0.2, PHP 5)

mcrypt_module_open使用するアルゴリズムおよびモードのモジュールをオープンする

説明

resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory )

この関数は、使用するアルゴリズムおよびモードのモジュールをオープン します。アルゴリズム名は、"twofish" または定数 MCRYPT_暗号名により algorithm で指定します。 ライブラリは mcrypt_module_close() をコールする ことによりクローズされます。通常、この関数は暗号化記述子を返し、 エラーの際に FALSE を返します。

暗号化モジュールの位置を指定する際には algorithm_directory および mode_directory が使用されます。 ディレクトリ名を指定した場合には、これが使用されます。 これらの一つに空の文字列("")を指定した場合、ini ディエクティブの mcrypt.algorithms_dir または mcrypt.modes_dir に設定された値が使用されます。 これらが設定されていない場合、libmcrypt をコンパイルした際の デフォルトのディレクトリ (通常は/usr/local/lib/libmcrypt)が 使用されます。

例1 mcrypt_module_open() の例

<?php
    $td 
mcrypt_module_open(MCRYPT_DES'',
        
MCRYPT_MODE_ECB'/usr/lib/mcrypt-modes');

    
$td mcrypt_module_open('rijndael-256''''ofb''');
?>

上の例の最初の行では、デフォルトのディレクトリから DES 暗号化を、 そして /usr/lib/mcrypt-modes から EBC モードの オープンを試みます。2 行目の例では暗号化形式とモードを文字列で 指定しています。これは、libmcrypt 2.4.x あるいは 2.5.x に対して 拡張モジュールがリンクされている場合にのみ使用可能です。

例2 mcrypt_module_open() を暗号化で使用する

<?php
    
/* 暗号モジュールをオープンします */
    
$td mcrypt_module_open('rijndael-256''''ofb''');

    
/* IV を作成し、キー長を定義します。Windows では、かわりに
     * MCRYPT_RAND を使用します */
    
$iv mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
    
$ks mcrypt_enc_get_key_size($td);

    
/* キーを作成します */
    
$key substr(md5('very secret key'), 0$ks);

    
/* 暗号化処理を初期化します */
    
mcrypt_generic_init($td$key$iv);

    
/* データを暗号化します */
    
$encrypted mcrypt_generic($td'This is very important data');

    
/* 暗号化ハンドラを終了します */
    
mcrypt_generic_deinit($td);

    
/* 復号用の暗号モジュールを初期化します */
    
mcrypt_generic_init($td$key$iv);

    
/* 暗号化された文字列を復号します */
    
$decrypted mdecrypt_generic($td$encrypted);

    
/* 復号ハンドルを終了し、モジュールを閉じます */
    
mcrypt_generic_deinit($td);
    
mcrypt_module_close($td);

    
/* 文字列を表示します */
    
echo trim($decrypted) . "\n";
?>

mcrypt_module_close()mcrypt_generic()mdecrypt_generic()mcrypt_generic_init() および mcrypt_generic_deinit() も参照ください。



mcrypt_module_self_test> <mcrypt_module_is_block_mode
Last updated: Fri, 22 Aug 2008
 
add a note add a note User Contributed Notes
mcrypt_module_open
ash
17-Jul-2008 03:07
A slight improvement of dinamic's function to create a key:

I think the weak point is that capitals are always used in the same part of the string. The following code capitalizes random characters of the string, making the key less predictable:

<?php
$key
= substr($key1, 0, $ks/2) . substr($key2, (round(strlen($key2) / 2)), $ks/2);
$key = substr($key.$key1.$key2.$key1,0,$ks);

$buffer = str_split($key);

$limit = count($buffer)-1;
srand((float)microtime() * 1000000);

$end = rand(0, $limit);
$a = 0;

// replace random chars with capitals
while ($a < $end) {   
    list(
$usec, $sec) = explode(' ', microtime());
       
$seed = ((float)$sec) + ((float) $usec * 100000);
   
mt_srand($seed);
   
   
$index = mt_rand(0,$limit);
   
   
$buffer[$index] = strtoupper($buffer[$index]);
   
$a++;
}

$key = join('', $buffer);
?>
dinamic at gmail dot com
13-Nov-2007 03:05
Also it should be pointed that md5() and/or sha1() should not be used while forming your key for the mcrypt. This is so because hex encoding uses a set of only 16 characters [0-9a-f], which is equivalent to 4 bits, and thus halve the strength of your encryption: 4 x 32 = 128-bit.

I have re-wrote the example shown, so here is my suggestion to get real 256-bit encryption:

<?php
$key1
= "this is a secret key";
$key2 = "this is the second secret key";
$input = "Let us meet at 9 o'clock at the secret place.";
$length = strlen($input);

   
/* Open the cipher */
   
$td = mcrypt_module_open('rijndael-256', '', 'cbc', '');

   
/* Create the IV and determine the keysize length, use MCRYPT_RAND
     * on Windows instead */
   
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
   
$ks = mcrypt_enc_get_key_size($td);

   
/* Create key */
   
$key1 = md5($key1);
   
$key2 = md5($key2);

   
$key = substr($key1, 0, $ks/2) . substr(strtoupper($key2), (round(strlen($key2) / 2)), $ks/2);

   
$key = substr($key.$key1.$key2.strtoupper($key1),0,$ks);

   
/* Intialize encryption */
   
mcrypt_generic_init($td, $key, $iv);

   
/* Encrypt data */
   
$encrypted = mcrypt_generic($td, $input);

   
/* Terminate encryption handler */
   
mcrypt_generic_deinit($td);

   
/* Initialize encryption module for decryption */
   
mcrypt_generic_init($td, $key, $iv);

   
/* Decrypt encrypted string */
   
$decrypted = mdecrypt_generic($td, $encrypted);

   
/* Terminate decryption handle and close module */
   
mcrypt_generic_deinit($td);
   
mcrypt_module_close($td);

   
/* Show string */
   
echo "Text: ".substr($decrypted,0,$length) . "<br>";
    echo
"Encoded: ".$encrypted ."<br>";
    echo
"<br>key1: $key1 <br>key2: $key2<br>created key: $key";
?>
Mon
02-Mar-2006 03:27
In the text example:

$key = substr(md5('very secret key'), 0, $ks);

Builds a key of $ks/2 effective bytes.
31-Jul-2003 08:14
Doing a trim($decrypted) will remove the null padding that may occur as a result of decryption.

The problem is if you're encrypting something like a MSWord document which can commonly end with nulls. The result $decrypted will be smaller than the original cleartext - which will then fail to open in MSOffice.

To get around this, make sure you store the length of the original cleartext, and when you decrypt it, do:

$decrypted = substr(mdecrypt_generic($td, $encrypted), 0, $originalLength);

mcrypt_module_self_test> <mcrypt_module_is_block_mode
Last updated: Fri, 22 Aug 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites