The System.Security.Cryptography namespace contains a rich set of cryptographic functionality including both symmetric and asymmetric cryptography, hashes, and random number generation.
Most cryptographic operations perform either a computation or a transformation on a large amount of data, so the majority of cryptographic operations are performed as stream-based operations. This model works well for hashes, symmetric encryption, and message-based operations.
These stream-based objects all support a single standard interface for dealing with the data transfer portion of the object. Since all of the objects are built on a standard interface, you can chain together multiple objects (such as a hash object followed by an encryption object), and you can perform multiple operations on the data without needing any intermediate storage for it. The streaming model also allows you to build objects from smaller objects. For example, a combined bulk encryption and hash algorithm can be viewed as a single stream object even though this object might be built by internally creating a set of objects.
In addition to the interface published by each object for supporting the streaming, some objects need to be able to query specific values of the object on their immediate left. For example, a PKCS#1 padding object needs to know the block size of the encryption object on its left in order to get the padding correct.
Asymmetric operations differ from symmetric operations in that they often occur on a fixed buffer size rather than the variable length buffer associated with symmetric operations. Streaming is a factor only when the same operation is used on more than one data input (such as when multiple hashes are signed with the same RSA key). Therefore, asymmetric operations do not use the same streaming model as the symmetric operations use.