Oppure

Loading
03/02/09 15:58
klez91
Ciao a tutti...ultimamente mi sono dedicato alla crittografia dei file. Per quanto riguarda crittografarli non ci sono problemi, il problema giunge nel momento di decrittografarli, infatti il compilatore mi dice il seguente errore <<Lunghezza dei dati da decrittografare non valida.>> L'algoritmo di cifratura e il sorgente del programma è identico a quello pubblicato sul sito di Totem qui totem.altervista.org/guida/versione2/… . Ovviamente escludo errori di immissione della password, e la riga di codice evidenziata è
Output = Decryptor.TransformFinalBlock(Data, 0, Data.Length)
Ringrazio per un'eventuale aiuto...ciao :k:
Ultima modifica effettuata da klez91 03/02/09 16:02
aaa
03/02/09 19:11
Il Totem
C'è probabilmente un errore nella pagina (non me ne ero accorto), perciò mi servirebbe vedere il tuo sorgente.
aaa
03/02/09 19:38
klez91
Il sorgente delle principali funzioni è questo:
    Private SaltBytes As Byte() = New Byte() {162, 21, 92, 34, 27, 239, 64, 30, 136, 102, 223}

    Private IV32 As Byte() = New Byte() {133, 206, 56, 64, 110, 158, 132, 22, _
    99, 190, 35, 129, 101, 49, 204, 248, 251, 243, 13, 194, 160, 195, 89, 152, _
    149, 227, 245, 5, 218, 86, 161, 124}


    Private Function DerivePassword(ByVal Key As String) As Byte()
        Dim Derive As Rfc2898DeriveBytes
        Dim DerivedBytes() As Byte
        Derive = New Rfc2898DeriveBytes(Key, SaltBytes, 5)
        DerivedBytes = Derive.GetBytes(32)
        Return DerivedBytes
    End Function

    Public Function RijndaelEncrypt(ByVal Key As String, ByVal Text() As Byte) As Byte()
        Dim Provider As New RijndaelManaged
        Dim BytePassword As Byte()
        Dim Encryptor As ICryptoTransform
        Dim Output As Byte()
        Dim Input As Byte() = Text
        Provider.KeySize = 256
        Provider.BlockSize = 256
        BytePassword = DerivePassword(Key)
        Encryptor = Provider.CreateEncryptor(BytePassword, IV32)
        Output = Encryptor.TransformFinalBlock(Input, 0, Input.Length)
        Provider.Clear()
        Encryptor.Dispose()
        Return Output
    End Function

    Public Function RijndaelDecrypt(ByVal Key As String, ByVal Data() As Byte) As Byte()
        Dim Provider As New RijndaelManaged
        Dim BytePassword As Byte()
        Dim Decryptor As ICryptoTransform
        Dim Output As Byte()
        Provider.KeySize = 256
        Provider.BlockSize = 256
        BytePassword = DerivePassword(Key)
        Decryptor = Provider.CreateDecryptor(BytePassword, IV32)
        Output = Decryptor.TransformFinalBlock(Data, 0, Data.Length) 'Qui mi da l'errore...
        Provider.Clear()
        Decryptor.Dispose()
        Return Output
    End Function

Volevo dire inoltre che x piccole stringhe di testo in programma funge, il problema sussiste solo quando vado a decrittografare un file... boh cmq grazie x l'aiuto....
Ultima modifica effettuata da klez91 03/02/09 19:39
aaa
04/02/09 17:06
Il Totem
Controlla che Data.Length non sia 0. Controlla inoltre che la lettura sia coerente e restituisca un messaggio integro, e che non si fermi per eventuali byte nulli (se usi ad esempio streamreader o networkstream per la lettura).
aaa
04/02/09 20:12
klez91
Eh si hai ragione...mi sono accorto che quando andavo ad aprire il file crittografato e lo inserivo in una array di byte, l'array conteneva un byte in più rispetto alle reali dimensioni del file e x questo mi dava l'errore...Ti ringrazio molto per l'aiuto.
Però adesso vorrei approfittarne per farti uan piccola domanda, scusami se è un po off-topic, è consigliabile utilizzare qst algoritmo anche x lo scambio protetto di dati in una connessione diretta client-server, e se si come potrei proteggere la pass in modo da evitare che venga letta disassemblando l'exe ???
aaa
05/02/09 17:17
Il Totem
Rinjdael è un algoritmo abbastanza pesante, perchè usa blocchi e chiavi da 256bit, e per operazioni che richiedono lo scambio di messaggi in rete sarebbe necessario un algoritmo, magari un po' meno sicuro, ma più veloce, come DES o 3DES. Ricorda, inoltre, che i dati crittografati possono assumere anche una dimensione maggiore dei dati di input, e ciò non giova certo a uno scambio in rete.

Le password vengono lette o inviate dal programma a runtime (risiedono quindi nella memoria RAM), mentre la disassemblazione permette solo di vedere il codice, come file di testo fisico. Sono, perciò, due ambiti che non c'entrano l'uno con l'altro, anche se è possibile che si ricompili il progetto con un IDE e si usi un breakpoint per fermare l'esecuzione del programma e guardare la password. Ma questo può essere fatto solo sulla macchina dell'eventuale cracker, al quale non credo interessi molto craccare la propria password.
Un altro attacco che può essere scagliato per rintracciare una password è una scansione della RAM assegnata al processo, il che potrebbe individuare le stringhe usate come variabili temporanee. Il modo per sbarazzarsi il più rapidamente possibile di tali stringhe è usare un oggetto SecureString, come ho fatto nel mio programma KeyGuard3. SecureString viene convertito in stringa reale solo il tempo necessario al confronto della password, e tale stringa viene poi eliminata tramite l'uso di puntatori.
aaa
05/02/09 17:34
klez91
Per l'algoritmo credo che userò il DES, perchè preferisco mantenere una certa velocità di scambio dei dati...per quanto riguarda la password invece io intendevo dare la possibilità all'utente di scegliere se impostare una connessione portetta o meno, e se la scelta ricadeva su quella protetta i messaggi venivano criptati secondo una password scelta da me ed inserita sia nel client che nel server in modo da risparmiare la scocciatura all'utente di cominicare ogni volta al server la password scelta...Il problema quindi sta nel nasconere la password nel programma già compilato in modo da evitare che qualke utente malintenzionato la possa leggere disassemblando l'exe...Non so se mi sono spiegato bene, la connessione protetta dovrebbe avvenire tutto in automatico....
Ultima modifica effettuata da klez91 05/02/09 17:36
aaa
06/02/09 14:57
Il Totem
Forse non hai ben afferrato: se la nascondi nel programma già compilatio (ossia come stringa), E' VISIBILE mediante disassembler, sempre. Anche se la crittassi e usassi un codice molto complesso per decifrarla a runtime, chiunque potrebbe vedere lo stesso codice e quindi ottenere la password. Usare una sola password incorporata nell'eseguibile è sicuramente uno dei provvedimenti da NON prendere per migliorare la sicurezza dell'applicazione.
aaa