Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP ja Mcrypt

wisekki [11.08.2009 12:56:21]

#

Yritän mcrypt:llä salata ja purkaa tiedostoa, mutta jostain syystä purettaessa aina tiedoston alkuun tulee extrakökköä, joka vielä ylikirjoittaa alkuperäistä pituutensa verran.

Esim. tekstitiedosto.txt joka sisältää: 1234567890 testi 0987654321. Kun tiedosto puretaan salauksen jälkeen sen sisältö on: Lt`E�t90 testi 0987654321.

Johtuuko kyseinen kenties blowfish:stä sekä cbc:stä?

Base64_encode ja decode ei auta tapauksessa mitään, enkä ole edes varma pitäisikö auttaakkaan. Tuostakin olisi mukava päästä eroon, koska se kasvattaa tiedoston kokoa aika ikävästi.

<?php
function Salaus($salattava, $avain) {
        return base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, substr($avain, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC)), trim($salattava), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC), MCRYPT_RAND)));

    return false;
}

function Purku($salattava, $avain) {
        return trim(mcrypt_decrypt(MCRYPT_BLOWFISH, substr($avain, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC)), base64_decode($salattava), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC), MCRYPT_RAND)));

    return false;
}

function Salaa($lahde, $kohde, $avain) {
        if (is_file($lahde) === true) {
            $lahde = file_get_contents($lahde);
            if (file_put_contents($kohde, Salaus($lahde, $avain), LOCK_EX) !== false) return true;
        }
    return false;
}

function Pura($lahde, $kohde, $avain) {
        if (is_file($lahde) === true) {
            $lahde = file_get_contents($lahde);
            if (file_put_contents($kohde, Purku($lahde, $avain), LOCK_EX) !== false) return true;
        }
    return false;
}
?>

- Antti

tsuriga [12.08.2009 20:29:29]

#

Satavarmaksi en sano, mutta monesta lähteestä tutkittuani tulin siihen johtopäätökseen, notta kryptatessa ja dekryptatessa tulee käyttää ainakin CBC-tilassa samaa alustusvektoria. Sen kun puuppaat tuonne kryptatun tiedoston alkuun ja käytät sitä purkaessa ni johan alkaa lyyti kirjoittaa.

Contraband [13.08.2009 01:50:00]

#

Tsuriga on oikeassa. Luot alustusvektorin (IV) uudestaan satunnaisesti mcrypt_create_iv-funktiolla jokaisen salauksen ja purun yhteydessä, jolloin ensimmäisen salatun lohkon sisältö on purkamisen jälkeen täysin satunnaista (=mainitsemaasi "extrakökköä"), koska salauksessa ja purkamisessa käytetään eri alustusvektoria.

https://www.php.net/manual/en/mcrypt.ciphers.php:

The IV must be unique and must be the same when decrypting/encrypting.

Lohkot toisesta eteenpäin menevät oikein CBC-moodin tomintaperiaatteesta johtuen (seuraava lohko XORrataan edellisen lohkon salakirjoitetulla - ei selväkielisellä - versiolla). Esimerkiksi PCBC-moodissa koko data menisi sekaisin, jos alustusvektori on väärin.

Salauksessa käytetty alustusvektori tulee siis tallentaa salatun datan yhteyteen, jotta sitä voidaan käyttää dataa purettaessa.

wisekki [13.08.2009 10:30:34]

#

Kiitoksia vastauksista.. tätä epäilin myös itse googlen avustuksella, mutta turhauduin enkä jaksanut enää kokeilla :D

Mutta mutta.. enpä jostain syystä saanut sitten luettua IV:tä tiedoston alusta, joten vaihdoin kokonaan mcrypt_generic:iin, joka toimii paremmin kuin hyvin.. Jostain osu silmään, että varsinkin binääritiedostojen kanssa kannattaisi käyttää mcrypt_generic:iä(?)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta