#!/usr/bin/perl
#
# ramdom16.pl
#
# rand, srand 関数を使って、ランダムな 16 進数を作るためのスクリプト
# Copyright (C) 2005/02/28 Morikawa Yasuhiro



$ran = rand(32);

$int = int($ran);

print "<ランダムに生成された整数>          $int\n";
print "<このスクリプトのプロセスID番号>    $$\n\n";


# パスワードに使用する文字

print "--以下パスワード作成方法--\n";

#$available
#	= '!%&()*+-/:<=>?' . ('23456789' x 3)
#	. 'ABCDEFGHJKLMNPQRSTUVWXY'
#	. ('abcdefghijkmnpqrstuvwyz' x 2);

$available
	= ('1234567890' x 2) . ('abcdef' x 2);


print "<パスワードに使用する文字列は以下の文字から引用>\n" , 
      "$available\n\n";

$size = length $available;

print "<上記の文字の数>      $size\n\n";

# 一文字づつ rand 関数を使用して上記の16 * 2の文字からランダムに選ぶ.

# srand(time + $$);  # これが何の為にあるのか不明

$num = 64;
while ($num > 0) {
    $passwd .= substr($available, int(rand($size)), 1);
    $num = $num - 1;
}

print "<パスワード完成>\n $passwd\n\n";

# 上記のパスワードがパスワードとして相応しいか検査

if ($passwd =~ /^[A-Za-z]*\d?[A-Za-z]*$/){
		print "このパスワードは不適切です\n\n";
        # 文字列の全てが英字, もしくは数字が1文字で残りが英字の場合
}
elsif ($passwd =~ /\W.*\W.*\W$/){
		print "このパスワードは不適切でしょう\n\n";
	# 最後の文字が記号で, 且つ記号を合計3文字以上含む場合
}
else {
		print "このパスワードは適切です\n\n";
}

# crypt による暗号化

  # 塩(salt)の作成
  $salt = sprintf("%02d", rand(99));
  print "--以下cryptによる暗号化--\n";
  print "<cryptに使用する塩>             $salt\n";

  # 実際にcryptで暗号化
  $password = crypt($passwd, $salt);
  print "<cryptで暗号化された結果>       $password\n";

