#!/usr/local/bin/perl # パスワード生成ツール crypt.cgi # (c)rescue.ne.jp #---------------------------------------------------------------------------- $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } if ($buffer eq '') { print "Content-type: text/html\n\n"; print "暗号文字化\n"; print "\n"; print "

暗号文字化

\n"; print "
\n"; print "暗証番号 \n"; print "

\n"; print "

\n"; print "\n"; exit; } if ($FORM{'plain'} eq '' || $FORM{'plain'} =~ /\W/) { &error('パスワードの入力が無いか、文字列に半角英数字以外の文字が含まれています.'); } ($pwd) = &MakeCrypt($FORM{'plain'}); print "Content-type: text/html\n\n"; print "暗号文字化\n"; print "\n"; print "

実行結果

\n"; print "
\n"; print "
\n"; print "パスワード      
\n"; print "暗号化されたパスワード

\n"; print "

\n"; print "\n"; exit; sub MakeCrypt { local($plain) = @_; # 入力:平文 local(@char,$f,$now,@saltset,$pert1,$pert2,$nsalt,$salt); local($retry) = 4; @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); # 暗号が構成される文字群 $now = time; # ↓この辺は通称「らくだの本」を参照 srand(time|$$); $f = splice(@saltset,rand(@saltset),1) . splice(@saltset,rand(@saltset),1); ($pert1,$pert2) = unpack("C2",$f); $week = $now / (60*60*24*7) + $pert1 + $pert2 - length($plain); $nsalt = $saltset[$week % 64] . $saltset[$now % 64]; while (crypt($plain,substr($result,$salt,2)) ne $result || $result eq '') { $result = crypt($plain,$nsalt); if ($result =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if (--$retry <= 0) { &error('●暗号化エラー'); } sleep(1); } return $result; # 戻値:暗号 } sub error { print "Content-type: text/html\n\n"; print "暗号文字化\n"; print "\n"; print "

$_[0]

\n"; print "\n"; exit; }