CentOS6で、blencを使ってみた。


blencを使って、phpのソースコードを暗号化するテスト。

必要なパッケージをインストール

<pre>
yum -y install php php-devel php-pear gcc-c++
</pre>


blencはyumだと見当たらないので、peclでインストールする。

<pre>
pecl install blenc channel://pecl.php.net/blenc-1.1.4b
</pre>

実行時、Enable BLENC? [autodetect] :と聞かれるので、そのままエンターキーを押す。

インストールが終わったら、以下の表示が出ているはず。

<pre>
Build process completed successfully
Installing '/usr/lib64/php/modules/blenc.so'
install ok: channel://pecl.php.net/blenc-1.1.4b
configuration option "php_ini" is not set to php.ini location
You should add "extension=blenc.so" to php.ini
</pre>

php.iniに、extension=blenc.soを足せ、ということで、
php.iniに直接ではなく、php.d/blenc.iniを作って、そこに書き込む。
また、後述する配布用の鍵のパスを指定する。
配布用の鍵のパスは、デフォルトだと/usr/local/etc/blenckeysになっている。

<pre>
echo "extension=blenc.so" > /etc/php.d/blenc.ini
echo "blenc.key_file=/root/blenckey" >> /etc/php.d/blenc.ini
</pre>


暗号化したいphpファイルを用意。
以下テストとして作成。

```php:input.php
<?php
echo "Hello world.\n";
?>
```

blencを使って、暗号化するためのphpファイルを作成

```php:blenc.php
<?php
    // 第1引数　暗号化したいphpファイル
    // 第2引数　暗号化したphpファイルの保存先
    // 第3引数　配布用の鍵の保存先

    $input_file = $argv[1];
    $output_file = $argv[2];
    $key_file = $argv[3];

    // 鍵。任意の文字列。念のためmd5している。
    $private_key = md5('my_key_phrase');

    // file_get_contents関数を使って暗号化したいphpファイルを読み込む。
    $source = file_get_contents($input_file);

    // 読み込んだphpファイルに含まれる、都合の悪い文字列を削除しておく・・・。
    // たぶんblencのバグだけど、これをしないと、暗号化したphpファイルを実行したとき、
    // エラーになって動かない。
    $contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source);

    // 暗号化処理。成功すると、暗号化したファイルが指定したパスに作成される。
    // また、戻り値として、配布用の鍵の中身が得られる。
    $public_key = blenc_encrypt($contents, $output_file, $private_key);

    // 配布用の鍵の中身を、指定したパスに出力しておく。
    file_put_contents($key_file, $public_key . PHP_EOL);
?>
```


以下一連の作業

```
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-642.11.1.el6.x86_64 #1 SMP Fri Nov 18 19:25:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php --version
PHP 5.3.3 (cli) (built: Aug 11 2016 20:33:53)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
[root@localhost ~]#
[root@localhost ~]# pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
blenc   1.1.4b  beta
[root@localhost ~]#
[root@localhost ~]# cat /etc/php.d/blenc.ini
extension=blenc.so
blenc.key_file=/root/blenckey
[root@localhost ~]#
[root@localhost ~]# cat input.php
<?php
echo "Hello world.\n";
?>
[root@localhost ~]# cat blenc.php
<?php
    // 第1引数　暗号化したいphpファイル
    // 第2引数　暗号化したphpファイルの保存先
    // 第3引数　配布用の鍵の保存先

    $input_file = $argv[1];
    $output_file = $argv[2];
    $key_file = $argv[3];

    // 鍵。任意の文字列。念のためmd5している。
    $private_key = md5('my_key_phrase');

    // file_get_contents関数を使って暗号化したいphpファイルを読み込む。
    $source = file_get_contents($input_file);

    // 読み込んだphpファイルに含まれる、都合の悪い文字列を削除しておく・・・。
    // たぶんblencのバグだけど、これをしないと、暗号化したphpファイルを実行したとき、
    // エラーになって動かない。
    $contents = preg_replace(array('/^<(\?|\%)\=?(php)?/', '/(\%|\?)>$/'), array('',''), $source);

    // 暗号化処理。成功すると、暗号化したファイルが指定したパスに作成される。
    // また、戻り値として、配布用の鍵の中身が得られる。
    $public_key = blenc_encrypt($contents, $output_file, $private_key);

    // 配布用の鍵の中身を、指定したパスに出力しておく。
    file_put_contents($key_file, $public_key . PHP_EOL);
?>
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php blenc.php input.php output.php blenckey
[root@localhost ~]#
[root@localhost ~]# ll input.php output.php blenckey
-rw-r--r-- 1 root root  45 12月  1 11:08 2016 blenckey
-rw-r--r-- 1 root root  32 12月  1 10:46 2016 input.php
-rw-r--r-- 1 root root 104 12月  1 11:08 2016 output.php
[root@localhost ~]#
[root@localhost ~]# vi output.php
[root@localhost ~]#
BLENC^@^@^@1.1.4b^@^@^@^@^@^@^@^@^@^@bf7264349ce07405f2e687cf5d188682^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@OA^S^Vo^TI^PcCZX<96><9f>ejD±X      ±{!cO$e2<89><99>，}
~
~
~
~
[root@localhost ~]#
[root@localhost ~]# cat blenckey
/coNbBdL3kaDFcyIMetvgSKXtGKGaBf2Cc4XPW30gPI=
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# /usr/bin/php output.php
Hello world.
[root@localhost ~]#
[root@localhost ~]#
```