Converting Mike Shaffer's VBScript RC4 Encryption Code to C#, Part 2
By Chris Scott
In Part 1 we briefly looked at the VBScript code for Mike Shaffer's RC4 Encryption algorithm. In this part we'll begin our porting of the VBScript code to C# code!
Converting the VBScript Code to C#
Now that we've seen what the VBScript code looks like for the classic ASP version, it is time to convert the function and sub to C#. In my conversion I encountered five "hurdles," which are outlined below.
Hurdle #1: The ASP code uses functions and subroutines but C# uses classes with properties and methods.
To convert the ASP code to C#, it makes sense to create a new C# class file for the code. This allows you to reuse the code in your app and even compile the code to a dll for use in an app without giving the programmer of the app the source code. If you use Visual Studio .NET, this is as easy as right clicking on your Web project and Project/Add New Item... from the menu and then choosing C# Class as the file type and giving it a name. If you are coding with a text editor, you can create the empty class using your favorite text editor.
This class, like all C# classes, will have the following form:
|
Recall that at the beginning of our VBScript code, two arrays are declared and initialized. To do the equivalent in a class, add the following code after the class declaration:
|
All code examined henceforth will be code that appears within the class declaration;
hence, for brevity, future code examples will not include the public class rc4encrypt { ... }
portion...
If you are used to VBScript and are new to C#, you'll probably notice something right away which brings us to...
Hurdle #2: All VBScript variables are of type Variant with subtypes for
all variables. C# requires you to explicitly declare data types for all your variables.
(A great read on VBScript's handling of variables and their types can be found at:
Variables and Values in VBScript!)
In the C# code above, we need to tell the C# compiler that our arrays are
of type int since they will contain integer data. The double brackets
declare an array. The protected keyword is used so that the arrays can be
used within our class or any classes that are derived from our class. You
could use the private keyword instead if you knew that this class wouldn't
be used as a base class for other classes.
Note that in VBScript, the total number of elements in an array is the number
passed to the array declaration plus one so sbox(255) is actually a 256
element array. In C#, when we create our array, we need to tell it the
actual number of elements to use. We'll call this...
Hurdle #3: VBScript arrays and C# arrays are a little bit different.
Before converting the sub and function from VBScript to C#, we'll need
to declare a couple additional protected variables. These protected variables are
only accessible from methods within the class in which they are defined (or in classes
that inherit our rc4encrypt class).
|
In order to allow code external to the class to access these variables, we will need to provide
a property accessor. For this class,
we want to declare two such properties, PlainText and Password, which both
include a set and get part (this makes the properties read/write).
|
These properties will allow us to set the text we want to encrypt and the
password we want to encrypt it with. That is, when using our rc4encrypt class we might
use code like:
|
If you've used COM objects in VBScript code, this format will look familiar.
Now that we have our global arrays and our property accessors
declared, its time to rewrite the RC4Initialize sub. Since the
RC4Initialize method is only used within our class, we declare it as a
private method (which means that only methods from within the rc4encrypt class
can call RC4Initialize):
|
This creates an empty method which accepts a string value that will be the
password we use to encrypt our data. The void keyword specifies this
method will not return any data. Now comes the fun part: converting the meat of the sub to C#! First,
we'll take the following VBScript code:
|
The first line gets the length of the password that is passed to the sub
and sets a variable. Next, we use a for loop to fill up both our arrays
with 256 values. These values are the ASCII character code, using Asc()
for the value computed by the Mid() function.
Unfortunately, C# doesn't have the Mid() and Asc() features that VBScript
has. In Part 3 we'll examine how to overcome this hurdle!




