Authentication




Cancel OK
B!コメントする  2011-11-28 14:03:00 by old

可逆暗号

復号出来るものが使いたいときというのはある。
PHPの標準だとstrrot13だったりがあるけど、これは単純すぎて使いどころに困る。
標準関数では意外と可逆暗号がない。
少し手間をかければOpenSSLやPearのBlowfishなんかがあるけど、サーバー側にSSLやCryptのモジュールがない場合は使えない・・・。

無いなら自分で作るしかない。
そこで中学生レベルの算数しかない頭で以下のことが行えるものを考えてみた。

・可逆暗号である
・同じテキストでも暗号化する度に、異なる結果となる


本当なら「ソースを見ても復号できない」とか出来れば最高なんだろうけど、さすがにそこまでは無理・・・。
Wikipediaとか暗号学とか色々とGoogle先生に聞いてみたけど、まじパネェ世界が広がっててメダパニとコンヒュを同時に喰らった感じになったのでパス。
とりあえず上の2つの条件を満たす関数を簡単ながら作ってみた。

まず暗号化
/*
* *************************************
* CRYPT ENCODE Method
* *************************************
* [機能]
* 文字列を暗号化する
* [引数]
* @param string $val 暗号化したい文字列
* [返り値]
* @return string $crypt
target 暗号化した文字列
/
function encode($val)
{
$crypttarget = '';
if( !defined('CRYPT
STRENGTH') ) { define('CRYPTSTRENGTH', "2"); }
if( !defined('CRYPT
KEY') ) { define('CRYPTKEY', crypt(CRYPTSTRENGTH)); }

$assenble = strlen($val);
for($i = 0; $i < $assenble; $i++)
{
$crypttargetarray[$i] = substr($val, $i, 1);
$keyarray[$i] = substr(crypt(CRYPTKEY), mtrand("1", strlen(crypt(CRYPTKEY)) - 1), 1);
$crypttarget .= $keyarray[$i] . $crypttargetarray[$i];
}
$length = intval(CRYPTSTRENGTH);
for($j = 0; $j < $length; $j++)
{
$crypt
target = base64encode($crypttarget);
}
return $crypt_target;
}


そして復号
/
* *************************************
* CRYPT DECODE Method
* *************************************
* [機能]
* 文字列を復号化する
* [引数]
* @param string $val 復号化したい文字列
* [返り値]
* @return string $decrypttarget 復号化した文字列
*/
function decode($val)
{
$decrypt
target = '';
if( !defined('CRYPTSTRENGTH') ) { define('CRYPTSTRENGTH', "2"); }
if( !defined('CRYPTKEY') ) { define('CRYPTKEY', crypt(CRYPTSTRENGTH)); }

$length = intval(CRYPT
STRENGTH);
for($i = 0; $i < $length; $i++)
{
$val = base64decode($val);
}

$assenble = strlen($val);
for($j = 0; $j < $assenble; $j++)
{
if( ($j % 2) != 0 )
{
$decrypt
target .= substr($val, $j, 1);
}
}
return $decrypttarget;
}


コードを読めば単純だけどたいしたことはしてません。
とりあえずは同じテキストでも暗号化する度に毎回異なる結果となって、その異なった結果であっても復号が出来るというものです。

パッと見ただけでは復号は難しいです。
とは言ってもこれを使って暗号化すると基本的に元テキストの2倍を超える長さになりますのでコンパクトとはいえないです。
これにstr
rot13とかブロック暗号の反転とかを入れればもう少しマシになるとは思います。

ですが何だかんだ言っても本家のRSAやDESなんかとはとてもじゃないけど比べられるようなものではありませんが、こういうの考えてるのはとても楽しかったです。


PHP  

  • コメント
  • コメントはまだありません