Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Vb.Net Crittografare un file
Forum - C# / VB.NET - Vb.Net Crittografare un file

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:58
Martedì, 03/02/2009
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 http://totem.altervista.org/guida/versione2/D7.php . Ovviamente escludo errori di immissione della password, e la riga di codice evidenziata è
Codice sorgente - presumibilmente Plain Text

  1. Output = Decryptor.TransformFinalBlock(Data, 0, Data.Length)

Ringrazio per un'eventuale aiuto...ciao :k:

Ultima modifica effettuata da klez91 il 03/02/2009 alle 17:02
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:11
Martedì, 03/02/2009
C'è probabilmente un errore nella pagina (non me ne ero accorto), perciò mi servirebbe vedere il tuo sorgente.

PM Quote
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 20:38
Martedì, 03/02/2009
Il sorgente delle principali funzioni è questo:
Codice sorgente - presumibilmente VB.NET

  1. Private SaltBytes As Byte() = New Byte() {162, 21, 92, 34, 27, 239, 64, 30, 136, 102, 223}
  2.  
  3.     Private IV32 As Byte() = New Byte() {133, 206, 56, 64, 110, 158, 132, 22, _
  4.     99, 190, 35, 129, 101, 49, 204, 248, 251, 243, 13, 194, 160, 195, 89, 152, _
  5.     149, 227, 245, 5, 218, 86, 161, 124}
  6.  
  7.  
  8.     Private Function DerivePassword(ByVal Key As String) As Byte()
  9.         Dim Derive As Rfc2898DeriveBytes
  10.         Dim DerivedBytes() As Byte
  11.         Derive = New Rfc2898DeriveBytes(Key, SaltBytes, 5)
  12.         DerivedBytes = Derive.GetBytes(32)
  13.         Return DerivedBytes
  14.     End Function
  15.  
  16.     Public Function RijndaelEncrypt(ByVal Key As String, ByVal Text() As Byte) As Byte()
  17.         Dim Provider As New RijndaelManaged
  18.         Dim BytePassword As Byte()
  19.         Dim Encryptor As ICryptoTransform
  20.         Dim Output As Byte()
  21.         Dim Input As Byte() = Text
  22.         Provider.KeySize = 256
  23.         Provider.BlockSize = 256
  24.         BytePassword = DerivePassword(Key)
  25.         Encryptor = Provider.CreateEncryptor(BytePassword, IV32)
  26.         Output = Encryptor.TransformFinalBlock(Input, 0, Input.Length)
  27.         Provider.Clear()
  28.         Encryptor.Dispose()
  29.         Return Output
  30.     End Function
  31.  
  32.     Public Function RijndaelDecrypt(ByVal Key As String, ByVal Data() As Byte) As Byte()
  33.         Dim Provider As New RijndaelManaged
  34.         Dim BytePassword As Byte()
  35.         Dim Decryptor As ICryptoTransform
  36.         Dim Output As Byte()
  37.         Provider.KeySize = 256
  38.         Provider.BlockSize = 256
  39.         BytePassword = DerivePassword(Key)
  40.         Decryptor = Provider.CreateDecryptor(BytePassword, IV32)
  41.         Output = Decryptor.TransformFinalBlock(Data, 0, Data.Length) 'Qui mi da l'errore...
  42.         Provider.Clear()
  43.         Decryptor.Dispose()
  44.         Return Output
  45.     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 il 03/02/2009 alle 20:39
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:06
Mercoledì, 04/02/2009
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).

PM Quote
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 21:12
Mercoledì, 04/02/2009
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 ???

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:17
Giovedì, 05/02/2009
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.

PM Quote
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:34
Giovedì, 05/02/2009
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 il 05/02/2009 alle 18:36
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:57
Venerdì, 06/02/2009
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.

PM Quote
Avatar
klez91 (Normal User)
Pro


Messaggi: 117
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:23
Lunedì, 09/02/2009
Ah si lo avevo immaginato, però stavo pensando a programmi come msn, dove spuntando la casella "Salva password" creano una password crtittografata nel registro di sistema...anche se vabbè in ogni caso esistono sempre programmi in grado di decrittografarla...Cmq grazie mille x l'aiuto...ciao :k:

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo