Avatar billede mcardle Nybegynder
03. november 2009 - 19:50 Der er 12 kommentarer og
1 løsning

Klasse med mcrypt

Hej Eksperter.

Jeg har lavet denne her klasse, som gerne skulle kunne kryptere og dekryptere, men det virker ikke så godt. Jeg har tjekket phpinfo() og den viser at der er understøttelse for blowfish som jeg bruger.

Her er lidt kode:

<?php

class Encryption{
    protected $cypher = "blowfish";
    protected $mode = "cfb";
    protected $key = "test";
    protected $td;

    public function __construct(){
        $this->td = mcrypt_module_open($this->cypher, '', $this->mode, '');
    }
   
    public function encryptPassword($plaintext){
        return $this->_encrypt($plaintext);
    }
   
    public function decryptPassword($crypttext){
        return $this->_encrypt($crypttext);
    }
   
    private function _encrypt($plaintext){
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $crypttext = mcrypt_generic($this->td, $plaintext);
        mcrypt_generic_deinit($this->td);
        return $iv.$crypttext;
    }
   
    private function _decrypt($crypttext){
        $ivsize = mcrypt_get_iv_size($this->td);
        $iv = substr($crypttext, 0, $ivsize);
        $crypttext = substr($crypttext, $ivsize);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $plaintext = mdecrypt_generic($this->td, $crypttext);
        mcrypt_generic_deinit($this->td);
        return $plaintext;
    }
}

?>

Håber I kan hjælpe.

//mcardle
Avatar billede mcardle Nybegynder
03. november 2009 - 19:52 #1
Det skal måske siges at det måske virker den ene vej, men man kan i hvert fald ikke dekryptere igen.

//mcardle
Avatar billede Slettet bruger
03. november 2009 - 19:57 #2
Jeg tror bare det er en slåfejl:

<?php

class Encryption{
    protected $cypher = "blowfish";
    protected $mode = "cfb";
    protected $key = "test";
    protected $td;

    public function __construct(){
        $this->td = mcrypt_module_open($this->cypher, '', $this->mode, '');
    }
 
    public function encryptPassword($plaintext){
        return $this->_encrypt($plaintext);
    }
 
    public function decryptPassword($crypttext){
        return $this->_encrypt($crypttext);
    }
 
    private function _encrypt($plaintext){
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $crypttext = mcrypt_generic($this->td, $plaintext);
        mcrypt_generic_deinit($this->td);
        return $iv.$crypttext;
    }
 
    private function _decrypt($crypttext){
        $ivsize = mcrypt_get_iv_size($this->td);
        $iv = substr($crypttext, 0, $ivsize);
        $crypttext = substr($crypttext, $ivsize);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $plaintext = mdecrypt_generic($this->td, $crypttext);
        mcrypt_generic_deinit($this->td);
        return $plaintext;
    }
}

?>
Avatar billede bmdk Nybegynder
03. november 2009 - 20:04 #3
Well-spottet kimsey0 :P det er sådan nogle fejl der kan tage timer at finde frem til og give grå hår før tid!
Avatar billede mcardle Nybegynder
03. november 2009 - 20:05 #4
Haha, den havde jeg ikke lige set... Men nu kommer der nogle småfejl. Den siger at $ivsize = mcrypt_get_iv_size($this->td); mangler en parameter, men det er der ikke i det eksempel jeg har fundet.
Avatar billede mcardle Nybegynder
03. november 2009 - 20:09 #5
Der står i min bog, at jeg skal sende en resource med som parameter, men på php.net står der at det skal være en cypher og en mode...

Hvordan plejer I at gøre?
Avatar billede mcardle Nybegynder
03. november 2009 - 20:12 #6
Jeg fik den til at virke... Takker for hjælpen, smid et svar :o)

//mcardle
Avatar billede Slettet bruger
03. november 2009 - 20:36 #7
Ja, det sker også tit for mig. Sidder og leder i timer efter en simpel fejl. Så er et par nye øjne altid go'e :)

Kan vi få løsningen at se? Så kan andre der er i gang med samme opgave jo se hvordan det skal gøres.

(Hmm... Nu er jeg ikke super skarp til OOP, men ville klassen ikke lige så godt kunne integreres abstrakt? Det vil selvfølgelig kræve at du importerer mcrypt-modulet hver gang det skal bruges, men vil vel gøre det lettere og mere funktions-agtigt at bruge klassen.
Det kan også være at det spolerer hele idéen med at lave det som en klasse, eller simpelthen er for svært. Så må du bare ignorere mit forslag.)
Avatar billede Slettet bruger
03. november 2009 - 20:47 #8
Hvad med liiige at poste den endelige version af class'en : )
Avatar billede mcardle Nybegynder
03. november 2009 - 20:47 #9
Svaret var det de havde skrevet på php.net med at der skulle 2 parametre med $this->cypher og $this->mode.

private function _decrypt($crypttext){
  $ivsize = mcrypt_get_iv_size($this->cypher, $this->mode);
  $iv = substr($crypttext, 0, $ivsize);
  $crypttext = substr($crypttext, $ivsize);
  mcrypt_generic_init($this->td, $this->key, $iv);
  $plaintext = mdecrypt_generic($this->td, $crypttext);
  mcrypt_generic_deinit($this->td);
  return $plaintext;
}

Jeg er ikke selv for spids i abstract-classes. Jeg er ikke helt sikker på hvad en abstrakt klasse kan, arver den ikke bare fra andre klasse eller? Jeg har læst lidt om det, men forstod det ikke helt :o)
Avatar billede mcardle Nybegynder
03. november 2009 - 20:49 #10
Den endelig klasse, lige til alle jer der bare vil kopi / vaste:


<?php

class Encryption{
    protected $cypher = "blowfish";
    protected $mode = "cfb";
    protected $key = ""; // Et ord der skal bruges i krypteringen.
    protected $td;

    public function __construct(){
        $this->td = mcrypt_module_open($this->cypher, '', $this->mode, '');
        $this->_setUnsafeHtml();
    }
   
    public function encryptPassword($plaintext){
        return $this->_encrypt($plaintext);
    }
   
    public function decryptPassword($crypttext){
        return $this->_decrypt($crypttext);
    }
   
    private function _encrypt($plaintext){
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $crypttext = mcrypt_generic($this->td, $plaintext);
        mcrypt_generic_deinit($this->td);
        return $iv.$crypttext;
    }
   
    private function _decrypt($crypttext){
        $ivsize = mcrypt_get_iv_size($this->cypher, $this->mode);
        $iv = substr($crypttext, 0, $ivsize);
        $crypttext = substr($crypttext, $ivsize);
        mcrypt_generic_init($this->td, $this->key, $iv);
        $plaintext = mdecrypt_generic($this->td, $crypttext);
        mcrypt_generic_deinit($this->td);
        return $plaintext;
    }
   
}

?>

// mcardle
Avatar billede Slettet bruger
03. november 2009 - 21:06 #11
Som sagt, jeg er heller ikke en haj til abstrakte klasser i PHP, men jeg forestiller mig at de ligner (det jeg kender som) virtuelle klasser i andre sprog, altså klasser som ikke initialize som instances, men bruges direkte altså:

$tekst = "Blah";
$nytekst = Encryption->encryptPassword($tekst);
echo $tekst . " bliver krypteret til " . $nytekst; //a1d78b2ef

Det var kun en strøtanke, (hvorfor den også stod i parentes) og jeg kan desværre ikke rigtigt hjælpe dig videre med det.

PS: Hvis det jeg siger er det rene sludder skal i være velkomme til at rette mig.
Avatar billede mcardle Nybegynder
04. november 2009 - 17:09 #12
Det vil jeg lige forske lidt i :0)

Tak for inputtet.
Avatar billede Slettet bruger
06. november 2009 - 08:30 #13
Selv tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester