#!/usr/bin/perl use strict; use warnings; use Crypt::CBC; use MIME::Base64::URLSafe qw( urlsafe_b64encode urlsafe_b64decode ); my $key = 'secret'; sub url_encode { my ( $string, $iv ) = @_; return urlsafe_b64encode( $iv . Crypt::CBC->new( '-key' => $key, '-header' => 'none', '-iv' => $iv, '-cypher' => 'Blowfish', )->encrypt($string) ); } sub url_decode { my $b64 = urlsafe_b64decode( $_[0] ); return Crypt::CBC->new( '-key' => $key, '-header' => 'none', '-iv' => substr( $b64, 0, 8 ), '-cypher' => 'Blowfish', )->decrypt( substr( $b64, 8 ) ); } foreach ( 1 .. 5 ) { my $iv = join( '', map { [ 'a' .. 'z' ]->[ rand(26) ] } ( 1 .. 8 ) ); my $en_string = url_encode( 'http://perlmonks.org', $iv ); my $de_string = url_decode($en_string); print $iv, ' : ', $en_string, ' => ', $de_string, "\n"; }