#! /usr/bin/env perl package Password; use v5.10.1; use strict; use warnings; use MIME::Base64 qw(encode_base64 decode_base64); our $hostname = `hostname`; chomp($hostname); sub cxor($$) { my $msg = shift; my $key = shift; my $xor = ""; my $lk = length($key); my $lm = length($msg); for (my $i = 0; $i < $lm; $i++) { $xor .= substr($msg, $i, 1) ^ substr($key, $i % $lk, 1); } return $xor; } sub gen_password(;$$) { my $file = shift // ".secret_intra"; my $pass = shift // `pwgen -s -n -c -y -1 42 1`; chomp($pass); open SECRET, ">", $file or die $!; print SECRET encode_base64(cxor($pass, $hostname)); close SECRET; return $pass; } sub get_password(;$) { my $file = shift // ".secret_intra"; my $decode = ""; open SECRET, "<", $file or die $file.': '.$!; while () { $decode .= $_; } close SECRET; return cxor(decode_base64($decode), $hostname); } 1;