|
|||||||
| Cerca | Messaggi odierni | Segna come letti |
| Forum microsoft.public.it.dotnet.csharp Newsgroup microsoft.public.it.dotnet.csharp |
![]() |
|
|
Strumenti della discussione | Modalità di visualizzazione |
|
#1
|
|||
|
|||
|
Ciao a tutti,
io devo creare un programma che crypti un file con la chiave pubblica e decrypti lo stesso file con la chiave privata. Sto usando la classe RSACryptoServiceProvider che dovrebbe fare al caso mio. Sono riuscita a creare ed esportare le chiavi publica e privata: /*CODICE*/ RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider(sizekey); SaveKeyInfoAsXml(cryptoProvider, "e:\\pubprivkey.xml", true); SaveKeyInfoAsXml(cryptoProvider, "e:\\pubkey.xml", false); cryptoProvider.Clear(); A questo punto crypto il mio file con il metodo Encrypt e scrivo il mio file cryptato. Il metodo Encrypt lo chiamo ciclicamento su sottoarray di dimensione dipendente dalla chiave (se uso una chiave di 512byte, allora il sottoarray è lungo 23 byte). Al termine scrivo il file su disco. Il problema a questo punto è che il metodo Decrypt non funziona. Se carico l'intero file in un array di byte e lo passo al metodo Decrypt, questo non mi ritorna l'array di byte corretto. Se invece richiamo il metodo Decrypt ciclicamente (come fatto per il metodo encrypt) su sottoarray di 23 byte, mi ritorna un'errore del tipo: "Lunghezza dati non valida". Avete qualche consiglio? Su internet si trovano parecchi esempi ma i metodi encrypt/decrypt vengono richiamati su stringhe di dimensione limitata. Spero in un vostro aiuto. Ciao Sara |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
> Avete qualche consiglio?
> Su internet si trovano parecchi esempi ma i metodi encrypt/decrypt vengono > richiamati su stringhe di dimensione limitata. > Spero in un vostro aiuto. Prova a vedere questo: http://www.dotnetspider.com/resource...ryption-C.aspx > Ciao Prego! ;-) -- Matteo Migliore http://blogs.ugidotnet.org/matteomigliore |
|
#3
|
|||
|
|||
|
ciao Sara,
se hai tempo puoi provate a fare questo test :-) la lunghezza del testo da cryptare *non* dev'essere maggiore della "dimensione del modulo N -11". in questi casi dovresti "spezzarlo" in tanto blocchi "N - 11" quando esegui il decrypt: se il testo cifrato è maggiore della dimensione del modulo N allora spezzi in tanti blocchi della dimensione del modulo N esempio keysize 1024 bits -> dimesnione Modulo N=128 -> 128-11 = 117 il blocco massimo utilizzabile ;-) HTH -- Marcello Cantelmo www.cantelmosoftware.com |
|
#4
|
|||
|
|||
|
oops! ho dimenticato di dire che il valore "11" è il padding necessario che
varia in base all'utilizzo di: OAEP padding (PKCS#1 v2) o Direct Encryption (PKCS#1 v1.5) maggiori info su: http://msdn.microsoft.com/en-us/libr...pt(vs.71).aspx HTH -- Marcello Cantelmo www.cantelmosoftware.com |
|
#5
|
|||
|
|||
|
Grazie Marcello per l'aiuto.
Sia l'encrypt che il decrypt viene eseguito su blocchi di dimensione N-11 (dove N=keysize/8). In realtÃ*** la fase di encrypt non mi da problemi e il file riesco a cryptarlo e scriverlo. Il problema è il decrypt, anche se leggo blocchi di dimensione N-11 ottengo sempre l'errore "Dati non validi". Ti mostro il codice di Encrypt che: - legge il file in ingresso e lo carica in un'array di byte (il file viene letto con in BinaryReader) - spezza l'array di byte in sottoarray di dimensione n-11 e su questo sottoarray richiamo il metodo Encrypt. - unisco tutti gli array risultanti dal metodo Encrypt e li scrivo in base64 su un file. private void EncryptFile( string dataFile, string sigFile ) { RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider(); cryptoProvider.FromXmlString(GetKeyInfoAsXml(pubke y)); byte[] data = LeggiDati(dataFile); //lettura del file EncryptString(cryptoProvider, data, sigFile); cryptoProvider.Clear(); } public void EncryptString(RSACryptoServiceProvider cryptoProvider, byte[] bytes, string filename ) { int maxLength = (sizekey/8)-11; int dataLength = bytes.Length; int iterations = dataLength / maxLength; byte [] totalbytes = new byte[0]; //array con tutto il contenuto del file cryptato for( int i = 0; i <= iterations; i++ ) { byte[] tempBytes = new byte[ ( dataLength - maxLength * i > maxLength ) ? maxLength : dataLength - maxLength * i ]; Buffer.BlockCopy( bytes, maxLength * i, tempBytes, 0, tempBytes.Length ); byte[] encryptedBytes = cryptoProvider.Encrypt( tempBytes, false ); //caricamento di totalbyte } ScriviDatiB64(filename, totalbytes); //Scrittura dati su file (in base64) } Il metodo di Decrypt all'inverso si occupa di: - leggere il file cryptato e scritto in base 64 - converto l'array da base64 in array di byte - spezza l'array di byte in sottoarray di dimensione n-11 e su questo sottoarray richiamo il metodo Decrypt - unisco tutti gli array risultanti dal metodo Decrypt e scrivo il file. private void VerifyFile( string dataFile, string sigFile ) { RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider(); cryptoProvider.FromXmlString(GetKeyInfoAsXml(pubpr ivkey)); byte[] dati = LeggiDatiB64(sigFile); //lettura file base64 e conversione dati DecryptString(cryptoProvider, dati, dataFile); cryptoProvider.Clear(); } public void DecryptString(RSACryptoServiceProvider cryptoProvider, byte [] bytes, string filename) { int maxLength = (sizekey/8)-11; int dataLength = bytes.Length; int iterations = dataLength / maxLength; byte [] totalbytes = new byte[0]; for( int i = 0; i <= iterations; i++ ) { byte[] tempBytes = new byte[ ( dataLength - maxLength * i > maxLength ) ? maxLength : dataLength - maxLength * i ]; Buffer.BlockCopy( bytes, maxLength * i, tempBytes, 0, tempBytes.Length ); byte[] encryptedBytes = cryptoProvider.Decrypt( tempBytes, false ); //<<<QUI VA IN ERRORE!!! ..... //unione array in totalbytes } ScriviDati(filename, totalbytes); } Ma quando richiamo il metodo Decrypt sul sottoarray di 117 byte (la mia keysize è di 1024) va in errore con il seguente errore: "CryptographicException: Dati non validi". Il problema è che non so se l'errore sta nel metodo di Encrypt o di Decrypt. Ho provato anche ad evitare la scrittura del file cryptato in base64, ma il risultato non cambia. Tu che ne dici? Grazie mille per l'aiuto. Ciao Sara "Marcello Cantelmo" ha scritto: > ciao Sara, > > se hai tempo puoi provate a fare questo test :-) > > la lunghezza del testo da cryptare *non* dev'essere maggiore della > "dimensione del modulo N -11". in questi casi dovresti "spezzarlo" in tanto > blocchi "N - 11" > > quando esegui il decrypt: se il testo cifrato è maggiore della dimensione > del modulo N allora spezzi in tanti blocchi della dimensione del modulo N > > esempio keysize 1024 bits -> dimesnione Modulo N=128 -> 128-11 = 117 il > blocco massimo utilizzabile ;-) > > HTH > -- > Marcello Cantelmo > www.cantelmosoftware.com |
|
#6
|
|||
|
|||
|
Ho trovato l'errore!!
Praticamente nel decrypt la lunghezza del sottoarray è semplicemente N (dove N =keysize/8) e non N -11 Praticamente quando richiamo l'encrypt di un'array di byte di lunghezza <= (N-11), ottengo sempre un'array di dimensione N. Quindi il decrypt deve essere richiamato su sottoarray di dimensione N per ottenere l'array di byte di dimensione N-11. Magari vedo di postare il codice su un blog. Vi faccio sapere dove si può trovare. Ciao e ancora grazie per l'aiuto. Sara |
|
#7
|
|||
|
|||
|
ciao Sara,
infatti nel mio post avevo scritto: "quando esegui il decrypt: se il testo cifrato è maggiore della dimensione del modulo N allora spezzi in tanti blocchi della dimensione del modulo N" ;-) HTH -- Marcello Cantelmo www.cantelmosoftware.com |
|
#8
|
|||
|
|||
|
hai ragione, non avevo letto bene in effetti!!
Grazie mille! Qui ho postato il codice http://community.ugiss.org/blogs/sara978/default.aspx Ciao Sara "Marcello Cantelmo" ha scritto: > ciao Sara, > > infatti nel mio post avevo scritto: > > "quando esegui il decrypt: se il testo cifrato è maggiore della dimensione > del modulo N allora spezzi in tanti blocchi della dimensione del modulo N" > ;-) > > HTH > -- > Marcello Cantelmo > www.cantelmosoftware.com > > > |
|
#9
|
|||
|
|||
|
ciao Sara,
sono contento che hai risolto il problema e che mi hai citato a fine post. grazie 1k! :-I ...mi imbarazzo facilmente! :-D ora, tornando a noi (sempre il solito monotematico...security), una domanda: come usi tale tecnica (web, dati persanli, protezione software) ? perchè ti sarai sicuramente resa conto per decryptare devi "mandare in giro" la chiave privata e questo proprio non va bene!!!! la chiave privata per nessuna ragione dev'essere resa pubblica!!!! ciao -- Marcello Cantelmo www.cantelmosoftware.com |
|
#10
|
|||
|
|||
|
Ciao Marcello,
di niente, figurati! Sinceramente alla security non c'ho pensato molto, il problema che ora sto riscontrando è dovuto alle performance. Io ho ottimizzato il codice è nella fase di cifratura riesco a cifrare un file di circa 53 mb in 2 minuti. Il problema è nella fase di estrazione del file originale che i tempi peggiorano tantissimo e per decifrare lo stesso file di 53 mb ci impiego quasi un'ora. Come può essere? Un'altra domanda....l'algoritomo RSA dovrebbe funzionare cosi: Ho il File Originale -> Uso Chiave Pubblica per cifrarlo -> Ottengo il File Cifrato Ho il File Cifrato -> Uso Chiave Privata per decifrarlo -> Ottengo il File Originale perchè per decifrare il mio file criptato invece devo passare alla classe RSACryptoServiceProvider tutta la stringa con chiave publica e privata? C'è qualcosa che non mi torna, forse è per questo che ci impiega cosi tanto a decifrare un file. Grazie ancora per l'aiuto. Ciao Sara "Marcello Cantelmo" ha scritto: > ciao Sara, > > sono contento che hai risolto il problema e che mi hai citato a fine post. > grazie 1k! :-I ...mi imbarazzo facilmente! :-D > > ora, tornando a noi (sempre il solito monotematico...security), una domanda: > come usi tale tecnica (web, dati persanli, protezione software) ? > > perchè ti sarai sicuramente resa conto per decryptare devi "mandare in giro" > la chiave privata e questo proprio non va bene!!!! la chiave privata per > nessuna ragione dev'essere resa pubblica!!!! > > ciao > -- > Marcello Cantelmo > www.cantelmosoftware.com |
|
#11
|
|||
|
|||
|
> Ciao Marcello,
> di niente, figurati! ciao, > Sinceramente alla security non c'ho pensato molto, il problema che ora sto > riscontrando è dovuto alle performance. ok > Io ho ottimizzato il codice è nella fase di cifratura riesco a cifrare un > file di circa 53 mb in 2 minuti. Il problema è nella fase di estrazione del > file originale che i tempi peggiorano tantissimo e per decifrare lo stesso > file di 53 mb ci impiego quasi un'ora. certo! il tempo diventa esponenziale :-o ...la potenza dei "numeri primi" e dell'aritmetica modulare! :-) ecco perchè, anche, la fattorizzazione del modulo N (N=P*Q...quindi risalire ai numeri primi P e Q) è pressochè intrattabile con le attuali macchine adoperare RSA per file di quelle dimensioni è "follia allo stato puro". secondo me faresti meglio a proteggere con RSA una "chiave" che utilizzerai con i metodi tradizionali a chiave simmetrica: des, 3des, ect. però poi, ti sei resa conto, della vulnerabilitÃ*** di mandare in giro la chiave privata > Come può essere? la matematica *non* è un opinione :-) ...l'algoritmo originale è questo: c= m^e mod N c=testo cifrato (convertito in numero) m=testo da cifrare (convertito in numero) e=esponente pubblico=65537 N=modulo N e per decifrare: m=c^d mod N m=testo normale c=testo cifrato d=esponente privato (e tale deve rimanere) N=modulo N e poi ci sono alcune "scorciatoie matematiche" per velocizzare il tutto ;-) - chinese reminder theorem; - ect. ect. > Un'altra domanda....l'algoritomo RSA dovrebbe funzionare cosi: > Ho il File Originale -> Uso Chiave Pubblica per cifrarlo -> Ottengo il File > Cifrato > Ho il File Cifrato -> Uso Chiave Privata per decifrarlo -> Ottengo il File > Originale ok > perchè per decifrare il mio file criptato invece devo passare alla classe > RSACryptoServiceProvider tutta la stringa con chiave publica e privata? > C'è qualcosa che non mi torna, forse è per questo che ci impiega cosi tanto > a decifrare un file. per come è stato implementato RSA è comodo se devi proteggere tuoi dati personali...non di certo protezione software, et-simili potresti anche pensare di utilizzare RSA al contrario...che in questo caso si "riduce" ad una verifica della chiave...ma in .NET il check lo fa lui e ti ritorna un banale vero/falso che si cracca in 5 secondi! > Grazie ancora per l'aiuto. > Ciao > Sara HTH --- Marcello Cantelmo www.cantelmosoftware.com |
|
#12
|
|||
|
|||
|
Ciao Marcello,
ok ho capito. Siamo arrivati alla decisione di usare l'algoritmo RSA per piccoli file (fisseremo un limite) e per tutto il resto useremo un algoritmo AES. Per quanto riguarda la chiave privare (RSA), per ora verrÃ*** salvata nel nostro database sql (che terrÃ*** una specie di storico delle chiavi) e verrÃ*** esportata quando necessario in un file xml per essere consegnata al cliente che dovrÃ*** decrittografare i suoi documenti. Il file xml verrÃ*** messo in una chiave usb e consegnata di persona al cliente. Per ora dovrebbe andare cosi. Ciao e grazie. Sara "Marcello Cantelmo" ha scritto: > > Ciao Marcello, > > di niente, figurati! > > ciao, > > > Sinceramente alla security non c'ho pensato molto, il problema che ora sto > > riscontrando è dovuto alle performance. > > ok > > > Io ho ottimizzato il codice è nella fase di cifratura riesco a cifrare un > > file di circa 53 mb in 2 minuti. Il problema è nella fase di estrazione del > > file originale che i tempi peggiorano tantissimo e per decifrare lo stesso > > file di 53 mb ci impiego quasi un'ora. > > certo! il tempo diventa esponenziale :-o ...la potenza dei "numeri > primi" e dell'aritmetica modulare! :-) > > ecco perchè, anche, la fattorizzazione del modulo N (N=P*Q...quindi > risalire ai numeri primi P e Q) è pressochè intrattabile con le attuali > macchine > > adoperare RSA per file di quelle dimensioni è "follia allo stato puro". > secondo me faresti meglio a proteggere con RSA una "chiave" che > utilizzerai con i metodi tradizionali a chiave simmetrica: des, 3des, ect. > > però poi, ti sei resa conto, della vulnerabilitÃ*** di mandare in giro la > chiave privata > > > Come può essere? > > la matematica *non* è un opinione :-) ...l'algoritmo originale è questo: > > c= m^e mod N > > c=testo cifrato (convertito in numero) > m=testo da cifrare (convertito in numero) > e=esponente pubblico=65537 > N=modulo N > > e per decifrare: > > m=c^d mod N > > m=testo normale > c=testo cifrato > d=esponente privato (e tale deve rimanere) > N=modulo N > > e poi ci sono alcune "scorciatoie matematiche" per velocizzare il tutto ;-) > > - chinese reminder theorem; > - ect. ect. > > > Un'altra domanda....l'algoritomo RSA dovrebbe funzionare cosi: > > Ho il File Originale -> Uso Chiave Pubblica per cifrarlo -> Ottengo il File > > Cifrato > > Ho il File Cifrato -> Uso Chiave Privata per decifrarlo -> Ottengo il File > > Originale > > ok > > > perchè per decifrare il mio file criptato invece devo passare alla classe > > RSACryptoServiceProvider tutta la stringa con chiave publica e privata? > > C'è qualcosa che non mi torna, forse è per questo che ci impiega cosi tanto > > a decifrare un file. > > per come è stato implementato RSA è comodo se devi proteggere tuoi dati > personali...non di certo protezione software, et-simili > > potresti anche pensare di utilizzare RSA al contrario...che in questo > caso si "riduce" ad una verifica della chiave...ma in .NET il check lo > fa lui e ti ritorna un banale vero/falso che si cracca in 5 secondi! > > > Grazie ancora per l'aiuto. > > Ciao > > Sara > > HTH > > --- > Marcello Cantelmo > www.cantelmosoftware.com > |
|
#13
|
|||
|
|||
|
Visto che ci sono, quale classe bisogna usare per crittografare con
l'algoritmo AES? Grazie ancora per l'aiuto. Ciao Sara |
|
#14
|
|||
|
|||
|
che cosa fa la tua applicazione? che tipo di dati stai proteggendo?
e poi...chi controlla il controllore? :-/ fai in modo che sia il cliente a generare le chiavi! questo per una tua tranquillitÃ***...a me darebbe molto fastidio se qualcun altro fosse a conoscenza delle mie *chiavi private* ciao -- Marcello Cantelmo www.cantelmosoftware.com |
|
#15
|
|||
|
|||
|
3des, rijndael ...però poi ci sono altri problemi di vulnerabilitÃ*** ;-) fammi capire meglio che cosa devi proteggere ciao -- Marcello Cantelmo www.cantelmosoftware.com |
|
#16
|
|||
|
|||
|
Il nostro prodotto è un programma di conservazione sostitutiva che produce un
cd/dvd con i documenti conservati e un file mdb contenente le informazioni di questi documenti conservati. Praticamente il programma di conservazione sostitutiva deve crittografare tutti i documenti conservati con l'algoritmo RSA (sono file di piccole dimensioni) e il file MDB verrÃ*** crittografato con un'algoritmo AES. All'interno del CD o DVD prodotto è presente un'altro programma di verifica, che permetterÃ*** all'utente di decrittografare i documenti e leggere i dati contenuti nell'mdb. Solitamente il programma di conservazione sostitutiva viene installata da un nostro cliente (C1) che a sua volta esegue conservazioni di documenti per conto dei suoi clienti. Quindi C1 genera la chiave pubblica e privata, conserva i documenti (crittografandoli con la chiave pubblica) e produce il cd/dvd. A tal punto consegna al suo cliente il cd/dvd e la relativa chiave privata per decrittografare i documenti in esso contenuti. Quindi putroppo non è possibile far generare la chiave privata direttamente al cliente finale. Quindi per implementare un algoritmo AES devo usare la classe TripleDESCryptoServiceProvider oppure Rijndael? Grazie per l'aiuto. Ciao Sara "Marcello Cantelmo" ha scritto: > che cosa fa la tua applicazione? che tipo di dati stai proteggendo? > > e poi...chi controlla il controllore? :-/ > > fai in modo che sia il cliente a generare le chiavi! > > questo per una tua tranquillitÃ***...a me darebbe molto fastidio se qualcun > altro fosse a conoscenza delle mie *chiavi private* > > ciao > -- > Marcello Cantelmo > www.cantelmosoftware.com > |
|
|
|
|
![]() |
| Tags: chiave, cryptare, file, rsa |
| Strumenti della discussione | |
| Modalità di visualizzazione | |
|
|
Discussioni simili
|
||||
| Discussione | Ha iniziato questa discussione | Forum | Repliche | Ultimo messaggio |
| crittografia file chiave usb | Massimo | Forum microsoft.public.it.windows.vista | 3 | 01-17-2009 06:06 PM |
| copia di file su chiave USB | =?Utf-8?B?TWF1cml6aW8=?= | Forum microsoft.public.it.scripting | 1 | 10-20-2007 10:14 PM |
| mettere un file doc sotto chiave | 6240 | Forum microsoft.public.it.office.word | 1 | 06-29-2007 09:57 AM |
| Cryptare/Decriptare Stringa con Password | Giuseppe | Forum microsoft.public.it.dotnet.vb | 1 | 02-09-2005 08:19 AM |
| Cryptare contenuto tabella all'occorrenza | FabrizioB. | Forum microsoft.public.it.office.access | 3 | 07-30-2004 11:56 AM |