Come
la maggior parte delle altre classi, Cryptography
supporta lo streaming. Streaming non è niente altro che un modo per
leggere e scrivere informazioni in modalità sincrona ("Chiama
ed aspetta") o in modalità asincrona ("Spara e
Dimentica"). Come le operazioni criptografiche, sappiamo che il
processo può richiedere, in base alla dimensione del messaggio o della chiave,
diverso tempo. Di conseguenza, la maggior parte delle classi Cryptography mettono a disposizione un modo per avere lo
stream del risultato delle loro operazioni.
La classe CryptoStream deriva dalla classe Stream dello spazio di nomi System.IO, quindi tutti i
metodi previsti da uno stream sono disponibili (.Read,Write() ed altro ancora).
Inoltre, dovunque venga eseguito un oggetto Stream, questo si può
sostituire con CryptoStream. CryptoStream definisce i seguenti costruttori.
public CryptoStream(Stream stream, ICryptoTransform transform,
CryptoStreamMode mode);
Visto che il primo parametro è di tipo
Stream, è possibile concatenarlo con un altro oggetto Stream based. Questo
risulta utile quando si vuole avere lo stream del risultato da una operazione di
Criptography ad un altra (per esempio, il risultato
di un algoritmo di hash allo stream di un oggetto
algoritmico).
Il secondo parametro deve implementare
l'interfaccia ICryptoTransform.
HashAlgorithm implementa questa intefaccia, rendendo disponibili i valori di
ritorno dai metodi, CreateEncryptor() e CreateDecryptor(), disponibili nelle classi
simmetriche e asimmetriche.
CryptoStreamMode è un enumeratore che
definisce due valori - Read e Write - questi possono essere
utilizzati unicamente quando viene chiamato il costruttore
CryptoStream.
L'esempio che segue dimostra l'hashing del
contenuto di un file. Per prima cosa dobbiamo aprire un file localizzato
all'interno del disco attraverso l'oggetto FileStream. Successivamente, dobbiamo
leggere l'interno contenuto dei file, e ricavare il risultato del valore di Hash
utilizzando la classe SHA512Managed.
String adPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
FileStream fin = new FileStream(adPath + @"\somefilein.txt",
FileMode.Open, FileAccess.Read);
FileStream fhashed = new FileStream(adPath + @"\somefileout.txt",
FileMode.OpenOrCreate, FileAccess.Write);
SHA512 sha = new SHA512Managed();
CryptoStream csSHA = new CryptoStream(fin,
sha, CryptoStreamMode.Read);
byte[] finData = new byte[fin.Length];
csSHA.Read(finData, 0, (int)fin.Length);
fhashed.Write(sha.Hash, 0, (int)sha.Hash.Length);
fhashed.Close();
Utilizzando la proprietà
ApplicationBase per determinare la directory dove il file
risiende, il File somefilein.txt deve necessariamente essere nella
stessa cartella dove è localizzato l'assembly contenente il codice di
esecuzione.
Completamente d'accordo del fatto che
questo possa sembrare un lavoro extra a differenza effettuare direttamente
la chiamata del metodo ComputeHash() dell'instanza SHA512 (sha). Avremmo potuto
farlo, andando quindi ad ottenere il valore di hash dal valore di ritorno del
metodo. Ma se tutto quello di cui si ha bisogno è effettuare hash
d'informazioni, è suggeribile il non utilizzo della classe
CryptoStream.