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.