こんな感じ?

use Digest::MD5;
use Digest::MD5 qw(md5_hex);

my $md5datefile = "$GB->{PATH}/md5.cgi";

if (!defined $FOX->{MD5NUMBER}) {
# まだ読み込まれていない
open(MD5FILE, "<$md5datefile");
my $md5line = <MD5FILE>;
close(MD5FILE);
($FOX->{MD5DATE}, $FOX->{MD5NUMBER}) = split(/<>/, $md5line, 2);
}

if ($FOX->{MD5DATE} ne $GB->{MD5DATE}) {
# 日付が変わったので作り直し
my $data = '';
sysopen(RANDOM, '/dev/random', O_READ) || die "cannot open /dev/random $!\n";
sysread(RANDOM, $data, 16);
close(RANDOM);
open(MD5FILE, ">$md5datefile");
print MD5FILE "$GB->{MD5DATE}<>$data";
close(MD5FILE);
chmod(0777, $md5datefile);
$FOX->{MD5DATE} = $GB->{MD5DATE};
$FOX->{MD5NUMBER} = $data;
}

#my $idnum = md5_hex($ENV{'REMOTE_ADDR'});
my $idnum = md5_hex($GB->{IDNOTANE});

my $md5 = Digest::MD5->new;
$md5->add(substr($idnum,-4));
$md5->add($GB->{FORM}->{"bbs"});
#$md5->add(substr($GB->{DATE},6,2));
$md5->add($FOX->{MD5NUMBER});
my $idcrypt = substr($md5->b64digest, 0, 8);