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
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.
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.
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ä(?)
Aihe on jo aika vanha, joten et voi enää vastata siihen.