Shameless plug, yes, but how about using
Net::SFTP?
SFTP runs as a subsystem over a standard SSH connection, so
automatically everything you send over the network is
encrypted, including both filename and file contents.
This way you can just do something like this:
use Net::SFTP;
my $sftp = Net::SFTP->new("backup_host");
$sftp->put("local_file", "remote_file");
Or, what about rsync, using ssh as the rsh replacement? I don't
know enough about that to know whether it encrypts filenames
going over the network, but I would *guess* that it does,
because I believe it just runs over ssh.
If you want to stick w/ the method you're talking about, I think
your best option is to do what you suggested: encrypt the
filename, then base64-encode it. Considering that you're going
to be sending the entire contents of files over the network,
adding a couple of bytes per filename isn't going to be the
deciding factor in terms of efficiency. :)