[PHP-users 20509]Re: mcrypt関数で暗号化した結果について
NAKAMURA Takeshi
1yen @ sh.rim.or.jp
2004年 2月 21日 (土) 08:18:03 JST
仲村です
突っ込んでくれないので自分で...
On Fri, 20 Feb 2004 15:08:32 +0900,
NAKAMURA Takeshi <1yen @ sh.rim.or.jp> wrote:
> 入力は無制限 出力は必ず16バイト となれば重ならないようにすることは
^^と書いておきながら
> 原理的に不可能です。
この辺間違えてます
> md5 だと 2^64 / sha1 だと 2^160 なので両方を組みあわせると
^^ 8*16 なので 128bit です
> 確率としては 2^(64+160) となると。
^^^^^^128+160
# md5 と sha1 のとる値に相関関係が全くなければの話です
これだけではなんなので、
> 経験的に真ですが、絶対ではありません。
ちょっと試してみました
近藤さん>・・・と言う事は、md5()ってプライマリなキー作る時は結構使えそうですね。
なんてことも言われてちょっと恐かったりもするので。
% cat mkHASH.pl
#!/usr/local/bin/perl
use Digest::MD5 qw(md5_base64);
$HashList="HASH.txt";
$SOURCES="Source.txt";
$DictionaryList =
"/usr/share/dict/eign" ." ".
"/usr/share/dict/web2a" ." ".
"/usr/share/dict/freebsd"." ".
"/usr/share/dict/words" ." ".
"/usr/share/dict/propernames" ." ".
"`find /home/PORT_WORK/usr/ports/textproc/aspell/work/ -type f`";
$CMD=sprintf("echo %s | xargs cat | sort -u > $SOURCES",$DictionaryList);
system($CMD);
open (OUT, ">$HashList"); open (IN, "<$SOURCES");
while(<IN>){
print OUT md5_base64($_) . " : $_";
}
%cat HASH2.awk
#!/usr/bin/awk -f
BEGIN{hash=word="";i=0;}
{
if(hash == $1){
print hash,word,$3;
word=sprintf("%s, %s",word,$3);
}else{
hash=$1;word=$3;
}
printf("%d\r",++i);
}
END{print "";}
% ./mkHASH.pl
% sort HASH.txt | ./HASH2.awk
771412
と、77万ほどの 単語, 熟語, プログラムの1行, \n区切りのバイナリ などを
突っ込んで md5値の一致はありませんでした。
辞書に使おうと aspell もコンパイルしてみたんですが...バイナリ辞書でした。
せっかくなので、コンパイルしたディレクトリ丸ごと試してみましたが、
全く一致がないとは 2^19.6 ぐらいの数ではびくともしないわけですね。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+
関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
仲村 武 <1yen @ sh.rim.or.jp>
最初は perl でなく shell でやっていたんですが...
foreach X ( `cat /usr/share/dict/* | sort -u` )
echo `echo $X | md5`" : $X" >> HASH.txt
done
あまりに遅く perl かなぁと、本を見ながら書いたところ、比べものに
ならないぐらい(tail -f がついていけないぐらい)早くなりました。
やっぱ、こんなに fork しちゃいけないなと。
2つめの awk スクリプトも最初の sort しないものよりかなり高速版
初版は全部 hash 変数に持っていたから遅いしメモリー食うし。
P133 Mem 48なマシンには酷な作業でした。
PHP-users メーリングリストの案内