// Implementierung einer affinen Chiffre im EBC Mode, Blocklänge = 1
//
// m Modul
// Schlüssel zum Verschlüsseln (a, b) mit a und b prim zu m
// Schlüssel zum Entschlüsseln (as, b) mit as*a = 1 mod m (erw. Euklied)
//
// Verschlüsseln: c = (a*x + b) mod m
// Entschlüsseln: m = as * (c - b) mod m

function toHEX(cZahl) {
	var strZahl = '';
	var c16_1 = Math.floor(cZahl / 16);
	var c16_0 = cZahl % 16;
	switch (c16_1) {
		case 10: strZahl = strZahl.concat('A'); break;
		case 11: strZahl = strZahl.concat('B'); break;
		case 12: strZahl = strZahl.concat('C'); break;
		case 13: strZahl = strZahl.concat('D'); break;
		case 14: strZahl = strZahl.concat('E'); break;
		case 15: strZahl = strZahl.concat('F'); break;
		default: strZahl = strZahl.concat(c16_1); break;
	}
	switch (c16_0) {
		case 10: strZahl = strZahl.concat('A'); break;
		case 11: strZahl = strZahl.concat('B'); break;
		case 12: strZahl = strZahl.concat('C'); break;
		case 13: strZahl = strZahl.concat('D'); break;
		case 14: strZahl = strZahl.concat('E'); break;
		case 15: strZahl = strZahl.concat('F'); break;
		default: strZahl = strZahl.concat(c16_0); break;
	}
	return strZahl;
}

function fromHEX(strZahl) {
	var cZahl = 0;
	switch (strZahl.charCodeAt(1)) {
		case 48: cZahl = cZahl + 0; break;
		case 49: cZahl = cZahl + 1; break;
		case 50: cZahl = cZahl + 2; break;
		case 51: cZahl = cZahl + 3; break;
		case 52: cZahl = cZahl + 4; break;
		case 53: cZahl = cZahl + 5; break;
		case 54: cZahl = cZahl + 6; break;
		case 55: cZahl = cZahl + 7; break;
		case 56: cZahl = cZahl + 8; break;
		case 57: cZahl = cZahl + 9; break;
		case 65: cZahl = cZahl + 10; break;
		case 66: cZahl = cZahl + 11; break;
		case 67: cZahl = cZahl + 12; break;
		case 68: cZahl = cZahl + 13; break;
		case 69: cZahl = cZahl + 14; break;
		case 70: cZahl = cZahl + 15; break;
	}
	switch (strZahl.charCodeAt(0)) {
		case 48: cZahl = cZahl + 0 * 16; break;
		case 49: cZahl = cZahl + 1 * 16; break;
		case 50: cZahl = cZahl + 2 * 16; break;
		case 51: cZahl = cZahl + 3 * 16; break;
		case 52: cZahl = cZahl + 4 * 16; break;
		case 53: cZahl = cZahl + 5 * 16; break;
		case 54: cZahl = cZahl + 6 * 16; break;
		case 55: cZahl = cZahl + 7 * 16; break;
		case 56: cZahl = cZahl + 8 * 16; break;
		case 57: cZahl = cZahl + 9 * 16; break;
		case 65: cZahl = cZahl + 10 * 16; break;
		case 66: cZahl = cZahl + 11 * 16; break;
		case 67: cZahl = cZahl + 12 * 16; break;
		case 68: cZahl = cZahl + 13 * 16; break;
		case 69: cZahl = cZahl + 14 * 16; break;
		case 70: cZahl = cZahl + 15 * 16; break;
	}
	return cZahl;
}

// Entschlüsseln des Schlüsseltextes strEncrypted
function decrypt(strEncrypted) {
	var as = 241;	// astrich
	var b = 31;		// b
	var m = 256;	// Modul
	var strText = '';	// Klartext
	
	for(var i = 0; i < strEncrypted.length; i = i + 2) {
		// Wenn die Differenz kleiner null ist, so muß sie in die 1 Äquivalenzklasse größer null
		// umgerechnet werden
		var strHexZahl = strEncrypted.charAt(i) + strEncrypted.charAt(i+1);
		var cDecZahl = fromHEX(strHexZahl);
		
		var cTemp = cDecZahl - b;
		if (cTemp < 0)
			cTemp += m;
		var cZahl = (as * cTemp) % m;
		strText = strText.concat(String.fromCharCode(cZahl));
	}
	
	document.write(strText);
	return strText;
}

// Verschlüsseln des Schlüsseltextes strEncrypted
function encrypt(strText) {
	var a = 17;		// a
	var b = 31;		// b
	var m = 256;	// Modul
	var strEncrypted = '';	// Schlüsseltext
	
	for(var i = 0; i < strText.length; i++) {
		var cZahl = (a * strText.charCodeAt(i) + b) % m;
		strEncrypted = strEncrypted.concat(toHEX(cZahl));
	}
	
	document.write(strEncrypted);
	return strEncrypted;
}
