I got the code all the way down to a single shared cipher routine among all block sizes and table look ups. It's a very small and elegant routine, but requires more array accesses than a flattened special version for each blocksize and cipher direction. Unfortunately this massive decrease in code size increased the time tests by 50%.
I'm going to flatten out all of the combinations to remove roughly 1/3 of all array access calls. My tests show an encryption using 128bit blocks and keys with a cipher mode of ECB takes twice as long as the .NET version. Now I know twice the time isn't the greatest, but in VB terms I believe it's excellent compared to .NET. It all comes down to the lack of direct memory manipulation in VB.
On my machine (2.0 ghz Dothan) a 3 meg array took .NET 147ms and VBCorLib took 302ms. This was using the 128bit block and key size in ECB mode.
So the end is wrapping up for the symmetric ciphers and I should be heading towards the hashes next. That will be an all new adventure!