codifica - decodifica

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
cosa ne pensate di questa funzione?

PHP:
<?php
/*
--cripto una stringa ma in modo che non vi siano caratteri speciali--
--vi sono alcune ridondanze da semplificare--
--per una parola chiave di 6 lettere alfanum si possono utilizzare 999989 chiavi--
-- con 12 lettere, 999999999989 chiavi--
--non consentite chiavi con numeri tutti uguali-
--lo zero corrisponde a 10--
es. di utilizzo:
	pagina con form di accesso a pagine riservate

	campo USERNAME (presente nel DB)
	campo PASSWORD (presente nel DB ma criptata)
	campo CHIAVE (in possesso dell'utente, ma non presente nel DB e possibilmente nemmeno in locale)
	nella pagina accesso ho, provenienti dal form:
	$user=$_POST{'miaUser'];
	$paswForm=$_POST{'miaPsw']; es. psw = pAroLaCHiavE
	dalla query ecc.. leggo la pasw dal DB
	$paswDB = $riga[password]; nel DB ho sH0tTkMJrgyI
	$paswDB = deCodifica($paswDB,$_POST{'miaChiave']); la chiave è 379580029634
	if ($paswForm == $paswDB){ecc. ecc......(in questo caso OK)
	
	il metodo potrebbe essere utilizzato (con qualche piccola modifica @.-_) all'indirizzo email
	per renderne difficile la lettura agli spam, es.
	$mioIndirizzo = decodifica("Sdr55iUnMMkhlo", "135896780023648"); non impossibile, ma difficile
	(è evidente che prima avrò dovuto codificare l'indirizzo con la stessa chiave)
	
	
	la chiave non è ne sul remoto ne in locale (salvo foglio di carta)

---> usatelo e modificatelo come vi pare, se avete voglia informatemi [email protected]
*/


function codifica($stringa,$code){ // legge la parola e la chiave numerica di codifica

	/*-----verifica immissione----*/
	$lunStringa = strlen($stringa);
	$lunCode = strlen($code);
	if ($lunStringa != $lunCode){//lunghezza parole e chiave uguali
		return "<br>parola e codice non congrui<br>";
	}
	$veroP = ereg("^([0-9A-Za-z]{1,$lunStringa})$", $stringa); //parola solo lettere o numeri (per ora)
	if ($veroP == FALSE){
		return "<br>la parola contiene caratteri non ammessi<br>";
	}
	$veroC = ereg("^([0-9]{1,$lunCode})$", $code); //chiave solo numeri (per ora)
	if ($veroC == FALSE){
		return "<br>la chiave deve essere numerica<br>";
	}
	
	$flag= 0;
	for ($j=1 ; $j <= $lunCode; $j++){//chiave non con tutti numeri uguali
		if ($code[0] == $code[$j]){
			$flag ++;
		}
	}
	if ($lunCode == ($flag+1)){
		return "<br>la chiave non deve avere tutti i numeri uguali<br>";
	}

	/*----inizializzo variabili----*/
	$daCodificare=$stringa;
	$codice= int;
	$codice=$code;
	$incremento= int;
	$nuovoASCI= int;
	$codificata="";
	$daRestituire="";
	$k=0;
	/*----inizio la codifica----*/
	for($k=0; $k < $lunStringa; $k++){
		$carASCI= ord($daCodificare[$k]); //codice ASCI del kappesimo carattere della stringa
		$incremento = ord($codice[$k])-48; //valore numerico del kappesimo carattere del code
		if ($incremento == 0) { $incremento = 10;} //evito comunque di non codificare
	
		if($carASCI > 47 and $carASCI <= 57){ //originale è da 0-9
			$nuovoASCI = $carASCI + $incremento; //ricavo il nuovo codice ASCI
			if($nuovoASCI > 57){//interssa la zona di caratteri non ammessi
				$incre= $nuovoASCI - 58;
				$nuovoASCI = 65 + $incre; //adesso cade nella zona A-Z
			}//fine > 57
		} // fine if 48 57

		if($carASCI > 64 and $carASCI <=90){ //originale è da A-Z
			$nuovoASCI = $carASCI + $incremento; //ricavo il nuovo codice ASCI
			if($nuovoASCI > 90){//interssa la zona di caratteri non ammessi
				$incre= $nuovoASCI - 91;
				$nuovoASCI = 97 + $incre; //adesso cade nella zona a-z
			}//fine > 90
		} //fine IF 65-90

		if($carASCI > 96 and $carASCI <=122){ //originale è da a-z	
			$nuovoASCI = $carASCI + $incremento; //ricavo il nuovo codice ASCI
			if($nuovoASCI > 122){//interssa la zona di caratteri non ammessi
				$incre= $nuovoASCI - 123;
				$nuovoASCI = 48 + $incre; //adesso cade nella zona 0-9
			}//fine > 122
		} //fine IF 97-122

		//ho passato i filtri e ho ruotato il codice carattere
		$codificata[$k] = chr($nuovoASCI); //
		$daRestituire .= $codificata[$k]; //riformo la parola codificata
	} //fine del FOR

	return $daRestituire;
}// fine function codifica

/********************************************************************/

function deCodifica($stringa,$code){
	/*-----verifica immissione----*/
	$lunStringa = strlen($stringa);
	$lunCode = strlen($code);
	if ($lunStringa != $lunCode){
		return "<br>parola e codice non congrui<br>";
	}
	$veroP = ereg("^([0-9A-Za-z]{1,$lunStringa})$", $stringa);
	if ($veroP == FALSE){
		return "<br>la parola contiene caratteri non ammessi<br>";
	}
	$veroC = ereg("^([0-9]{1,$lunCode})$", $code);
	if ($veroC == FALSE){
		return "<br>la chiave deve essere numerica<br>";
	}
	
	$flag= 0;
	for ($j=1 ; $j <= $lunCode; $j++){
		if ($code[0] == $code[$j]){
			$flag ++;
		}
	}
	if ($lunCode == ($flag+1)){
		return "<br>la chiave non deve avere tutti i numeri uguali<br>";
	}
/*----inizializzo variabili----*/
	$daCodificare=$stringa;
	$codice= int;
	$codice=$code;
	$incremento= int;
	$nuovoASCI= int;
	$codificata="";
	$daRestituire="";
	$k=0;
	/*----inizio la decodifica----*/
	for($k=0; $k < $lunStringa; $k++){
		$carASCI= ord($daCodificare[$k]); //codice ASCI del kappesimo carattere della stringa
		$incremento = ord($codice[$k])-48; //valore numerico del kappesimo carattere del code
		
		if ($incremento == 0) { $incremento = 10;} //come da codifica
		
		if($carASCI > 47 and $carASCI <=57){ //il codificato è da 0-9
			
			$nuovoASCI = $carASCI - $incremento; //ricavo il nuovo codice ASCI inverso a codifica
			if( $nuovoASCI < 48){//interssa la zona di caratteri non ammessi
				$incre= 47 - $nuovoASCI;
				$nuovoASCI = 122 - $incre; //riporto nella zona a-z
			}// fine IF<47
		} //fine IF 48-57

		if($carASCI > 64 and $carASCI <=90){ //il codificato è da A-Z
			$nuovoASCI = $carASCI - $incremento; //ricavo il nuovo codice ASCI inverso a codifica
			if( $nuovoASCI < 65){//interssa la zona di caratteri non ammessi
				$incre= 64 - $nuovoASCI;
				$nuovoASCI = 57 - $incre; //riporto nella zona 0-9
			}// fine IF<65
		} //fine IF 65-90
		
		if($carASCI > 96 and $carASCI <=122){ //il codificato è da a-z
			$nuovoASCI = $carASCI - $incremento; //ricavo il nuovo codice ASCI inverso a codifica
			if( $nuovoASCI < 97){//interssa la zona di caratteri non ammessi
				$incre= 96 - $nuovoASCI;
				$nuovoASCI = 90 - $incre; //riporto nella zona A-Z
			}// fine IF<96
		} //fine IF 97-122
		
		//ho passato i filtri e ho ruotato il codice carattere
		/*echo "il cofificato ASCI è = ".$carASCI."<br>";
		echo "corrispondente a = ".chr($carASCI)."<br>";
		echo "incremento decode = ".$incremento."<br>";
		echo "il nuovo ASCI è = ".$nuovoASCI."<br>";
		echo "corrispondente a = ".chr($nuovoASCI)."<br>";*/
		$codificata[$k] = chr($nuovoASCI); //
		
		$daRestituire .= $codificata[$k]; //riformo la parola decodificatacodificata
		/*echo "da restituire = ".$daRestituire."<br>";*/
	}//fine del for
	return $daRestituire;
}//fine functio deCodifica



/*****************---TEST DI PROVA---*****************/

$password = "pAroLaCHiavE";
$chiave = "379580029634";
/*è possibile criptare più volte anche con chiavi diverse es chiave1, chiave2, ...
  per decrippare invertire l'ordine delle chiavi ..., chiave2, chiave1
*/
$pswCode= codifica($password,$chiave);

echo "la parola originale è : ".$password."<br>";
echo "codificata con chiave : ".$chiave."<br>";
echo "la parola codificata è: ".$pswCode."<br><br><br>";

$pswDeCode= deCodifica($pswCode,$chiave); /*la chiave deve essere identica a quella
                                            con cui ho codificato*/


echo "la parola decodificata è: ".$pswDeCode."<br><br><br>";

if ($password == $pswDeCode){
	echo "il criptaggio - decriptaggio è andato a buon fine<br>";
}else {
	echo "è sopravvenuto un errore di decriptaggio - verificare chiave<br><br><br>";
}

?>
 

Discussioni simili