ホームページ  >  記事  >  バックエンド開発  >  PHP 暗号化 3DES エラーの解決策 未定義関数の呼び出し: mcrypt_module_open()

PHP 暗号化 3DES エラーの解決策 未定義関数の呼び出し: mcrypt_module_open()

WBOY
WBOYオリジナル
2016-06-13 12:29:17780ブラウズ

PHP 暗号化 3DES エラーの解決策 未定義関数の呼び出し: mcrypt_module_open()

私も PHP の初心者で、w3cschool を通じて PHP の基本原理について学び、書き始めました。しかし、まだまだ新人。

3DES 暗号化方式が正しいかどうかに関係なく、その方式はすべてオンラインで実行するとエラーが報告され、弟は死亡しました。いろいろ探した結果、ようやく方法を見つけました。

<?<span style="color: #000000;">php</span><span style="color: #008000;">/*</span><span style="color: #008000;">** * PHP版3DES加解密类** 可与java的3DES(DESede)加密方式兼容** @Author: Luo Hui (farmer.luo at gmail.com)** @version: V0.1 2008.12.04*</span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Crypt3Des{        </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$key</span>    = "01234567890123456789012345678912"<span style="color: #000000;">;    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$iv</span>    = "23456789"; <span style="color: #008000;">//</span><span style="color: #008000;">like java: private static byte[] myIV = { 50, 51, 52, 53, 54, 55, 56, 57 };        //加密</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> encrypt(<span style="color: #800080;">$input</span><span style="color: #000000;">)    {        </span><span style="color: #800080;">$input</span> = <span style="color: #800080;">$this</span>->padding( <span style="color: #800080;">$input</span><span style="color: #000000;"> );        </span><span style="color: #800080;">$key</span> = <span style="color: #008080;">base64_decode</span>(<span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span><span style="color: #000000;">);        </span><span style="color: #800080;">$td</span> = mcrypt_module_open( MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''<span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">使用MCRYPT_3DES算法,cbc模式</span>        mcrypt_generic_init(<span style="color: #800080;">$td</span>, <span style="color: #800080;">$key</span>, <span style="color: #800080;">$this</span>-><span style="color: #000000;">iv);        </span><span style="color: #008000;">//</span><span style="color: #008000;">初始处理</span>        <span style="color: #800080;">$data</span> = mcrypt_generic(<span style="color: #800080;">$td</span>, <span style="color: #800080;">$input</span><span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">加密</span>        mcrypt_generic_deinit(<span style="color: #800080;">$td</span><span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">结束</span>        mcrypt_module_close(<span style="color: #800080;">$td</span><span style="color: #000000;">);        </span><span style="color: #800080;">$data</span> = <span style="color: #800080;">$this</span>->removeBR(<span style="color: #008080;">base64_encode</span>(<span style="color: #800080;">$data</span><span style="color: #000000;">));        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">;    }        </span><span style="color: #008000;">//</span><span style="color: #008000;">解密</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> decrypt(<span style="color: #800080;">$encrypted</span><span style="color: #000000;">)    {        </span><span style="color: #800080;">$encrypted</span> = <span style="color: #008080;">base64_decode</span>(<span style="color: #800080;">$encrypted</span><span style="color: #000000;">);        </span><span style="color: #800080;">$key</span> = <span style="color: #008080;">base64_decode</span>(<span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span><span style="color: #000000;">);        </span><span style="color: #800080;">$td</span> = mcrypt_module_open( MCRYPT_3DES,'',MCRYPT_MODE_CBC,''<span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">使用MCRYPT_3DES算法,cbc模式</span>        mcrypt_generic_init(<span style="color: #800080;">$td</span>, <span style="color: #800080;">$key</span>, <span style="color: #800080;">$this</span>-><span style="color: #000000;">iv);        </span><span style="color: #008000;">//</span><span style="color: #008000;">初始处理</span>        <span style="color: #800080;">$decrypted</span> = mdecrypt_generic(<span style="color: #800080;">$td</span>, <span style="color: #800080;">$encrypted</span><span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">解密</span>        mcrypt_generic_deinit(<span style="color: #800080;">$td</span><span style="color: #000000;">);        </span><span style="color: #008000;">//</span><span style="color: #008000;">结束</span>        mcrypt_module_close(<span style="color: #800080;">$td</span><span style="color: #000000;">);        </span><span style="color: #800080;">$decrypted</span> = <span style="color: #800080;">$this</span>->removePadding(<span style="color: #800080;">$decrypted</span><span style="color: #000000;">);        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$decrypted</span><span style="color: #000000;">;    }        </span><span style="color: #008000;">//</span><span style="color: #008000;">填充密码,填充至8的倍数</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> padding( <span style="color: #800080;">$str</span><span style="color: #000000;"> )    {        </span><span style="color: #800080;">$len</span> = 8 - <span style="color: #008080;">strlen</span>( <span style="color: #800080;">$str</span> ) % 8<span style="color: #000000;">;        </span><span style="color: #0000ff;">for</span> ( <span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$len</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;"> )        {            </span><span style="color: #800080;">$str</span> .= <span style="color: #008080;">chr</span>( 0<span style="color: #000000;"> );        }        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$str</span><span style="color: #000000;"> ;    }        </span><span style="color: #008000;">//</span><span style="color: #008000;">删除填充符</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> removePadding( <span style="color: #800080;">$str</span><span style="color: #000000;"> )    {        </span><span style="color: #800080;">$len</span> = <span style="color: #008080;">strlen</span>( <span style="color: #800080;">$str</span><span style="color: #000000;"> );        </span><span style="color: #800080;">$newstr</span> = ""<span style="color: #000000;">;        </span><span style="color: #800080;">$str</span> = <span style="color: #008080;">str_split</span>(<span style="color: #800080;">$str</span><span style="color: #000000;">);        </span><span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$len</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;"> )        {            </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$str</span>[<span style="color: #800080;">$i</span>] != <span style="color: #008080;">chr</span>( 0<span style="color: #000000;"> ))            {                </span><span style="color: #800080;">$newstr</span> .= <span style="color: #800080;">$str</span>[<span style="color: #800080;">$i</span><span style="color: #000000;">];            }        }        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$newstr</span><span style="color: #000000;">;    }        </span><span style="color: #008000;">//</span><span style="color: #008000;">删除回车和换行</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> removeBR( <span style="color: #800080;">$str</span><span style="color: #000000;"> )     {        </span><span style="color: #800080;">$len</span> = <span style="color: #008080;">strlen</span>( <span style="color: #800080;">$str</span><span style="color: #000000;"> );        </span><span style="color: #800080;">$newstr</span> = ""<span style="color: #000000;">;        </span><span style="color: #800080;">$str</span> = <span style="color: #008080;">str_split</span>(<span style="color: #800080;">$str</span><span style="color: #000000;">);        </span><span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$len</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;"> )        {            </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$str</span>[<span style="color: #800080;">$i</span>] != '\n' and <span style="color: #800080;">$str</span>[<span style="color: #800080;">$i</span>] != '\r'<span style="color: #000000;">)            {                </span><span style="color: #800080;">$newstr</span> .= <span style="color: #800080;">$str</span>[<span style="color: #800080;">$i</span><span style="color: #000000;">];            }        }            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$newstr</span><span style="color: #000000;">;    }}</span><span style="color: #008000;">//</span><span style="color: #008000;">test</span><span style="color: #800080;">$input</span> = "1qaz2ws"<span style="color: #000000;">;</span><span style="color: #0000ff;">echo</span> "plainText:" . <span style="color: #800080;">$input</span>."<br/>"<span style="color: #000000;">;</span><span style="color: #800080;">$crypt</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Crypt3Des();</span><span style="color: #0000ff;">echo</span> "Encode:".<span style="color: #800080;">$crypt</span>->encrypt(<span style="color: #800080;">$input</span>)."<br/>"<span style="color: #000000;">;</span><span style="color: #0000ff;">echo</span> "Decode:".<span style="color: #800080;">$crypt</span>->decrypt(<span style="color: #800080;">$crypt</span>->encrypt(<span style="color: #800080;">$input</span><span style="color: #000000;">));</span>?>

コードを読む必要はありません。中の文を見てください。 $td = mcrypt_module_open( MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');エラーを報告した人。

多くの解決策を検索しましたが、正しい方法は次のとおりです (Windows システムのみ):

php を実行しているサーバーに libmcrypt dll がない場合、このエラーが発生します。この問題は、関数 mcrypt_module_open を使用して復号化するときに発生します。
この問題を解決するには、サーバー上で次の設定を行ってください。

インターネットにアクセスして php mcrypt モジュールのインストール パッケージをダウンロードします。必要なのは libmcrypt.dll ファイル (通常は公式 Web サイトからダウンロードされ、すでに php ディレクトリにあります)

1. libmcrypt.dll を PHP インストール ディレクトリの system32 ディレクトリまたは extensions ディレクトリにコピーします
2. libmcrypt.dll を Apache インストール ディレクトリの bin ディレクトリにコピーします
3. Windows ディレクトリ を見つけて開きます。
4. ロード可能な拡張機能 (モジュール) が存在するディレクトリを見つけます。
extension_dir = "D:php5ext" 「
これらの 2 行については、extension_dir が指すディレクトリに libmcrypt.dll があること、またはシステム パス
に libmcrypt.dll があることを確認してください。5. 「extension=php_mcrypt.dll」という行を見つけます。 Windows Extensions 項目と "extension=php_iconv" .dll (私は持っていないので省略しました) の下のこれら 2 行、先頭のセミコロンを削除します

ps: 解決策を調べ始めたところですオンラインで、php インストールディレクトリの php.ini を変更するという人もいますが、それ以降の変更は役に立ちません。 Windows ディレクトリの php.ini を必ず変更してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。