PHP PHP - AES o Rijndael 256 bit

Stato
Discussione chiusa ad ulteriori risposte.

Koskha

Utente Electrum
7 Aprile 2012
269
13
51
119
Ciao a tutti, ho cercato tempo fa sul web qualche guida su come cryptare stringhe in AES o Rijndael.
Tutto quello che ho trovato è robaccia a chiavi random o che usa mcrypt (libreria che personalmente detesto).
Spero che qualcuno di voi possa aiutarmi a trovare qualche funzione funzionante (gioco di parole :\ ).

Cerco una cosa del tipo
Crypt($str, $key);
e
Decrypt($encryptedstr, $key);

Mi va bene anche mcrypt, ma basta che la chiave la fate scegliere a me e non come tutti fanno con MCRYPT_RAND. (che poi che senso ha una chiave random, a quel punto usi md5 o sha1 e tanti saluti).

Aspetto _Swoller e qualche altro esperto che vedo in giro nelle sezioni di programmazione :)

Grazie in anticipo
 
  • Mi piace
Reazioni: carbos
Ultima modifica:
<?php
function mysql_aes_decrypt($val,$ky)
{
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
for($a=0;$a<strlen($ky);$a++)
$key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
$mode = MCRYPT_MODE_ECB;
$enc = MCRYPT_RIJNDAEL_128;
$dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
}

function mysql_aes_encrypt($val,$ky)
{
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
for($a=0;$a<strlen($ky);$a++)
$key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
$mode=MCRYPT_MODE_ECB;
$enc=MCRYPT_RIJNDAEL_128;
$val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
echo mysql_aes_decrypt("Heila'","lol"); // FTN (For The Noobs) Heila= parola da criptare , lol = chiave
?>
Per quello a 32 byte puoi rimediare una classe qua: http://dev.strategystar.net/examples/AES_Encryption_with_padCrypt.zip
E' questo quello che cerchi ?
Codice preso da : PHP: Mcrypt Functions - Manual
 
  • Mi piace
Reazioni: Koskha
<?php

function mysql_aes_decrypt($val,$ky)
{
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
for($a=0;$a<strlen($ky);$a++)
$key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
$mode = MCRYPT_MODE_ECB;
$enc = MCRYPT_RIJNDAEL_128;
$dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
}

function mysql_aes_encrypt($val,$ky)
{
$key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
for($a=0;$a<strlen($ky);$a++)
$key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
$mode=MCRYPT_MODE_ECB;
$enc=MCRYPT_RIJNDAEL_128;
$val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
echo mysql_aes_decrypt("Heila'","lol"); // FTN (For The Noobs) Heila= parola da criptare , lol = chiave
?>
Per quello a 32 byte puoi rimediare una classe qua: http://dev.strategystar.net/examples/AES_Encryption_with_padCrypt.zip
E' questo quello che cerchi ?
Codice preso da : PHP: Mcrypt Functions - Manual

Roba da matti. Grazie, per il codice, anche se è un po assurdo come codice. Credo che funzioni, più tardi farò dei test.
Se nessun altro da una soluzione migliore o senza mcrypt ti do +1 e like.
 
Ho fatto alcuni test con mcrypt e la chiave la si puo perfettamente settare
PHP:
//Semplice esempio
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$encode = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'chiave', 'ciao ciao', MCRYPT_MODE_ECB, $iv);
echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'chiave', $encode, MCRYPT_MODE_ECB, $iv); //come output dovrebbe dare ciao ciao
Intendevi per caso altro? Comunque ovviamente si puo facilmente manipolare in 2 funzioni per criptare e decriptare manipolando solo il valore e le chiavi

Inoltre prima di questo passaggio la stringa puo essere modificata come meglio credi e ricavata nuovamente (es, url encode => base64 => mcrypt)


Comunque cosa devi fare di preciso? Magari ci sono metodi migliori
 
Ho fatto alcuni test con mcrypt e la chiave la si puo perfettamente settare
PHP:
//Semplice esempio
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$encode = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'chiave', 'ciao ciao', MCRYPT_MODE_ECB, $iv);
echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'chiave', $encode, MCRYPT_MODE_ECB, $iv); //come output dovrebbe dare ciao ciao
Intendevi per caso altro? Comunque ovviamente si puo facilmente manipolare in 2 funzioni per criptare e decriptare manipolando solo il valore e le chiavi

Inoltre prima di questo passaggio la stringa puo essere modificata come meglio credi e ricavata nuovamente (es, url encode => base64 => mcrypt)


Comunque cosa devi fare di preciso? Magari ci sono metodi migliori

Io intendevo proprio questo:
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

Non va bene... io devo fare un applicazione in delphi, che con indy, facesse una richiesta, e ottiene la risposta, richiesta e risposta vanno cryptate (faccio tutto in hex, non base64).
Io cercavo più che altro il codice puro in php, come quella dell'rc4 che si trova in giro, cicli, array di byte etc, non questa roba di mcrypt.
Comunque intendevo proprio quello detto da Reminder, vorrei anche la funzione per farlo con Rijndael, come appunto hai scritto tu in questa funzione, a 256 bit.
Se tu provi a cryptare una stringa, aggiorna la pagina e vedi che la stringa è già diversa...
 
Io intendevo proprio questo:
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

Non va bene... io devo fare un applicazione in delphi, che con indy, facesse una richiesta, e ottiene la risposta, richiesta e risposta vanno cryptate (faccio tutto in hex, non base64).
Io cercavo più che altro il codice puro in php, come quella dell'rc4 che si trova in giro, cicli, array di byte etc, non questa roba di mcrypt.
Comunque intendevo proprio quello detto da Reminder, vorrei anche la funzione per farlo con Rijndael, come appunto hai scritto tu in questa funzione, a 256 bit.
Se tu provi a cryptare una stringa, aggiorna la pagina e vedi che la stringa è già diversa...
Si avevo visto allora guardando fra le costanti del mcrypt, ho notato che se si utilizza MCRYPT_ENCRYPT al posto di MCRYPT_RAND la stringa criptata non cambia, prova anche te e fammi sapere semmai
 
Si avevo visto allora guardando fra le costanti del mcrypt, ho notato che se si utilizza MCRYPT_ENCRYPT al posto di MCRYPT_RAND la stringa criptata non cambia, prova anche te e fammi sapere semmai

Ho chiesto ad un mio amico e dopo tante prove ci è riuscito, per ora non lo vedo da un po, quando riesco a farmi dare i codici li scrivo qui, poiché credo molto ricercati, e chiudo.
 
strano perché aveva detto che chiudeva xD
Si ma ho detto che prima avrei contattato quell'amico, cosa che ho fatto, ma non ha la funzione per decriptare, in ogni caso credo non sarà difficile ricostruirla una volta che si ha quella originale.
Ecco il codice:
Codice:
function aes_encrypt($val,$ky)
{
$key="\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1";
$mode = MCRYPT_MODE_CBC;
$enc = MCRYPT_RIJNDAEL_128;
$iv = "\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1";

return mcrypt_encrypt($enc, $key, $val, $mode, $iv);
}

Spero sia utile. chiudo
 
Stato
Discussione chiusa ad ulteriori risposte.