#!/usr/bin/perl # spamtrap_encode/spamtrap_decode # zeitform Internet Dienste (c) 2003 # alex@zeitform.de - Version 0.1 # # encrypt timestamp and ip address for random mail-addresses # # spamtrap_encode creates a blowfish encrypted hex string # based on a given ip address and timestamp to construct # dynamic mail addresses for online publishing # # If one receives mail to such an address the hex string can be # decoded/decrypted and the IP-Address and timestamp of the # address harvester will be revealed and prosecuted. # # usage: # # my $ip = $ENV{REMOTE_ADDR}; # e.g. "146.140.8.123" # my $time = time; # unix timestamp # my $key = "0123456789ABCDEF"; # key for Blowfish # # my $string = spamtrap_encode($ip, $time, $key); # e.g. 78c1ed6da0322b3a # # ($ip, $time) = spamtrap_decode($string, $key); # returns ip address and timestamp # # Example: # # If you have an E-Mail address "joe@domain.com" and use qmail # extensions to have addresses like "joe-anything@domain.com" # you could publish your E-Mail address on websites with: # # print 'Joe'; # # which prints: # # Joe # # A perfect trap for address harvesters! # # Many thanks to Daniel A. Rehbein (http://daniel.rehbein.net/) # for the idea to this code. # # LICENSE: # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Get the GPL from: http://www.gnu.org/licenses/gpl.html # #### some dumy input # # $ip = quad-dooted ip address # $time = unix timestamp # $key = your secret key my $ip = "146.140.8.123"; my $time = time; my $key = "0123456789ABCDEF"; #### end dummy input my $string = spamtrap_encode($ip, $time, $key); print "time: $time\n"; print "ip: $ip\n"; print "cipher: $string\n"; ($ip, $time) = spamtrap_decode($string, $key); print "time: $time\n"; print "ip: $ip\n"; exit; ### sub land sub spamtrap_encode { my ($ip, $time, $key) = @_; return unless $key; return unless $time > 0; return unless $ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/o; my $inkey = pack("H16", $key); my $plaintext = join("", map { chr } split (/\./, $ip)) . pack("L", $time); use Crypt::Blowfish; my $cipher = new Crypt::Blowfish $inkey; my $string = unpack("H*", $cipher->encrypt($plaintext)); return $string; } sub spamtrap_decode { my ($string, $key) = @_; return unless $key; return unless $string =~ /[0-9a-f]{16}/o; my $inkey = pack("H16", $key); use Crypt::Blowfish; my $cipher = new Crypt::Blowfish $inkey; my $plaintext = $cipher->decrypt(pack("H*", $string)); my $time = unpack("L", substr($plaintext, 4, 4)); my $ip = join(".", map { ord } split //, substr($plaintext, 0, 4)); return wantarray ? ($ip, $time) : "$ip $time"; } ###-fin-