#!/usr/bin/perl
#
# ramdom.pl
#
# rand, srand 関数の振る舞いについて調べるスクリプト
# Copyright (C) 2001/12/28 Morikawa Yasuhiro


$ran = rand(107);

$int = int($ran);

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


# パスワードに使用する文字
# まぎらわしいため, 「1」(数字の一),「0」(数字の零),
# 「I」(大文字英字アイ),「O」(大文字英字オー),
# 「l」(小文字英字エル),「o」(小文字英字オー),「x」(小文字英字エックス)
# は使用しない.

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

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

$available
	= '+/;<>' . ('234890' x 2)
	. 'ACDEFJKLMNRSUVWX'
	. ('abcdefijkmnrsuvw' x 3);


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


$size = length $available;

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

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

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

$passwd = substr($available, int(rand($size)), 1);
# print "<パスワード1文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード2文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード3文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード4文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード5文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード6文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
# print "<パスワード7文字目>    $passwd\n";

$passwd .= substr($available, int(rand($size)), 1);
print "<パスワード完成>       $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";

