Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [c#] Operazione su file di grosse dimensioni

    Ciao a tutti

    Sto facendo un piccolo programma crittografico, e mi sorge spesso un problema.
    Il programma usa 2 array di bytes e li combina. 1 è il file, l'altro la chiave. La chiave è tanto più sicura quanto è più lunga, e quindi la soluzione ovvia è usare un altro file come chiave (voglio vedere chi mai potrebbe fare brute force su una chiave di 600MB!)

    Il mio problema nasce quando sia il file che la chiave sono di grosse dimensioni. Come avrete intuito, mi da "Out of System Resources". Questo succede perchè ho due variabili che contengono gli array di byte, inizializzate così

    InputFileBytes = File.ReadAllBytes(FileDaCifrare);
    Key = File.ReadAllBytes(FileChiave);

    Se entrambi i file sono abbastanza grandi, non c'è abbastanza memoria per farlo. Mi stavo chiedendo se non fosse possibile farlo in modo più efficiente. Per esempio, ogni byte del file da cifrare viene utilizzato una sola volta. Non c'è un modo per evitare di caricare tutto il file in memoria, considerando che ho bisogno di un solo byte per volta?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    puoi usare un buffer di byte e leggere il file a blocchi ( ad esempio di 1 mega )

    utilizza un filestream e adopera la funzione read che restituisce i byte da leggere, con un ciclo controlli che siano maggiori di 0 ( altrimenti hai letto tutto ) e leggi un altro blocco..

  3. #3
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    un po' di codice

    codice:
    byte[] buffer = new byte[BUFFER_SIZE];
    int readBytes = stream.Read(buffer, 0, BUFFER_SIZE);
    while (readBytes > 0)
    {
           readBytes = stream.Read(buffer, 0, BUFFER_SIZE);
         
           //qui poi fai ciò che ti pare con i byte letti
       
    }

  4. #4
    Chiavi da 600 MB? VVoVe: Guarda che per avere una sicurezza praticamente assoluta basta usare chiavi da 1024 bit (128 byte) con un algoritmo di sicurezza provata (come AES).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Stoicenko: mi spiace, ma non sono sicuro di aver capito il codice che mi hai scritto... sai, sono ancora meno che principiante. Non me lo potresti spiegare un pochino? Grazie mille.

    MItaly: La chiave da 600 MB era un test. E comunque sono noto tra i miei amici per la mia megalomania (fosse per me, 4 GB sarebbero a malapena sufficienti xD)

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Allora:

    codice:
    byte[] buffer = new byte[BUFFER_SIZE]; //crei un buffer di byte, BUFFER_SIZE lo decidi tu (tipo 1024)
    int readBytes = stream.Read(buffer, 0, BUFFER_SIZE); leggi dal filestream il numero di byte da te scelto, readBytes indica se devi ancora leggere qualcosa dal file
    while (readBytes > 0) //c'è ancoera da leggere
    {
    
           //qui poi fai ciò che ti pare con i byte letti tipo criptarli o altro
    
           readBytes = stream.Read(buffer, 0, BUFFER_SIZE); //leggi un nuovo blocco di byte
    }//il ciclo termina quando finisci i byte del file.. a questo punto puoi chiudere lo stream

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Cmq, megalomania o no, una chiave superiore a qualche mega è uno spreco di risorse senza pari..

    E' come mettere ad una cassaforte una portella di 2 kilometri in acciaio.. perfettamente inutile..

    Una kiave di 1 mega anche con algoritmi di bruteforce e un computer molto potente è altamente indecifrabile..

  8. #8
    1 MB? Ma è comunque una chiave inutilmente gigantesca! AES, uno dei migliori e più diffusi algoritmi di criptazione attualmente disponibili, supporta chiavi fino a 256 bit, ossia 32 byte (prima mi ero sbagliato a scrivere 1024 bit), e il governo americano usa chiavi da da 192 o 256 bit per le informazioni classificate come top secret. Devi considerare che un attacco bruteforce ad una chiave di 256 bit richiede fino a 2^256 tentativi, ossia circa 5,65 x 10^73 (5,65 miliardi di miliardi di miliardi di miliardi di miliardi di miliardi di miliardi di miliardi di tentativi); per darti un'idea, se anche per ogni tentativo il PC utilizzasse un singolo ciclo di clock (cosa che non è, ogni tentativo necessita di milioni e milioni di cicli di clock) per provare tutte le 2^256 chiavi su un PC con processore a 3,2 GHz sarebbero necessari più di 10^57 millenni . Ovviamente esistono attacchi di tipo più avanzato (crittanalisi), ma comunque anche usando solo chiavi da 128 bit è praticamente impossibile decrittare i dati senza conoscere la chiave.
    Dai una letta qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    MItaly, ho fatto un corso a scuola sulla crittografia, niente di approfondito ma mi ha convinto che per l'uso quotidiano basterebbe solo qualche byte. Ma rimango megalomane

    E soprattutto, se la tua chiave fosse un film? Non parlarmi di spreco di risorse, perchè tanto lo guardi, e poi puoi passarlo ai tuoi amici con la scusa che sia solo un film, anche se in realtà viene usato come chiave. Cose così. [Due kilometri no... ma con meno di qualche metro non mi sentirei sicuro xD]

    Stoicenko: quindi se ho capito bene per leggere byte per byte potrei usare un solo byte come buffer e leggere in un ciclo for ogni singolo byte, giusto? (A quel punto penso non sarebbe nemmeno conveniente, immagino che valga la pena di leggere almeno qualche KB per volta...)

    Grazie mille dell'aiuto!

  10. #10
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Infatti nel mio esempio leggi BUFFER_SIZE numero di byte alla volta.. ovviamente questo numero è un intero deciso da te.. io usualmente uso 1024 per leggere un Kb alla volta..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.