phpの暗号化関連のメソッドを試してみる

VirtualBoxにCentOSをとりあえずインストール
の続き

phpの暗号化関連の各種メソッドを試してみる。

PHPのインストール

まずはPHPをインストールしておく。

$ sudo yum -y install php

暗号化関連のメソッドを試してみる

$ vi test.php
<?php
$data = "dummy text";
$key = "secret key";

echo "md5:" . md5($data) . "\n";
echo "sha1:" . sha1($data) . "\n";
echo "hash_hmac(md5):" . hash_hmac("md5", $data, $key) . "\n";
echo "hash_hmac(sha1):" . hash_hmac("sha1", $data, $key) . "\n";
echo "gzipcompress:" . gzcompress($data) . "\n";
echo "base64_encode(gzipcompress):" . base64_encode(gzcompress($data)) . "\n";
$r16 = openssl_random_pseudo_bytes(16);
$r8 = openssl_random_pseudo_bytes(8);
echo "openssl_encrypt(aes128):" . openssl_encrypt($data, 'aes128', $key, false, $r16) . "\n";
echo "openssl_encrypt(aes256):" . openssl_encrypt($data, 'aes256', $key, false, $r16) . "\n";
echo "openssl_encrypt(des):" . openssl_encrypt($data, 'des', $key, false, $r8) . "\n";
echo "openssl_encrypt(des3):" . openssl_encrypt($data, 'des3', $key, false, $r8) . "\n";

実行した結果。

$ php test.php
md5:7135d0df9da029ad9f541c570da69e8c
sha1:f5d04899d2bbea2bacbf2227dc05bf70cffd78fe
hash_hmac(md5):1735325eadf9fa663d055719f04c2bd1
hash_hmac(sha1):28be4bfbb20a7899aef91c08bc43598d4e4259d4
gzipcompress:x&#65533;K)&#65533;T(I&#65533;(K
base64_encode(gzipcompress):eJxLKc3NrVQoSa0oAQAWSwQS
openssl_encrypt(aes128):p4scFg9Q0x9UrVpUFqpF7Q==
openssl_encrypt(aes256):V0aoqnLxyR0YEJl8ZyPZpA==
openssl_encrypt(des):oH8P2fcpIEQK/DrwMtV5pA==
openssl_encrypt(des3):UY8tvEhIBos+s7QbdWbtdQ==

圧縮率を見てみる

まずは、10KBと100KBのテキストファイルを生成する。

$ php -r '$s=range("a","z"); for($i=0;$i<10240;$i++) echo $s[array_rand($s)];' > 10kb.txt
$ php -r '$s=range("a","z"); for($i=0;$i<102400;$i++) echo $s[array_rand($s)];' > 100kb.txt
$ ls -lh
-rw-rw-r-- 1 hoge hoge  10K  11 00:00 2014 10kb.txt
-rw-rw-r-- 1 hoge hoge 100K  11 00:00 2014 100kb.txt

中身は下記のような感じ

$ cat 10kb.txt
sdjrsuakruzssqbqwjlipjikigskcvoxoixoowsaaubrztgyjcljegtpelvginozvsocoshxchd
ckinkaxbyrjbyvsrzzxtsmgevachaocoxwmykxsffheicqqadbqicrluhbuqqayxtjdfawpvdtc
hikdutdodpwakxmlnnzinugmubkrmrpkkhdlujvftsfvbmlomrlmbosglbzixyhluyroyhnvtgi
・・・
pmahmepjrmwixdcxnbxqeawvackxbzwtjxeekwudemajpywqsiyqjdtbgxwzzalvfxevneshuhu

下記のプログラムで圧縮レベルごとの圧縮後のサイズを見てみる。

<?php
$data = file_get_contents("10kb.txt");
//$data = file_get_contents("100kb.txt");
echo "original = " . strlen($data) . "\n";
echo "level default = " . strlen(gzcompress($data)) . "\n";
echo "level 0 = " . strlen(gzcompress($data, 0)) . "\n";
echo "level 1 = " . strlen(gzcompress($data, 1)) . "\n";
echo "level 2 = " . strlen(gzcompress($data, 2)) . "\n";
echo "level 3 = " . strlen(gzcompress($data, 3)) . "\n";
echo "level 4 = " . strlen(gzcompress($data, 4)) . "\n";
echo "level 5 = " . strlen(gzcompress($data, 5)) . "\n";
echo "level 6 = " . strlen(gzcompress($data, 6)) . "\n";
echo "level 7 = " . strlen(gzcompress($data, 7)) . "\n";
echo "level 8 = " . strlen(gzcompress($data, 8)) . "\n";
echo "level 9 = " . strlen(gzcompress($data, 9)) . "\n";

10KBの場合

original = 10240
level default = 6402
level 0 = 10251
level 1 = 6552
level 2 = 6551
level 3 = 6551
level 4 = 6402
level 5 = 6402
level 6 = 6402
level 7 = 6402
level 8 = 6402
level 9 = 6402

100KBの場合

original = 102400
level default = 64995
level 0 = 102421
level 1 = 67562
level 2 = 67545
level 3 = 67543
level 4 = 64997
level 5 = 64995
level 6 = 64995
level 7 = 64995
level 8 = 64995
level 9 = 64995

あまり違いがはっきりしなかった。

各メソッドがどれくらいの重さか測ってみる。

下記のプログラムにて、for文の間で各メソッドを10万回呼び出して、
10KBと100KBのそれぞれで、どれくらい時間がかかったか計測してみる。

<?php
foreach (array("10kb", "100kb") as $file) {
  $data = file_get_contents($file . ".txt");
  $t = microtime(true);
  for ($i = 0; $i < 100000; $i++) {

    //
    //ここの部分で各メソッドを実行する
    //

  }
  echo $file . " " . number_format(microtime(true) - $t, 1) . "\n";
}
結果
md5($data);

の場合

10kb 2.0秒
100kb 20.0秒
sha1($data);

の場合

10kb 3.8秒
100kb 37.8秒
hash_hmac("md5", $data, "secret key");

の場合

10kb 2.1秒
100kb 19.8秒
hash_hmac("sha1", $data, "secret key");

の場合

10kb 4.0秒
100kb 38.3秒
gzcompress($data);

の場合

10kb 21.4秒
100kb 371.4秒
gzcompress($data, 1);

の場合

10kb 17.4秒
100kb 228.1秒
gzcompress($data, 9);

の場合

10kb 21.0秒
100kb 377.5秒
base64_encode(gzcompress($data));

の場合

10kb 22.2秒
100kb 380.5秒
$r16 = openssl_random_pseudo_bytes(16);
openssl_encrypt($data, 'aes128', 'secret key', false, $r16);

の場合

10kb 5.1秒
100kb 47.9秒
$r16 = openssl_random_pseudo_bytes(16);
openssl_encrypt($data, 'aes256', 'secret key', false, $r16);

の場合

10kb 6.5秒
100kb 62.0秒
$r8 = openssl_random_pseudo_bytes(8);
openssl_encrypt($data, 'des', 'secret key', false, $r8);

の場合

10kb 19.3秒
100kb 195.9秒
$r8 = openssl_random_pseudo_bytes(8);
openssl_encrypt($data, 'des3', 'secret key', false, $r8);

の場合

10kb 52.9秒
100kb 545.3秒