""" Pieni apumoduuli, jota voidaan käyttää tiedostojen tallentamiseen sekä avaamiseen AES-salausalgoritmilla ja salausavaimella. Käyttö vaatii pycryptodome-kirjaston asentamisen. """ from Crypto.Cipher import AES def muunna_avain(avain): """ Moduulin muut funktiot käyttävät tätä funktiota avaimen muuntamiseen sellaiseen muotoon, että se kelpaa AES-algoritmille. Tämä muunnos tarvitaan, koska AES-avainten tulee olla tietyn mittaisia, mutta määrätyn avaimen pituus voi vaihdella. :param str avain: salausavain merkkijonona """ muunnettu = hashlib.sha256() muunnettu.update(avain.encode("utf-8")) return muunnettu.digest() def avaa_avaimella(polku, avain): """ Avaa polku-sijainnissa olevan salatun tiedoston annetulla avaimella. Palauttaa salatun tiedoston sisällön merkkijonona. Aiheuttaa ValueError-poikkeuksen, jos salausavain on väärä. :param str polku: salatun tiedoston sijainti :param str avain: salausavain merkkijonona :return: salatun tiedoston sisältö merkkijonona """ with open(polku, "rb") as lahde: kerta_arvo = f.read(16) varmenne = f.read(16) salattu = f.read(-1) koodi = AES.new(muunna_avain(avain), AES.MODE_EAX, kerta_arvo) return koodi.decrypt_and_verify(salattu, varmenne).decode("utf-8") def salaa_avaimella(polku, avain, sisalto): """ Salaa annetun sisällön käyttämällä annettua avainta, ja tallentaa salatun sisällön polku- argumentin määräämään sijantiin. :param str polku: kohdetiedoston sijainti :param str avain: salausavain merkkijonona :param str sisalto: salattava sisältö merkkijonona """ koodi = AES.new(muunna_avain(avain), AES.MODE_EAX) salattu, varmenne = cipher.encrypt_and_digest(sisalto.encode("utf-8")) with open(polku, "wb") as kohde: kohde.write(koodi.kerta_arvo) kohde.write(varmenne) kohde.write(salattu)