use strict; use Math::BaseCalc; ### Change the three lines below to ensure your coding is unique my $key_bitxor = 1231456789; my $key_multip = 3; my @key_digits = ( 'N' .. 'Z', 2 .. 9, 'a' .. 'm', 'A' .. 'M', 'n' .. 'z' ); ### Coding and decoding functions my $bcalc = Math::BaseCalc->new( digits => \@key_digits ); sub numeric_obfu { my $number = shift; my $flipped = ( $number * $key_multip ) ^ $key_bitxor; $flipped =~ s/^(\d+?)(0*?)$/reverse($1).$2/e; return $flipped; } sub numeric_defu { my $result = shift; $result =~ s/(\d+?)(0*?)$/reverse($1).$2/e; $result = ( $result ^ $key_bitxor ) / $key_multip; return $result; } ### Print sample cases my @tests = ( 0..10, 998..1004, 9999995..10000004, 99999990..99999999 ); foreach my $sample ( @tests ) { my $obfu = numeric_obfu( $sample ); my $code = $bcalc->to_base( $obfu ); my $dcod = $bcalc->from_base( $code ); my $defu = numeric_defu( $dcod ); print "Converted $sample : $obfu : $code : $dcod : $defu : " . ( $defu == $sample ? 'OK' : $dcod) . "\n"; }