// <!-- Quick! Hide the java!

// Speaking of Java, this particular script is (C) Copyright 2004 Jim Tucek
// This is not the script that decrypts an email so that
// spam bots can't find it.  This is the script that makes that script!
// (Wow, code that writes code.  Not that big of a deal really)

// Visit www.jracademy.com/~jtucek/email/ for script information or 
// www.jracademy.com/~jtucek/email/contact.php for contact information.

// A brief history of this script can be found (and it's rather entertaining)
// at www.jracademy.com/~jtucek/email/

var primes = new Array();
var i = 0;
primes[i++] = 2; primes[i++] = 3; primes[i++] = 5; primes[i++] = 7; primes[i++] = 11; primes[i++] = 13; primes[i++] = 17; primes[i++] = 19; primes[i++] = 23; primes[i++] = 29; primes[i++] = 31; primes[i++] = 37; primes[i++] = 41; primes[i++] = 43; primes[i++] = 47; primes[i++] = 53; primes[i++] = 59; primes[i++] = 61; primes[i++] = 67; primes[i++] = 71; primes[i++] = 73; primes[i++] = 79; primes[i++] = 83; primes[i++] = 89; primes[i++] = 97; primes[i++] = 101; primes[i++] = 103; primes[i++] = 107; primes[i++] = 109; primes[i++] = 113; primes[i++] = 127; primes[i++] = 131; primes[i++] = 137; primes[i++] = 139; primes[i++] = 149; primes[i++] = 151; primes[i++] = 157; primes[i++] = 163; primes[i++] = 167; primes[i++] = 173; primes[i++] = 179; primes[i++] = 181; primes[i++] = 191; primes[i++] = 193; primes[i++] = 197; primes[i++] = 199; 

function testAll() {
var size = primes.length;
window.alert("Testing for " + size + " prime numbers...  Please wait.");

var allCharacters = "";
for(var c = 33; c <= 126; c++)
	allCharacters = allCharacters + String.fromCharCode(c);

document.form.Message.value = allCharacters;

for(var i = 0; i < size - 1; i++) {
	for(var j = i + 1; j < size; j++) {
		var p = primes[i];
		var q = primes[j];
		if(p*q < 255)
			break;
		makeKey(p,q);
		var encrypted = document.form.encrypted.value;
		document.form.P2.value = p;
		document.form.Q2.value = q;
		var d = document.form.D.value;
		var decrypted = goForth(encrypted,p*q,d);
		document.form.decrypted.value  = decrypted;
		if(decrypted != allCharacters) {
			window.alert("Verschl&uuml;sselungs-/Entschl&uuml;sselungsfehler wenn (p,q) = ("+p+","+q+")");
			return;
		}
	}
}
window.alert("Fertig!");
}


function MakeArray(n) {
     this.length = n
     for (var i = 1; i <= n; i++) {
          this[i] = 0
     }
     return this
}

function makeKey(p,q) {
// Make sure the user didn't do anything stupid:
document.form.decrypted.value = "";

if(p * q < 255)
	window.alert("Öffentlicher Schlüssel x Privater Schlüssel muss größer als 255 sein! Ö*P = " + p*q);
else if(p == q)
	window.alert("Die Schlüssel dürfen nicht gleich groß sein!");
else if(document.form.Message.value == "") 
	window.alert("Es fehlt noch die Adresse zum Verschlüsseln!");
else {
	// Make the key
	var c = 0;
	var z = (p-1)*(q-1);
	var e = 0;
	var n = p*q;
	var d;

	do {
		e++;
		d = getKey(primes[e],z);
	} while(d==1);
	e = primes[e];

	
	// Turn the string into an array of numbers < 255
	var m = document.form.Message.value;
	var emailLength = m.length;
	var justEmail = "";
	if(document.form.Subject.value != "") {
	        m = m + "?subject=" + document.form.Subject.value;
	}

	var length = m.length;
	theString = new MakeArray(length);
	for(var i = 0; i < length; i++) {
		theString[i] = m.charCodeAt(i);
	}
	
	// Encrypt each of the numbers
	theCode = new MakeArray(length);
	c = "";
	var temp = 0;
	for(i = 0; i < length; i++) {
		if(i != 0)
			c+= " ";
		temp = myMod(theString[i],e,n);
		theCode[i] = temp;
		c += temp;
		if(i == emailLength - 1)
		        justEmail = c;
	}
	document.form.N.value = n;
	document.form.D.value = d;
	document.form.E.value = e;
	document.form.C.value = c;
	document.form.encrypted.value = justEmail;
	document.form.justemailencrypted.value = justEmail;
	}
}

// Finds x^e % y for large values of (x^e)
function myMod(x,e,y) {
	if (e % 2 == 0) {
		var answer = 1;
		for(var i = 1; i <= e/2; i++) {
			var temp = (x*x) % y;
			answer = (temp*answer) % y;
		}
	} else {
		var answer = x;
		for(var i = 1; i <= e/2; i++) {
			var temp = (x*x) % y;
			answer = (temp*answer) % y;
		}
	}
	return answer;
}


function getKey(e,z) {
A = 1;B = 0;C = z;F = 0;G = 1;bar = e;    
// Euclid's Algorithm:
while (bar != 0) {
     foo = Math.floor(C/bar);
     K = A - foo * F;
     L = B - foo * G;
     M = C - foo * bar;
     A = F;B = G;C = bar;
     F = K;G = L;bar = M;
}
if (B < 0)
	return (B + z);
else
      return (B);
}

function goForth(c,n,d) {
	c += " ";
	var length = c.length;
	var number = 0;
	var bar = 0;
	var answer = "";

	for(var i = 0; i < length; i++) {
		number = 0;
		bar = 0;
		while(c.charCodeAt(i) != 32) { 
			number = number * 10;
			number = number + c.charCodeAt(i)-48;
			i++;
		}
		answer += String.fromCharCode(decrypt(number,n,d));
	}
return answer;
}

function decrypt(c,n,d) {
// Split exponents up
if (d % 2== 0) {
     bar = 1;
     for(var i = 1; i <= d/2; i++) {
	 foo = (c*c) % n;
	 bar = (foo*bar) % n;
     }
} else {
     bar = c;
     for(var i = 1; i <= d/2; i++) {
       foo = (c*c) % n;
       bar = (foo*bar) % n;
     }
}
return bar;
}

function writeOptions() {
	var size = primes.length;
	for(i = 0; i < size; i++)
		document.write("<option value=\""+primes[i]+"\">"+primes[i]+"</option>");
}
// Stop hiding script -->
