By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,496 Members | 1,517 Online
Bytes IT Community
Submit an Article
Got Smarts?
Share your bits of IT knowledge by writing an article on Bytes.

AES Encryption Algorithm for VBA and VBScript

Rabbit
Expert Mod 10K+
P: 12,374
Introduction
The Advanced Encryption Standard is the algorithm that won the National Insitute of Standards and Technology's (NIST) search for a standardized encryption algorithm in 2001. In 2002, it was adopted by the U.S. government as a stadard for encryption. It is based on the Rijndael algorithm.

Even though it was chosen by NIST, it was not the strongest algorithm that was available. Both the Twofish and Serpent algorithms offer more security. AES was chosen because of it's speed when implemented in hardware or software.

What is AES?
AES is a block cipher. This means that it encrypts groups of bytes at a time. In this case, 16 bytes at a time. Generally, block ciphers are more secure than stream ciphers because they obfuscate the location of original bytes.

It is a secret key algorithm, which means that it uses a key that should only be known by the intended sender and recipient. A major problem with this is the secure transmission of the key. Public key cryptography solves this by using so called "hard" math where calculating in one direction is easy while solving in the opposite direction takes much much longer. One example is multiplication vs factorization. Multiplying two numbers is easy but attempting to find the two numbers used to get that number takes a long time. This type of "hard" math allows you to transmit public information that the sender and recipient uses to compute a key without having to transmit a key. So why isn't public key cryptography used exclusively? It is a lot slower than secret key cryptograpy.

General Weaknesses of Cryptography
A weakness of cryptography is that they can be hacked using brute force. This means that a message can stay a secret only for as long as it takes a computer to try every password until it finds the one you used. Each byte that you add to a password means that it will take roughly 256 times longer to crack your password. So the question is, how long do you need that message to stay a secret?

Now, that isn't actually a weakness of the algorithm per se. An actual weakness is that many algorithms are subject to mathematical analysis that may reveal what key was used to encrypt the data. Given enough encrypted data using the same or similar keys will result in a crack quicker than it would take using brute force. One way to mitigate this is the use of a nonce, initialization vector, or salt. They are basically random bits that are used with the key so that even though you are using the same key, each message is different because the random bits in effect change the key that is used.

This is why you should choose a longer password and why you should change your passwords often.

How AES works
AES encodes 16 bytes of data at a time and runs through its algorithm for a specified number of rounds depending on how many bits of strength you need. AES can use 128, 194, or 256-bits. The sample implementation below is the 256 bit version.

It first creates round keys by expanding the original key using the Rijndael key scheduler algorithm. It then encrypts the block by substituting bytes using the Rijndael S-box, shifting bytes, diffusing bytes using a Galois field, and adding the round key. In the 256-bit version, this is done 14 times. It does this for each 16 byte block of data.

Specific Weaknesses of AES
Currently, the best known attack against AES is a related-key attack. A related-key attack is when you have ciphertexts that are encoded using similar keys, i.e., if you encode a text using the password "Password1" and then encode a text using the password "Password2". This is due to AES's simple key scheduler. However, the attack is infeasible and would take much too long to be of any use when using the 256-bit version of AES.

Sample Implementation of AES
This is a function that works in many VB implementations. It even works in a Visual Basic Script and was, in fact, coded specifically for VBScript. But it should be directly portable to VBA. I validated the results against the National Institute of Standards and Technology's test files. The function below is used to encrypt files but can be modified to accept other data.

This implementation inlines many of the functions that would make the implementation easier to read. This was done for speed. It also runs in Electronic Codebook Mode (ECM) which is the most insecure of the modes but is the easiest to understand and implement. I will work on a cipher-block chaining mode (which is the recommended implementation) and post the code when that's done.

Basically, ECM does not vary anything as each block is encoded so if the same block is encoded, the results will be the same. CBC solves this by XORing the resulting ciphertext with the next block of plaintext. Therefore, even if the same block is encoded twice, the results will be different.
Expand|Select|Wrap|Line Numbers
  1. Sub AES(sFile)
  2.     Dim sbox, sboxinv, rcon
  3.     Dim g2, g3, g9, g11, g13, g14
  4.  
  5.     g2 = Array( _
  6.         &h00,&h02,&h04,&h06,&h08,&h0a,&h0c,&h0e,&h10,&h12,&h14,&h16,&h18,&h1a,&h1c,&h1e, _
  7.         &h20,&h22,&h24,&h26,&h28,&h2a,&h2c,&h2e,&h30,&h32,&h34,&h36,&h38,&h3a,&h3c,&h3e, _
  8.         &h40,&h42,&h44,&h46,&h48,&h4a,&h4c,&h4e,&h50,&h52,&h54,&h56,&h58,&h5a,&h5c,&h5e, _
  9.         &h60,&h62,&h64,&h66,&h68,&h6a,&h6c,&h6e,&h70,&h72,&h74,&h76,&h78,&h7a,&h7c,&h7e, _
  10.         &h80,&h82,&h84,&h86,&h88,&h8a,&h8c,&h8e,&h90,&h92,&h94,&h96,&h98,&h9a,&h9c,&h9e, _
  11.         &ha0,&ha2,&ha4,&ha6,&ha8,&haa,&hac,&hae,&hb0,&hb2,&hb4,&hb6,&hb8,&hba,&hbc,&hbe, _
  12.         &hc0,&hc2,&hc4,&hc6,&hc8,&hca,&hcc,&hce,&hd0,&hd2,&hd4,&hd6,&hd8,&hda,&hdc,&hde, _
  13.         &he0,&he2,&he4,&he6,&he8,&hea,&hec,&hee,&hf0,&hf2,&hf4,&hf6,&hf8,&hfa,&hfc,&hfe, _
  14.         &h1b,&h19,&h1f,&h1d,&h13,&h11,&h17,&h15,&h0b,&h09,&h0f,&h0d,&h03,&h01,&h07,&h05, _
  15.         &h3b,&h39,&h3f,&h3d,&h33,&h31,&h37,&h35,&h2b,&h29,&h2f,&h2d,&h23,&h21,&h27,&h25, _
  16.         &h5b,&h59,&h5f,&h5d,&h53,&h51,&h57,&h55,&h4b,&h49,&h4f,&h4d,&h43,&h41,&h47,&h45, _
  17.         &h7b,&h79,&h7f,&h7d,&h73,&h71,&h77,&h75,&h6b,&h69,&h6f,&h6d,&h63,&h61,&h67,&h65, _
  18.         &h9b,&h99,&h9f,&h9d,&h93,&h91,&h97,&h95,&h8b,&h89,&h8f,&h8d,&h83,&h81,&h87,&h85, _
  19.         &hbb,&hb9,&hbf,&hbd,&hb3,&hb1,&hb7,&hb5,&hab,&ha9,&haf,&had,&ha3,&ha1,&ha7,&ha5, _
  20.         &hdb,&hd9,&hdf,&hdd,&hd3,&hd1,&hd7,&hd5,&hcb,&hc9,&hcf,&hcd,&hc3,&hc1,&hc7,&hc5, _
  21.         &hfb,&hf9,&hff,&hfd,&hf3,&hf1,&hf7,&hf5,&heb,&he9,&hef,&hed,&he3,&he1,&he7,&he5)
  22.  
  23.     g3 = Array( _
  24.         &h00,&h03,&h06,&h05,&h0c,&h0f,&h0a,&h09,&h18,&h1b,&h1e,&h1d,&h14,&h17,&h12,&h11, _
  25.         &h30,&h33,&h36,&h35,&h3c,&h3f,&h3a,&h39,&h28,&h2b,&h2e,&h2d,&h24,&h27,&h22,&h21, _
  26.         &h60,&h63,&h66,&h65,&h6c,&h6f,&h6a,&h69,&h78,&h7b,&h7e,&h7d,&h74,&h77,&h72,&h71, _
  27.         &h50,&h53,&h56,&h55,&h5c,&h5f,&h5a,&h59,&h48,&h4b,&h4e,&h4d,&h44,&h47,&h42,&h41, _
  28.         &hc0,&hc3,&hc6,&hc5,&hcc,&hcf,&hca,&hc9,&hd8,&hdb,&hde,&hdd,&hd4,&hd7,&hd2,&hd1, _
  29.         &hf0,&hf3,&hf6,&hf5,&hfc,&hff,&hfa,&hf9,&he8,&heb,&hee,&hed,&he4,&he7,&he2,&he1, _
  30.         &ha0,&ha3,&ha6,&ha5,&hac,&haf,&haa,&ha9,&hb8,&hbb,&hbe,&hbd,&hb4,&hb7,&hb2,&hb1, _
  31.         &h90,&h93,&h96,&h95,&h9c,&h9f,&h9a,&h99,&h88,&h8b,&h8e,&h8d,&h84,&h87,&h82,&h81, _
  32.         &h9b,&h98,&h9d,&h9e,&h97,&h94,&h91,&h92,&h83,&h80,&h85,&h86,&h8f,&h8c,&h89,&h8a, _
  33.         &hab,&ha8,&had,&hae,&ha7,&ha4,&ha1,&ha2,&hb3,&hb0,&hb5,&hb6,&hbf,&hbc,&hb9,&hba, _
  34.         &hfb,&hf8,&hfd,&hfe,&hf7,&hf4,&hf1,&hf2,&he3,&he0,&he5,&he6,&hef,&hec,&he9,&hea, _
  35.         &hcb,&hc8,&hcd,&hce,&hc7,&hc4,&hc1,&hc2,&hd3,&hd0,&hd5,&hd6,&hdf,&hdc,&hd9,&hda, _
  36.         &h5b,&h58,&h5d,&h5e,&h57,&h54,&h51,&h52,&h43,&h40,&h45,&h46,&h4f,&h4c,&h49,&h4a, _
  37.         &h6b,&h68,&h6d,&h6e,&h67,&h64,&h61,&h62,&h73,&h70,&h75,&h76,&h7f,&h7c,&h79,&h7a, _
  38.         &h3b,&h38,&h3d,&h3e,&h37,&h34,&h31,&h32,&h23,&h20,&h25,&h26,&h2f,&h2c,&h29,&h2a, _
  39.         &h0b,&h08,&h0d,&h0e,&h07,&h04,&h01,&h02,&h13,&h10,&h15,&h16,&h1f,&h1c,&h19,&h1a)
  40.  
  41.     g9 = Array( _
  42.         &h00,&h09,&h12,&h1b,&h24,&h2d,&h36,&h3f,&h48,&h41,&h5a,&h53,&h6c,&h65,&h7e,&h77, _
  43.         &h90,&h99,&h82,&h8b,&hb4,&hbd,&ha6,&haf,&hd8,&hd1,&hca,&hc3,&hfc,&hf5,&hee,&he7, _
  44.         &h3b,&h32,&h29,&h20,&h1f,&h16,&h0d,&h04,&h73,&h7a,&h61,&h68,&h57,&h5e,&h45,&h4c, _
  45.         &hab,&ha2,&hb9,&hb0,&h8f,&h86,&h9d,&h94,&he3,&hea,&hf1,&hf8,&hc7,&hce,&hd5,&hdc, _
  46.         &h76,&h7f,&h64,&h6d,&h52,&h5b,&h40,&h49,&h3e,&h37,&h2c,&h25,&h1a,&h13,&h08,&h01, _
  47.         &he6,&hef,&hf4,&hfd,&hc2,&hcb,&hd0,&hd9,&hae,&ha7,&hbc,&hb5,&h8a,&h83,&h98,&h91, _
  48.         &h4d,&h44,&h5f,&h56,&h69,&h60,&h7b,&h72,&h05,&h0c,&h17,&h1e,&h21,&h28,&h33,&h3a, _
  49.         &hdd,&hd4,&hcf,&hc6,&hf9,&hf0,&heb,&he2,&h95,&h9c,&h87,&h8e,&hb1,&hb8,&ha3,&haa, _
  50.         &hec,&he5,&hfe,&hf7,&hc8,&hc1,&hda,&hd3,&ha4,&had,&hb6,&hbf,&h80,&h89,&h92,&h9b, _
  51.         &h7c,&h75,&h6e,&h67,&h58,&h51,&h4a,&h43,&h34,&h3d,&h26,&h2f,&h10,&h19,&h02,&h0b, _
  52.         &hd7,&hde,&hc5,&hcc,&hf3,&hfa,&he1,&he8,&h9f,&h96,&h8d,&h84,&hbb,&hb2,&ha9,&ha0, _
  53.         &h47,&h4e,&h55,&h5c,&h63,&h6a,&h71,&h78,&h0f,&h06,&h1d,&h14,&h2b,&h22,&h39,&h30, _
  54.         &h9a,&h93,&h88,&h81,&hbe,&hb7,&hac,&ha5,&hd2,&hdb,&hc0,&hc9,&hf6,&hff,&he4,&hed, _
  55.         &h0a,&h03,&h18,&h11,&h2e,&h27,&h3c,&h35,&h42,&h4b,&h50,&h59,&h66,&h6f,&h74,&h7d, _
  56.         &ha1,&ha8,&hb3,&hba,&h85,&h8c,&h97,&h9e,&he9,&he0,&hfb,&hf2,&hcd,&hc4,&hdf,&hd6, _
  57.         &h31,&h38,&h23,&h2a,&h15,&h1c,&h07,&h0e,&h79,&h70,&h6b,&h62,&h5d,&h54,&h4f,&h46)
  58.  
  59.     g11 = Array( _
  60.         &h00,&h0b,&h16,&h1d,&h2c,&h27,&h3a,&h31,&h58,&h53,&h4e,&h45,&h74,&h7f,&h62,&h69, _
  61.         &hb0,&hbb,&ha6,&had,&h9c,&h97,&h8a,&h81,&he8,&he3,&hfe,&hf5,&hc4,&hcf,&hd2,&hd9, _
  62.         &h7b,&h70,&h6d,&h66,&h57,&h5c,&h41,&h4a,&h23,&h28,&h35,&h3e,&h0f,&h04,&h19,&h12, _
  63.         &hcb,&hc0,&hdd,&hd6,&he7,&hec,&hf1,&hfa,&h93,&h98,&h85,&h8e,&hbf,&hb4,&ha9,&ha2, _
  64.         &hf6,&hfd,&he0,&heb,&hda,&hd1,&hcc,&hc7,&hae,&ha5,&hb8,&hb3,&h82,&h89,&h94,&h9f, _
  65.         &h46,&h4d,&h50,&h5b,&h6a,&h61,&h7c,&h77,&h1e,&h15,&h08,&h03,&h32,&h39,&h24,&h2f, _
  66.         &h8d,&h86,&h9b,&h90,&ha1,&haa,&hb7,&hbc,&hd5,&hde,&hc3,&hc8,&hf9,&hf2,&hef,&he4, _
  67.         &h3d,&h36,&h2b,&h20,&h11,&h1a,&h07,&h0c,&h65,&h6e,&h73,&h78,&h49,&h42,&h5f,&h54, _
  68.         &hf7,&hfc,&he1,&hea,&hdb,&hd0,&hcd,&hc6,&haf,&ha4,&hb9,&hb2,&h83,&h88,&h95,&h9e, _
  69.         &h47,&h4c,&h51,&h5a,&h6b,&h60,&h7d,&h76,&h1f,&h14,&h09,&h02,&h33,&h38,&h25,&h2e, _
  70.         &h8c,&h87,&h9a,&h91,&ha0,&hab,&hb6,&hbd,&hd4,&hdf,&hc2,&hc9,&hf8,&hf3,&hee,&he5, _
  71.         &h3c,&h37,&h2a,&h21,&h10,&h1b,&h06,&h0d,&h64,&h6f,&h72,&h79,&h48,&h43,&h5e,&h55, _
  72.         &h01,&h0a,&h17,&h1c,&h2d,&h26,&h3b,&h30,&h59,&h52,&h4f,&h44,&h75,&h7e,&h63,&h68, _
  73.         &hb1,&hba,&ha7,&hac,&h9d,&h96,&h8b,&h80,&he9,&he2,&hff,&hf4,&hc5,&hce,&hd3,&hd8, _
  74.         &h7a,&h71,&h6c,&h67,&h56,&h5d,&h40,&h4b,&h22,&h29,&h34,&h3f,&h0e,&h05,&h18,&h13, _
  75.         &hca,&hc1,&hdc,&hd7,&he6,&hed,&hf0,&hfb,&h92,&h99,&h84,&h8f,&hbe,&hb5,&ha8,&ha3)
  76.  
  77.     g13 = Array( _
  78.         &h00,&h0d,&h1a,&h17,&h34,&h39,&h2e,&h23,&h68,&h65,&h72,&h7f,&h5c,&h51,&h46,&h4b, _
  79.         &hd0,&hdd,&hca,&hc7,&he4,&he9,&hfe,&hf3,&hb8,&hb5,&ha2,&haf,&h8c,&h81,&h96,&h9b, _
  80.         &hbb,&hb6,&ha1,&hac,&h8f,&h82,&h95,&h98,&hd3,&hde,&hc9,&hc4,&he7,&hea,&hfd,&hf0, _
  81.         &h6b,&h66,&h71,&h7c,&h5f,&h52,&h45,&h48,&h03,&h0e,&h19,&h14,&h37,&h3a,&h2d,&h20, _
  82.         &h6d,&h60,&h77,&h7a,&h59,&h54,&h43,&h4e,&h05,&h08,&h1f,&h12,&h31,&h3c,&h2b,&h26, _
  83.         &hbd,&hb0,&ha7,&haa,&h89,&h84,&h93,&h9e,&hd5,&hd8,&hcf,&hc2,&he1,&hec,&hfb,&hf6, _
  84.         &hd6,&hdb,&hcc,&hc1,&he2,&hef,&hf8,&hf5,&hbe,&hb3,&ha4,&ha9,&h8a,&h87,&h90,&h9d, _
  85.         &h06,&h0b,&h1c,&h11,&h32,&h3f,&h28,&h25,&h6e,&h63,&h74,&h79,&h5a,&h57,&h40,&h4d, _
  86.         &hda,&hd7,&hc0,&hcd,&hee,&he3,&hf4,&hf9,&hb2,&hbf,&ha8,&ha5,&h86,&h8b,&h9c,&h91, _
  87.         &h0a,&h07,&h10,&h1d,&h3e,&h33,&h24,&h29,&h62,&h6f,&h78,&h75,&h56,&h5b,&h4c,&h41, _
  88.         &h61,&h6c,&h7b,&h76,&h55,&h58,&h4f,&h42,&h09,&h04,&h13,&h1e,&h3d,&h30,&h27,&h2a, _
  89.         &hb1,&hbc,&hab,&ha6,&h85,&h88,&h9f,&h92,&hd9,&hd4,&hc3,&hce,&hed,&he0,&hf7,&hfa, _
  90.         &hb7,&hba,&had,&ha0,&h83,&h8e,&h99,&h94,&hdf,&hd2,&hc5,&hc8,&heb,&he6,&hf1,&hfc, _
  91.         &h67,&h6a,&h7d,&h70,&h53,&h5e,&h49,&h44,&h0f,&h02,&h15,&h18,&h3b,&h36,&h21,&h2c, _
  92.         &h0c,&h01,&h16,&h1b,&h38,&h35,&h22,&h2f,&h64,&h69,&h7e,&h73,&h50,&h5d,&h4a,&h47, _
  93.         &hdc,&hd1,&hc6,&hcb,&he8,&he5,&hf2,&hff,&hb4,&hb9,&hae,&ha3,&h80,&h8d,&h9a,&h97)
  94.  
  95.     g14 = Array( _
  96.         &h00,&h0e,&h1c,&h12,&h38,&h36,&h24,&h2a,&h70,&h7e,&h6c,&h62,&h48,&h46,&h54,&h5a, _
  97.         &he0,&hee,&hfc,&hf2,&hd8,&hd6,&hc4,&hca,&h90,&h9e,&h8c,&h82,&ha8,&ha6,&hb4,&hba, _
  98.         &hdb,&hd5,&hc7,&hc9,&he3,&hed,&hff,&hf1,&hab,&ha5,&hb7,&hb9,&h93,&h9d,&h8f,&h81, _
  99.         &h3b,&h35,&h27,&h29,&h03,&h0d,&h1f,&h11,&h4b,&h45,&h57,&h59,&h73,&h7d,&h6f,&h61, _
  100.         &had,&ha3,&hb1,&hbf,&h95,&h9b,&h89,&h87,&hdd,&hd3,&hc1,&hcf,&he5,&heb,&hf9,&hf7, _
  101.         &h4d,&h43,&h51,&h5f,&h75,&h7b,&h69,&h67,&h3d,&h33,&h21,&h2f,&h05,&h0b,&h19,&h17, _
  102.         &h76,&h78,&h6a,&h64,&h4e,&h40,&h52,&h5c,&h06,&h08,&h1a,&h14,&h3e,&h30,&h22,&h2c, _
  103.         &h96,&h98,&h8a,&h84,&hae,&ha0,&hb2,&hbc,&he6,&he8,&hfa,&hf4,&hde,&hd0,&hc2,&hcc, _
  104.         &h41,&h4f,&h5d,&h53,&h79,&h77,&h65,&h6b,&h31,&h3f,&h2d,&h23,&h09,&h07,&h15,&h1b, _
  105.         &ha1,&haf,&hbd,&hb3,&h99,&h97,&h85,&h8b,&hd1,&hdf,&hcd,&hc3,&he9,&he7,&hf5,&hfb, _
  106.         &h9a,&h94,&h86,&h88,&ha2,&hac,&hbe,&hb0,&hea,&he4,&hf6,&hf8,&hd2,&hdc,&hce,&hc0, _
  107.         &h7a,&h74,&h66,&h68,&h42,&h4c,&h5e,&h50,&h0a,&h04,&h16,&h18,&h32,&h3c,&h2e,&h20, _
  108.         &hec,&he2,&hf0,&hfe,&hd4,&hda,&hc8,&hc6,&h9c,&h92,&h80,&h8e,&ha4,&haa,&hb8,&hb6, _
  109.         &h0c,&h02,&h10,&h1e,&h34,&h3a,&h28,&h26,&h7c,&h72,&h60,&h6e,&h44,&h4a,&h58,&h56, _
  110.         &h37,&h39,&h2b,&h25,&h0f,&h01,&h13,&h1d,&h47,&h49,&h5b,&h55,&h7f,&h71,&h63,&h6d, _
  111.         &hd7,&hd9,&hcb,&hc5,&hef,&he1,&hf3,&hfd,&ha7,&ha9,&hbb,&hb5,&h9f,&h91,&h83,&h8d)
  112.  
  113.     sbox = Array( _
  114.         &h63, &h7c, &h77, &h7b, &hf2, &h6b, &h6f, &hc5, &h30, &h01, &h67, &h2b, &hfe, &hd7, &hab, &h76, _
  115.         &hca, &h82, &hc9, &h7d, &hfa, &h59, &h47, &hf0, &had, &hd4, &ha2, &haf, &h9c, &ha4, &h72, &hc0, _
  116.         &hb7, &hfd, &h93, &h26, &h36, &h3f, &hf7, &hcc, &h34, &ha5, &he5, &hf1, &h71, &hd8, &h31, &h15, _
  117.         &h04, &hc7, &h23, &hc3, &h18, &h96, &h05, &h9a, &h07, &h12, &h80, &he2, &heb, &h27, &hb2, &h75, _
  118.         &h09, &h83, &h2c, &h1a, &h1b, &h6e, &h5a, &ha0, &h52, &h3b, &hd6, &hb3, &h29, &he3, &h2f, &h84, _
  119.         &h53, &hd1, &h00, &hed, &h20, &hfc, &hb1, &h5b, &h6a, &hcb, &hbe, &h39, &h4a, &h4c, &h58, &hcf, _
  120.         &hd0, &hef, &haa, &hfb, &h43, &h4d, &h33, &h85, &h45, &hf9, &h02, &h7f, &h50, &h3c, &h9f, &ha8, _
  121.         &h51, &ha3, &h40, &h8f, &h92, &h9d, &h38, &hf5, &hbc, &hb6, &hda, &h21, &h10, &hff, &hf3, &hd2, _
  122.         &hcd, &h0c, &h13, &hec, &h5f, &h97, &h44, &h17, &hc4, &ha7, &h7e, &h3d, &h64, &h5d, &h19, &h73, _
  123.         &h60, &h81, &h4f, &hdc, &h22, &h2a, &h90, &h88, &h46, &hee, &hb8, &h14, &hde, &h5e, &h0b, &hdb, _
  124.         &he0, &h32, &h3a, &h0a, &h49, &h06, &h24, &h5c, &hc2, &hd3, &hac, &h62, &h91, &h95, &he4, &h79, _
  125.         &he7, &hc8, &h37, &h6d, &h8d, &hd5, &h4e, &ha9, &h6c, &h56, &hf4, &hea, &h65, &h7a, &hae, &h08, _
  126.         &hba, &h78, &h25, &h2e, &h1c, &ha6, &hb4, &hc6, &he8, &hdd, &h74, &h1f, &h4b, &hbd, &h8b, &h8a, _
  127.         &h70, &h3e, &hb5, &h66, &h48, &h03, &hf6, &h0e, &h61, &h35, &h57, &hb9, &h86, &hc1, &h1d, &h9e, _
  128.         &he1, &hf8, &h98, &h11, &h69, &hd9, &h8e, &h94, &h9b, &h1e, &h87, &he9, &hce, &h55, &h28, &hdf, _
  129.         &h8c, &ha1, &h89, &h0d, &hbf, &he6, &h42, &h68, &h41, &h99, &h2d, &h0f, &hb0, &h54, &hbb, &h16)
  130.  
  131.     sboxinv = Array( _
  132.         &h52, &h09, &h6a, &hd5, &h30, &h36, &ha5, &h38, &hbf, &h40, &ha3, &h9e, &h81, &hf3, &hd7, &hfb, _
  133.         &h7c, &he3, &h39, &h82, &h9b, &h2f, &hff, &h87, &h34, &h8e, &h43, &h44, &hc4, &hde, &he9, &hcb, _
  134.         &h54, &h7b, &h94, &h32, &ha6, &hc2, &h23, &h3d, &hee, &h4c, &h95, &h0b, &h42, &hfa, &hc3, &h4e, _
  135.         &h08, &h2e, &ha1, &h66, &h28, &hd9, &h24, &hb2, &h76, &h5b, &ha2, &h49, &h6d, &h8b, &hd1, &h25, _
  136.         &h72, &hf8, &hf6, &h64, &h86, &h68, &h98, &h16, &hd4, &ha4, &h5c, &hcc, &h5d, &h65, &hb6, &h92, _
  137.         &h6c, &h70, &h48, &h50, &hfd, &hed, &hb9, &hda, &h5e, &h15, &h46, &h57, &ha7, &h8d, &h9d, &h84, _
  138.         &h90, &hd8, &hab, &h00, &h8c, &hbc, &hd3, &h0a, &hf7, &he4, &h58, &h05, &hb8, &hb3, &h45, &h06, _
  139.         &hd0, &h2c, &h1e, &h8f, &hca, &h3f, &h0f, &h02, &hc1, &haf, &hbd, &h03, &h01, &h13, &h8a, &h6b, _
  140.         &h3a, &h91, &h11, &h41, &h4f, &h67, &hdc, &hea, &h97, &hf2, &hcf, &hce, &hf0, &hb4, &he6, &h73, _
  141.         &h96, &hac, &h74, &h22, &he7, &had, &h35, &h85, &he2, &hf9, &h37, &he8, &h1c, &h75, &hdf, &h6e, _
  142.         &h47, &hf1, &h1a, &h71, &h1d, &h29, &hc5, &h89, &h6f, &hb7, &h62, &h0e, &haa, &h18, &hbe, &h1b, _
  143.         &hfc, &h56, &h3e, &h4b, &hc6, &hd2, &h79, &h20, &h9a, &hdb, &hc0, &hfe, &h78, &hcd, &h5a, &hf4, _
  144.         &h1f, &hdd, &ha8, &h33, &h88, &h07, &hc7, &h31, &hb1, &h12, &h10, &h59, &h27, &h80, &hec, &h5f, _
  145.         &h60, &h51, &h7f, &ha9, &h19, &hb5, &h4a, &h0d, &h2d, &he5, &h7a, &h9f, &h93, &hc9, &h9c, &hef, _
  146.         &ha0, &he0, &h3b, &h4d, &hae, &h2a, &hf5, &hb0, &hc8, &heb, &hbb, &h3c, &h83, &h53, &h99, &h61, _
  147.         &h17, &h2b, &h04, &h7e, &hba, &h77, &hd6, &h26, &he1, &h69, &h14, &h63, &h55, &h21, &h0c, &h7d)
  148.  
  149.     rcon = Array( _
  150.         &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, _
  151.         &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, _
  152.         &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, _
  153.         &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, _
  154.         &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, _
  155.         &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, _
  156.         &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, _
  157.         &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, _
  158.         &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, _
  159.         &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, _
  160.         &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, _
  161.         &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, _
  162.         &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, _
  163.         &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, _
  164.         &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, _
  165.         &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb)
  166.  
  167.     Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
  168.     Dim sPlain, sPass, sCipher, sTemp
  169.     Dim oFile1, oFS, oFile2
  170.     Dim x, r, y, temp(4), intTemp
  171.  
  172.     Set oFS = CreateObject("Scripting.FileSystemObject")
  173.     Set oFile1 = oFS.OpenTextFile(sFile, ForReading)
  174.  
  175.     If Right(sFile, 4) <> ".enc" Then
  176.         sFile = sFile & ".enc"
  177.         oFS.CreateTextFile sFile, 2, True
  178.         isEncode = True
  179.     Else
  180.         sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
  181.         oFS.CreateTextFile sFile, 2, True
  182.         isEncode = False
  183.     End If
  184.  
  185.     Set oFile2 = oFS.OpenTextFile(sFile, ForWriting)
  186.     Set oFS = Nothing
  187.  
  188.     For i = 0 To (Len(oPW.Value) - 1)
  189.         aesKey(i) = Asc(Mid(oPW.Value, i + 1, 1))
  190.     Next
  191.  
  192.     For i = Len(oPW.Value) To 31
  193.         aesKey(i) = 0
  194.     Next
  195.  
  196.     expandedKey = expandKey(aesKey, sbox, rcon)
  197.  
  198.     Do Until oFile1.AtEndOfStream
  199.         sPlain = oFile1.Read(1024)
  200.         sCipher = ""
  201.         j = 0
  202.         isDone = False
  203.  
  204.         Do Until isDone
  205.             sTemp = Mid(sPlain, j*16 + 1, 16)
  206.  
  207.             If Len(sTemp) < 16 Then
  208.                 For i = Len(sTemp) To 15
  209.                     sTemp = sTemp & Chr(0)
  210.                 Next
  211.             End If
  212.  
  213.             For i = 0 To 15
  214.                 block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
  215.             Next
  216.  
  217.             If (j + 1) * 16 >= Len(sPlain) Then
  218.                 isDone = True
  219.             End If
  220.  
  221.             j = j + 1
  222.  
  223.             If isEncode Then
  224.                 r= 0
  225.                 For i = 0 To 15
  226.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  227.                 Next
  228.  
  229.                 For x = 1 To 13
  230.                     block(0) = sbox(block(0))
  231.                     block(1) = sbox(block(1))
  232.                     block(2) = sbox(block(2))
  233.                     block(3) = sbox(block(3))
  234.  
  235.                     intTemp = sbox(block(4))
  236.                     block(4) = sbox(block(5))
  237.                     block(5) = sbox(block(6))
  238.                     block(6) = sbox(block(7))
  239.                     block(7) = intTemp
  240.  
  241.                     intTemp = sbox(block(8))
  242.                     block(8) = sbox(block(10))
  243.                     block(10) = intTemp
  244.                     intTemp = sbox(block(9))
  245.                     block(9) = sbox(block(11))
  246.                     block(11) = intTemp
  247.  
  248.                     intTemp = sbox(block(12))
  249.                     block(12) = sbox(block(15))
  250.                     block(15) = sbox(block(14))
  251.                     block(14) = sbox(block(13))
  252.                     block(13) = intTemp
  253.  
  254.                     r = x * 16
  255.                     For i = 0 To 3
  256.                         temp(0) = block(i)
  257.                         temp(1) = block(i+4)
  258.                         temp(2) = block(i+8)
  259.                         temp(3) = block(i+12)
  260.  
  261.                         block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r+i*4)
  262.                         block(i+4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r+i*4+1)
  263.                         block(i+8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r+i*4+2)
  264.                         block(i+12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r+i*4+3)
  265.                     Next
  266.                 Next
  267.  
  268.                 block(0) = sbox(block(0)) Xor expandedKey(224)
  269.                 block(1) = sbox(block(1)) Xor expandedKey(228)
  270.                 block(2) = sbox(block(2)) Xor expandedKey(232)
  271.                 block(3) = sbox(block(3)) Xor expandedKey(236)
  272.  
  273.                 intTemp = sbox(block(4)) Xor expandedKey(237)
  274.                 block(4) = sbox(block(5)) Xor expandedKey(225)
  275.                 block(5) = sbox(block(6)) Xor expandedKey(229)
  276.                 block(6) = sbox(block(7)) Xor expandedKey(233)
  277.                 block(7) = intTemp
  278.  
  279.                 intTemp = sbox(block(8)) Xor expandedKey(234)
  280.                 block(8) = sbox(block(10)) Xor expandedKey(226)
  281.                 block(10) = intTemp
  282.                 intTemp = sbox(block(9)) Xor expandedKey(238)
  283.                 block(9) = sbox(block(11)) Xor expandedKey(230)
  284.                 block(11) = intTemp
  285.  
  286.                 intTemp = sbox(block(12)) Xor expandedKey(231)
  287.                 block(12) = sbox(block(15)) Xor expandedKey(227)
  288.                 block(15) = sbox(block(14)) Xor expandedKey(239)
  289.                 block(14) = sbox(block(13)) Xor expandedKey(235)
  290.                 block(13) = intTemp
  291.             Else
  292.                 block(0) = sboxinv(block(0) Xor expandedKey(224))
  293.                 block(1) = sboxinv(block(1) Xor expandedKey(228))
  294.                 block(2) = sboxinv(block(2) Xor expandedKey(232))
  295.                 block(3) = sboxinv(block(3) Xor expandedKey(236))
  296.  
  297.                 intTemp = sboxinv(block(4) Xor expandedKey(225))
  298.                 block(4) = sboxinv(block(7) Xor expandedKey(237))
  299.                 block(7) = sboxinv(block(6) Xor expandedKey(233))
  300.                 block(6) = sboxinv(block(5) Xor expandedKey(229))
  301.                 block(5) = intTemp
  302.  
  303.                 intTemp = sboxinv(block(8) Xor expandedKey(226))
  304.                 block(8) = sboxinv(block(10) Xor expandedKey(234))
  305.                 block(10) = intTemp
  306.                 intTemp = sboxinv(block(9) Xor expandedKey(230))
  307.                 block(9) = sboxinv(block(11) Xor expandedKey(238))
  308.                 block(11) = intTemp
  309.  
  310.                 intTemp = sboxinv(block(12) Xor expandedKey(227))
  311.                 block(12) = sboxinv(block(13) Xor expandedKey(231))
  312.                 block(13) = sboxinv(block(14) Xor expandedKey(235))
  313.                 block(14) = sboxinv(block(15) Xor expandedKey(239))
  314.                 block(15) = intTemp
  315.  
  316.                 For x = 13 To 1 Step -1
  317.                     r = x * 16
  318.  
  319.                     For i = 0 To 3
  320.                         temp(0) = block(i) Xor expandedKey(r+i*4)
  321.                         temp(1) = block(i+4) Xor expandedKey(r+i*4+1)
  322.                         temp(2) = block(i+8) Xor expandedKey(r+i*4+2)
  323.                         temp(3) = block(i+12) Xor expandedKey(r+i*4+3)
  324.  
  325.                         block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
  326.                         block(i+4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
  327.                         block(i+8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
  328.                         block(i+12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
  329.                     Next
  330.  
  331.                     block(0) = sboxinv(block(0))
  332.                     block(1) = sboxinv(block(1))
  333.                     block(2) = sboxinv(block(2))
  334.                     block(3) = sboxinv(block(3))
  335.  
  336.                     intTemp = sboxinv(block(4))
  337.                     block(4) = sboxinv(block(7))
  338.                     block(7) = sboxinv(block(6))
  339.                     block(6) = sboxinv(block(5))
  340.                     block(5) = intTemp
  341.  
  342.                     intTemp = sboxinv(block(8))
  343.                     block(8) = sboxinv(block(10))
  344.                     block(10) = intTemp
  345.                     intTemp = sboxinv(block(9))
  346.                     block(9) = sboxinv(block(11))
  347.                     block(11) = intTemp
  348.  
  349.                     intTemp = sboxinv(block(12))
  350.                     block(12) = sboxinv(block(13))
  351.                     block(13) = sboxinv(block(14))
  352.                     block(14) = sboxinv(block(15))
  353.                     block(15) = intTemp
  354.                 Next
  355.  
  356.                 r= 0
  357.                 For i = 0 To 15
  358.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  359.                 Next
  360.             End If
  361.  
  362.             For i = 0 To 15
  363.                 sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
  364.             Next
  365.         Loop
  366.  
  367.         oFile2.Write sCipher
  368.     Loop
  369.  
  370.     oFile1.Close
  371.     Set oFile1 = Nothing
  372.     oFile2.Close
  373.     Set oFile2 = Nothing
  374. End Sub
  375.  
  376. Function keyScheduleCore(ByVal row(), ByVal a, ByRef box(), ByRef rcon())
  377.     Dim result(4), i
  378.  
  379.     For i = 0 To 3
  380.         result(i) = box(row((i + 5) Mod 4))
  381.     Next
  382.  
  383.     result(0) = result(0) Xor rcon(a)
  384.     keyScheduleCore = result
  385. End Function
  386.  
  387. Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
  388.     Dim rConIter, temp, i, result(240)
  389.  
  390.     ReDim temp(4)
  391.     rConIter = 1
  392.  
  393.     For i = 0 To 31
  394.         result(i) = key(i)
  395.     Next
  396.  
  397.     For i = 32 To 239 Step 4
  398.         temp(0) = result(i - 4)
  399.         temp(1) = result(i - 3)
  400.         temp(2) = result(i - 2)
  401.         temp(3) = result(i - 1)
  402.  
  403.         If i Mod 32 = 0 Then
  404.             temp = keyScheduleCore(temp, rConIter, box, rcon)
  405.             rConIter = rConIter + 1
  406.         End If
  407.  
  408.         If i Mod 32 = 16 Then
  409.             temp(0) = box(temp(0))
  410.             temp(1) = box(temp(1))
  411.             temp(2) = box(temp(2))
  412.             temp(3) = box(temp(3))
  413.         End If
  414.  
  415.         result(i) = result(i-32) Xor temp(0)
  416.         result(i+1) = result(i-31) Xor temp(1)
  417.         result(i+2) = result(i-30) Xor temp(2)
  418.         result(i+3) = result(i-29) Xor temp(3)
  419.     Next
  420.  
  421.     exPandKey = result
  422. End Function
Here is the code for Cipher-block Chaining mode.
Expand|Select|Wrap|Line Numbers
  1. Sub RunAES(sFile)
  2.     Dim sbox, sboxinv, rcon
  3.     Dim g2, g3, g9, g11, g13, g14
  4.  
  5.     g2 = Array( _
  6.         &h00,&h02,&h04,&h06,&h08,&h0a,&h0c,&h0e,&h10,&h12,&h14,&h16,&h18,&h1a,&h1c,&h1e, _
  7.         &h20,&h22,&h24,&h26,&h28,&h2a,&h2c,&h2e,&h30,&h32,&h34,&h36,&h38,&h3a,&h3c,&h3e, _
  8.         &h40,&h42,&h44,&h46,&h48,&h4a,&h4c,&h4e,&h50,&h52,&h54,&h56,&h58,&h5a,&h5c,&h5e, _
  9.         &h60,&h62,&h64,&h66,&h68,&h6a,&h6c,&h6e,&h70,&h72,&h74,&h76,&h78,&h7a,&h7c,&h7e, _
  10.         &h80,&h82,&h84,&h86,&h88,&h8a,&h8c,&h8e,&h90,&h92,&h94,&h96,&h98,&h9a,&h9c,&h9e, _
  11.         &ha0,&ha2,&ha4,&ha6,&ha8,&haa,&hac,&hae,&hb0,&hb2,&hb4,&hb6,&hb8,&hba,&hbc,&hbe, _
  12.         &hc0,&hc2,&hc4,&hc6,&hc8,&hca,&hcc,&hce,&hd0,&hd2,&hd4,&hd6,&hd8,&hda,&hdc,&hde, _
  13.         &he0,&he2,&he4,&he6,&he8,&hea,&hec,&hee,&hf0,&hf2,&hf4,&hf6,&hf8,&hfa,&hfc,&hfe, _
  14.         &h1b,&h19,&h1f,&h1d,&h13,&h11,&h17,&h15,&h0b,&h09,&h0f,&h0d,&h03,&h01,&h07,&h05, _
  15.         &h3b,&h39,&h3f,&h3d,&h33,&h31,&h37,&h35,&h2b,&h29,&h2f,&h2d,&h23,&h21,&h27,&h25, _
  16.         &h5b,&h59,&h5f,&h5d,&h53,&h51,&h57,&h55,&h4b,&h49,&h4f,&h4d,&h43,&h41,&h47,&h45, _
  17.         &h7b,&h79,&h7f,&h7d,&h73,&h71,&h77,&h75,&h6b,&h69,&h6f,&h6d,&h63,&h61,&h67,&h65, _
  18.         &h9b,&h99,&h9f,&h9d,&h93,&h91,&h97,&h95,&h8b,&h89,&h8f,&h8d,&h83,&h81,&h87,&h85, _
  19.         &hbb,&hb9,&hbf,&hbd,&hb3,&hb1,&hb7,&hb5,&hab,&ha9,&haf,&had,&ha3,&ha1,&ha7,&ha5, _
  20.         &hdb,&hd9,&hdf,&hdd,&hd3,&hd1,&hd7,&hd5,&hcb,&hc9,&hcf,&hcd,&hc3,&hc1,&hc7,&hc5, _
  21.         &hfb,&hf9,&hff,&hfd,&hf3,&hf1,&hf7,&hf5,&heb,&he9,&hef,&hed,&he3,&he1,&he7,&he5)
  22.  
  23.     g3 = Array( _
  24.         &h00,&h03,&h06,&h05,&h0c,&h0f,&h0a,&h09,&h18,&h1b,&h1e,&h1d,&h14,&h17,&h12,&h11, _
  25.         &h30,&h33,&h36,&h35,&h3c,&h3f,&h3a,&h39,&h28,&h2b,&h2e,&h2d,&h24,&h27,&h22,&h21, _
  26.         &h60,&h63,&h66,&h65,&h6c,&h6f,&h6a,&h69,&h78,&h7b,&h7e,&h7d,&h74,&h77,&h72,&h71, _
  27.         &h50,&h53,&h56,&h55,&h5c,&h5f,&h5a,&h59,&h48,&h4b,&h4e,&h4d,&h44,&h47,&h42,&h41, _
  28.         &hc0,&hc3,&hc6,&hc5,&hcc,&hcf,&hca,&hc9,&hd8,&hdb,&hde,&hdd,&hd4,&hd7,&hd2,&hd1, _
  29.         &hf0,&hf3,&hf6,&hf5,&hfc,&hff,&hfa,&hf9,&he8,&heb,&hee,&hed,&he4,&he7,&he2,&he1, _
  30.         &ha0,&ha3,&ha6,&ha5,&hac,&haf,&haa,&ha9,&hb8,&hbb,&hbe,&hbd,&hb4,&hb7,&hb2,&hb1, _
  31.         &h90,&h93,&h96,&h95,&h9c,&h9f,&h9a,&h99,&h88,&h8b,&h8e,&h8d,&h84,&h87,&h82,&h81, _
  32.         &h9b,&h98,&h9d,&h9e,&h97,&h94,&h91,&h92,&h83,&h80,&h85,&h86,&h8f,&h8c,&h89,&h8a, _
  33.         &hab,&ha8,&had,&hae,&ha7,&ha4,&ha1,&ha2,&hb3,&hb0,&hb5,&hb6,&hbf,&hbc,&hb9,&hba, _
  34.         &hfb,&hf8,&hfd,&hfe,&hf7,&hf4,&hf1,&hf2,&he3,&he0,&he5,&he6,&hef,&hec,&he9,&hea, _
  35.         &hcb,&hc8,&hcd,&hce,&hc7,&hc4,&hc1,&hc2,&hd3,&hd0,&hd5,&hd6,&hdf,&hdc,&hd9,&hda, _
  36.         &h5b,&h58,&h5d,&h5e,&h57,&h54,&h51,&h52,&h43,&h40,&h45,&h46,&h4f,&h4c,&h49,&h4a, _
  37.         &h6b,&h68,&h6d,&h6e,&h67,&h64,&h61,&h62,&h73,&h70,&h75,&h76,&h7f,&h7c,&h79,&h7a, _
  38.         &h3b,&h38,&h3d,&h3e,&h37,&h34,&h31,&h32,&h23,&h20,&h25,&h26,&h2f,&h2c,&h29,&h2a, _
  39.         &h0b,&h08,&h0d,&h0e,&h07,&h04,&h01,&h02,&h13,&h10,&h15,&h16,&h1f,&h1c,&h19,&h1a)
  40.  
  41.     g9 = Array( _
  42.         &h00,&h09,&h12,&h1b,&h24,&h2d,&h36,&h3f,&h48,&h41,&h5a,&h53,&h6c,&h65,&h7e,&h77, _
  43.         &h90,&h99,&h82,&h8b,&hb4,&hbd,&ha6,&haf,&hd8,&hd1,&hca,&hc3,&hfc,&hf5,&hee,&he7, _
  44.         &h3b,&h32,&h29,&h20,&h1f,&h16,&h0d,&h04,&h73,&h7a,&h61,&h68,&h57,&h5e,&h45,&h4c, _
  45.         &hab,&ha2,&hb9,&hb0,&h8f,&h86,&h9d,&h94,&he3,&hea,&hf1,&hf8,&hc7,&hce,&hd5,&hdc, _
  46.         &h76,&h7f,&h64,&h6d,&h52,&h5b,&h40,&h49,&h3e,&h37,&h2c,&h25,&h1a,&h13,&h08,&h01, _
  47.         &he6,&hef,&hf4,&hfd,&hc2,&hcb,&hd0,&hd9,&hae,&ha7,&hbc,&hb5,&h8a,&h83,&h98,&h91, _
  48.         &h4d,&h44,&h5f,&h56,&h69,&h60,&h7b,&h72,&h05,&h0c,&h17,&h1e,&h21,&h28,&h33,&h3a, _
  49.         &hdd,&hd4,&hcf,&hc6,&hf9,&hf0,&heb,&he2,&h95,&h9c,&h87,&h8e,&hb1,&hb8,&ha3,&haa, _
  50.         &hec,&he5,&hfe,&hf7,&hc8,&hc1,&hda,&hd3,&ha4,&had,&hb6,&hbf,&h80,&h89,&h92,&h9b, _
  51.         &h7c,&h75,&h6e,&h67,&h58,&h51,&h4a,&h43,&h34,&h3d,&h26,&h2f,&h10,&h19,&h02,&h0b, _
  52.         &hd7,&hde,&hc5,&hcc,&hf3,&hfa,&he1,&he8,&h9f,&h96,&h8d,&h84,&hbb,&hb2,&ha9,&ha0, _
  53.         &h47,&h4e,&h55,&h5c,&h63,&h6a,&h71,&h78,&h0f,&h06,&h1d,&h14,&h2b,&h22,&h39,&h30, _
  54.         &h9a,&h93,&h88,&h81,&hbe,&hb7,&hac,&ha5,&hd2,&hdb,&hc0,&hc9,&hf6,&hff,&he4,&hed, _
  55.         &h0a,&h03,&h18,&h11,&h2e,&h27,&h3c,&h35,&h42,&h4b,&h50,&h59,&h66,&h6f,&h74,&h7d, _
  56.         &ha1,&ha8,&hb3,&hba,&h85,&h8c,&h97,&h9e,&he9,&he0,&hfb,&hf2,&hcd,&hc4,&hdf,&hd6, _
  57.         &h31,&h38,&h23,&h2a,&h15,&h1c,&h07,&h0e,&h79,&h70,&h6b,&h62,&h5d,&h54,&h4f,&h46)
  58.  
  59.     g11 = Array( _
  60.         &h00,&h0b,&h16,&h1d,&h2c,&h27,&h3a,&h31,&h58,&h53,&h4e,&h45,&h74,&h7f,&h62,&h69, _
  61.         &hb0,&hbb,&ha6,&had,&h9c,&h97,&h8a,&h81,&he8,&he3,&hfe,&hf5,&hc4,&hcf,&hd2,&hd9, _
  62.         &h7b,&h70,&h6d,&h66,&h57,&h5c,&h41,&h4a,&h23,&h28,&h35,&h3e,&h0f,&h04,&h19,&h12, _
  63.         &hcb,&hc0,&hdd,&hd6,&he7,&hec,&hf1,&hfa,&h93,&h98,&h85,&h8e,&hbf,&hb4,&ha9,&ha2, _
  64.         &hf6,&hfd,&he0,&heb,&hda,&hd1,&hcc,&hc7,&hae,&ha5,&hb8,&hb3,&h82,&h89,&h94,&h9f, _
  65.         &h46,&h4d,&h50,&h5b,&h6a,&h61,&h7c,&h77,&h1e,&h15,&h08,&h03,&h32,&h39,&h24,&h2f, _
  66.         &h8d,&h86,&h9b,&h90,&ha1,&haa,&hb7,&hbc,&hd5,&hde,&hc3,&hc8,&hf9,&hf2,&hef,&he4, _
  67.         &h3d,&h36,&h2b,&h20,&h11,&h1a,&h07,&h0c,&h65,&h6e,&h73,&h78,&h49,&h42,&h5f,&h54, _
  68.         &hf7,&hfc,&he1,&hea,&hdb,&hd0,&hcd,&hc6,&haf,&ha4,&hb9,&hb2,&h83,&h88,&h95,&h9e, _
  69.         &h47,&h4c,&h51,&h5a,&h6b,&h60,&h7d,&h76,&h1f,&h14,&h09,&h02,&h33,&h38,&h25,&h2e, _
  70.         &h8c,&h87,&h9a,&h91,&ha0,&hab,&hb6,&hbd,&hd4,&hdf,&hc2,&hc9,&hf8,&hf3,&hee,&he5, _
  71.         &h3c,&h37,&h2a,&h21,&h10,&h1b,&h06,&h0d,&h64,&h6f,&h72,&h79,&h48,&h43,&h5e,&h55, _
  72.         &h01,&h0a,&h17,&h1c,&h2d,&h26,&h3b,&h30,&h59,&h52,&h4f,&h44,&h75,&h7e,&h63,&h68, _
  73.         &hb1,&hba,&ha7,&hac,&h9d,&h96,&h8b,&h80,&he9,&he2,&hff,&hf4,&hc5,&hce,&hd3,&hd8, _
  74.         &h7a,&h71,&h6c,&h67,&h56,&h5d,&h40,&h4b,&h22,&h29,&h34,&h3f,&h0e,&h05,&h18,&h13, _
  75.         &hca,&hc1,&hdc,&hd7,&he6,&hed,&hf0,&hfb,&h92,&h99,&h84,&h8f,&hbe,&hb5,&ha8,&ha3)
  76.  
  77.     g13 = Array( _
  78.         &h00,&h0d,&h1a,&h17,&h34,&h39,&h2e,&h23,&h68,&h65,&h72,&h7f,&h5c,&h51,&h46,&h4b, _
  79.         &hd0,&hdd,&hca,&hc7,&he4,&he9,&hfe,&hf3,&hb8,&hb5,&ha2,&haf,&h8c,&h81,&h96,&h9b, _
  80.         &hbb,&hb6,&ha1,&hac,&h8f,&h82,&h95,&h98,&hd3,&hde,&hc9,&hc4,&he7,&hea,&hfd,&hf0, _
  81.         &h6b,&h66,&h71,&h7c,&h5f,&h52,&h45,&h48,&h03,&h0e,&h19,&h14,&h37,&h3a,&h2d,&h20, _
  82.         &h6d,&h60,&h77,&h7a,&h59,&h54,&h43,&h4e,&h05,&h08,&h1f,&h12,&h31,&h3c,&h2b,&h26, _
  83.         &hbd,&hb0,&ha7,&haa,&h89,&h84,&h93,&h9e,&hd5,&hd8,&hcf,&hc2,&he1,&hec,&hfb,&hf6, _
  84.         &hd6,&hdb,&hcc,&hc1,&he2,&hef,&hf8,&hf5,&hbe,&hb3,&ha4,&ha9,&h8a,&h87,&h90,&h9d, _
  85.         &h06,&h0b,&h1c,&h11,&h32,&h3f,&h28,&h25,&h6e,&h63,&h74,&h79,&h5a,&h57,&h40,&h4d, _
  86.         &hda,&hd7,&hc0,&hcd,&hee,&he3,&hf4,&hf9,&hb2,&hbf,&ha8,&ha5,&h86,&h8b,&h9c,&h91, _
  87.         &h0a,&h07,&h10,&h1d,&h3e,&h33,&h24,&h29,&h62,&h6f,&h78,&h75,&h56,&h5b,&h4c,&h41, _
  88.         &h61,&h6c,&h7b,&h76,&h55,&h58,&h4f,&h42,&h09,&h04,&h13,&h1e,&h3d,&h30,&h27,&h2a, _
  89.         &hb1,&hbc,&hab,&ha6,&h85,&h88,&h9f,&h92,&hd9,&hd4,&hc3,&hce,&hed,&he0,&hf7,&hfa, _
  90.         &hb7,&hba,&had,&ha0,&h83,&h8e,&h99,&h94,&hdf,&hd2,&hc5,&hc8,&heb,&he6,&hf1,&hfc, _
  91.         &h67,&h6a,&h7d,&h70,&h53,&h5e,&h49,&h44,&h0f,&h02,&h15,&h18,&h3b,&h36,&h21,&h2c, _
  92.         &h0c,&h01,&h16,&h1b,&h38,&h35,&h22,&h2f,&h64,&h69,&h7e,&h73,&h50,&h5d,&h4a,&h47, _
  93.         &hdc,&hd1,&hc6,&hcb,&he8,&he5,&hf2,&hff,&hb4,&hb9,&hae,&ha3,&h80,&h8d,&h9a,&h97)
  94.  
  95.     g14 = Array( _
  96.         &h00,&h0e,&h1c,&h12,&h38,&h36,&h24,&h2a,&h70,&h7e,&h6c,&h62,&h48,&h46,&h54,&h5a, _
  97.         &he0,&hee,&hfc,&hf2,&hd8,&hd6,&hc4,&hca,&h90,&h9e,&h8c,&h82,&ha8,&ha6,&hb4,&hba, _
  98.         &hdb,&hd5,&hc7,&hc9,&he3,&hed,&hff,&hf1,&hab,&ha5,&hb7,&hb9,&h93,&h9d,&h8f,&h81, _
  99.         &h3b,&h35,&h27,&h29,&h03,&h0d,&h1f,&h11,&h4b,&h45,&h57,&h59,&h73,&h7d,&h6f,&h61, _
  100.         &had,&ha3,&hb1,&hbf,&h95,&h9b,&h89,&h87,&hdd,&hd3,&hc1,&hcf,&he5,&heb,&hf9,&hf7, _
  101.         &h4d,&h43,&h51,&h5f,&h75,&h7b,&h69,&h67,&h3d,&h33,&h21,&h2f,&h05,&h0b,&h19,&h17, _
  102.         &h76,&h78,&h6a,&h64,&h4e,&h40,&h52,&h5c,&h06,&h08,&h1a,&h14,&h3e,&h30,&h22,&h2c, _
  103.         &h96,&h98,&h8a,&h84,&hae,&ha0,&hb2,&hbc,&he6,&he8,&hfa,&hf4,&hde,&hd0,&hc2,&hcc, _
  104.         &h41,&h4f,&h5d,&h53,&h79,&h77,&h65,&h6b,&h31,&h3f,&h2d,&h23,&h09,&h07,&h15,&h1b, _
  105.         &ha1,&haf,&hbd,&hb3,&h99,&h97,&h85,&h8b,&hd1,&hdf,&hcd,&hc3,&he9,&he7,&hf5,&hfb, _
  106.         &h9a,&h94,&h86,&h88,&ha2,&hac,&hbe,&hb0,&hea,&he4,&hf6,&hf8,&hd2,&hdc,&hce,&hc0, _
  107.         &h7a,&h74,&h66,&h68,&h42,&h4c,&h5e,&h50,&h0a,&h04,&h16,&h18,&h32,&h3c,&h2e,&h20, _
  108.         &hec,&he2,&hf0,&hfe,&hd4,&hda,&hc8,&hc6,&h9c,&h92,&h80,&h8e,&ha4,&haa,&hb8,&hb6, _
  109.         &h0c,&h02,&h10,&h1e,&h34,&h3a,&h28,&h26,&h7c,&h72,&h60,&h6e,&h44,&h4a,&h58,&h56, _
  110.         &h37,&h39,&h2b,&h25,&h0f,&h01,&h13,&h1d,&h47,&h49,&h5b,&h55,&h7f,&h71,&h63,&h6d, _
  111.         &hd7,&hd9,&hcb,&hc5,&hef,&he1,&hf3,&hfd,&ha7,&ha9,&hbb,&hb5,&h9f,&h91,&h83,&h8d)
  112.  
  113.     sbox = Array( _
  114.         &h63, &h7c, &h77, &h7b, &hf2, &h6b, &h6f, &hc5, &h30, &h01, &h67, &h2b, &hfe, &hd7, &hab, &h76, _
  115.         &hca, &h82, &hc9, &h7d, &hfa, &h59, &h47, &hf0, &had, &hd4, &ha2, &haf, &h9c, &ha4, &h72, &hc0, _
  116.         &hb7, &hfd, &h93, &h26, &h36, &h3f, &hf7, &hcc, &h34, &ha5, &he5, &hf1, &h71, &hd8, &h31, &h15, _
  117.         &h04, &hc7, &h23, &hc3, &h18, &h96, &h05, &h9a, &h07, &h12, &h80, &he2, &heb, &h27, &hb2, &h75, _
  118.         &h09, &h83, &h2c, &h1a, &h1b, &h6e, &h5a, &ha0, &h52, &h3b, &hd6, &hb3, &h29, &he3, &h2f, &h84, _
  119.         &h53, &hd1, &h00, &hed, &h20, &hfc, &hb1, &h5b, &h6a, &hcb, &hbe, &h39, &h4a, &h4c, &h58, &hcf, _
  120.         &hd0, &hef, &haa, &hfb, &h43, &h4d, &h33, &h85, &h45, &hf9, &h02, &h7f, &h50, &h3c, &h9f, &ha8, _
  121.         &h51, &ha3, &h40, &h8f, &h92, &h9d, &h38, &hf5, &hbc, &hb6, &hda, &h21, &h10, &hff, &hf3, &hd2, _
  122.         &hcd, &h0c, &h13, &hec, &h5f, &h97, &h44, &h17, &hc4, &ha7, &h7e, &h3d, &h64, &h5d, &h19, &h73, _
  123.         &h60, &h81, &h4f, &hdc, &h22, &h2a, &h90, &h88, &h46, &hee, &hb8, &h14, &hde, &h5e, &h0b, &hdb, _
  124.         &he0, &h32, &h3a, &h0a, &h49, &h06, &h24, &h5c, &hc2, &hd3, &hac, &h62, &h91, &h95, &he4, &h79, _
  125.         &he7, &hc8, &h37, &h6d, &h8d, &hd5, &h4e, &ha9, &h6c, &h56, &hf4, &hea, &h65, &h7a, &hae, &h08, _
  126.         &hba, &h78, &h25, &h2e, &h1c, &ha6, &hb4, &hc6, &he8, &hdd, &h74, &h1f, &h4b, &hbd, &h8b, &h8a, _
  127.         &h70, &h3e, &hb5, &h66, &h48, &h03, &hf6, &h0e, &h61, &h35, &h57, &hb9, &h86, &hc1, &h1d, &h9e, _
  128.         &he1, &hf8, &h98, &h11, &h69, &hd9, &h8e, &h94, &h9b, &h1e, &h87, &he9, &hce, &h55, &h28, &hdf, _
  129.         &h8c, &ha1, &h89, &h0d, &hbf, &he6, &h42, &h68, &h41, &h99, &h2d, &h0f, &hb0, &h54, &hbb, &h16)
  130.  
  131.     sboxinv = Array( _
  132.         &h52, &h09, &h6a, &hd5, &h30, &h36, &ha5, &h38, &hbf, &h40, &ha3, &h9e, &h81, &hf3, &hd7, &hfb, _
  133.         &h7c, &he3, &h39, &h82, &h9b, &h2f, &hff, &h87, &h34, &h8e, &h43, &h44, &hc4, &hde, &he9, &hcb, _
  134.         &h54, &h7b, &h94, &h32, &ha6, &hc2, &h23, &h3d, &hee, &h4c, &h95, &h0b, &h42, &hfa, &hc3, &h4e, _
  135.         &h08, &h2e, &ha1, &h66, &h28, &hd9, &h24, &hb2, &h76, &h5b, &ha2, &h49, &h6d, &h8b, &hd1, &h25, _
  136.         &h72, &hf8, &hf6, &h64, &h86, &h68, &h98, &h16, &hd4, &ha4, &h5c, &hcc, &h5d, &h65, &hb6, &h92, _
  137.         &h6c, &h70, &h48, &h50, &hfd, &hed, &hb9, &hda, &h5e, &h15, &h46, &h57, &ha7, &h8d, &h9d, &h84, _
  138.         &h90, &hd8, &hab, &h00, &h8c, &hbc, &hd3, &h0a, &hf7, &he4, &h58, &h05, &hb8, &hb3, &h45, &h06, _
  139.         &hd0, &h2c, &h1e, &h8f, &hca, &h3f, &h0f, &h02, &hc1, &haf, &hbd, &h03, &h01, &h13, &h8a, &h6b, _
  140.         &h3a, &h91, &h11, &h41, &h4f, &h67, &hdc, &hea, &h97, &hf2, &hcf, &hce, &hf0, &hb4, &he6, &h73, _
  141.         &h96, &hac, &h74, &h22, &he7, &had, &h35, &h85, &he2, &hf9, &h37, &he8, &h1c, &h75, &hdf, &h6e, _
  142.         &h47, &hf1, &h1a, &h71, &h1d, &h29, &hc5, &h89, &h6f, &hb7, &h62, &h0e, &haa, &h18, &hbe, &h1b, _
  143.         &hfc, &h56, &h3e, &h4b, &hc6, &hd2, &h79, &h20, &h9a, &hdb, &hc0, &hfe, &h78, &hcd, &h5a, &hf4, _
  144.         &h1f, &hdd, &ha8, &h33, &h88, &h07, &hc7, &h31, &hb1, &h12, &h10, &h59, &h27, &h80, &hec, &h5f, _
  145.         &h60, &h51, &h7f, &ha9, &h19, &hb5, &h4a, &h0d, &h2d, &he5, &h7a, &h9f, &h93, &hc9, &h9c, &hef, _
  146.         &ha0, &he0, &h3b, &h4d, &hae, &h2a, &hf5, &hb0, &hc8, &heb, &hbb, &h3c, &h83, &h53, &h99, &h61, _
  147.         &h17, &h2b, &h04, &h7e, &hba, &h77, &hd6, &h26, &he1, &h69, &h14, &h63, &h55, &h21, &h0c, &h7d)
  148.  
  149.     rcon = Array( _
  150.         &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, _
  151.         &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, _
  152.         &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, _
  153.         &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, _
  154.         &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, _
  155.         &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, _
  156.         &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, _
  157.         &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, _
  158.         &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, _
  159.         &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, _
  160.         &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, _
  161.         &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, _
  162.         &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, _
  163.         &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, _
  164.         &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, _
  165.         &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb)
  166.  
  167.     Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
  168.     Dim sPlain, sPass, sCipher, sTemp, nonce(16), priorCipher(16)
  169.     Dim oFile1, oFS, oFile2
  170.     Dim x, r, y, temp(4), intTemp
  171.  
  172.     Set oFS = CreateObject("Scripting.FileSystemObject")
  173.     Set oFile1 = oFS.OpenTextFile(sFile, ForReading)
  174.  
  175.     If Right(sFile, 4) <> ".enc" Then
  176.         sFile = sFile & ".enc"
  177.         oFS.CreateTextFile sFile, 2, True
  178.         isEncode = True
  179.     Else
  180.         sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
  181.         oFS.CreateTextFile sFile, 2, True
  182.         isEncode = False
  183.     End If
  184.  
  185.     Set oFile2 = oFS.OpenTextFile(sFile, ForWriting)
  186.     Set oFS = Nothing
  187.  
  188.     For i = 0 To 15
  189.         nonce(i) = 0
  190.     Next
  191.  
  192.     For i = 0 To (Len(oPW.Value) - 1)
  193.         aesKey(i) = Asc(Mid(oPW.Value, i + 1, 1))
  194.     Next
  195.  
  196.     For i = Len(oPW.Value) To 31
  197.         aesKey(i) = 0
  198.     Next
  199.  
  200.     expandedKey = expandKey(aesKey, sbox, rcon)
  201.  
  202.     Do Until oFile1.AtEndOfStream
  203.         sPlain = oFile1.Read(1024)
  204.         sCipher = ""
  205.         j = 0
  206.         isDone = False
  207.  
  208.         Do Until isDone
  209.             sTemp = Mid(sPlain, j*16 + 1, 16)
  210.  
  211.             If Len(sTemp) < 16 Then
  212.                 For i = Len(sTemp) To 15
  213.                     sTemp = sTemp & Chr(0)
  214.                 Next
  215.             End If
  216.  
  217.             For i = 0 To 15
  218.                 block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
  219.             Next
  220.  
  221.             If (j + 1) * 16 >= Len(sPlain) Then
  222.                 isDone = True
  223.             End If
  224.  
  225.             j = j + 1
  226.  
  227.             If isEncode Then
  228.                 r= 0
  229.                 For i = 0 To 15
  230.                     block(i) = block(i) Xor nonce(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  231.                 Next
  232.  
  233.                 For x = 1 To 13
  234.                     block(0) = sbox(block(0))
  235.                     block(1) = sbox(block(1))
  236.                     block(2) = sbox(block(2))
  237.                     block(3) = sbox(block(3))
  238.  
  239.                     intTemp = sbox(block(4))
  240.                     block(4) = sbox(block(5))
  241.                     block(5) = sbox(block(6))
  242.                     block(6) = sbox(block(7))
  243.                     block(7) = intTemp
  244.  
  245.                     intTemp = sbox(block(8))
  246.                     block(8) = sbox(block(10))
  247.                     block(10) = intTemp
  248.                     intTemp = sbox(block(9))
  249.                     block(9) = sbox(block(11))
  250.                     block(11) = intTemp
  251.  
  252.                     intTemp = sbox(block(12))
  253.                     block(12) = sbox(block(15))
  254.                     block(15) = sbox(block(14))
  255.                     block(14) = sbox(block(13))
  256.                     block(13) = intTemp
  257.  
  258.                     r = x * 16
  259.                     For i = 0 To 3
  260.                         temp(0) = block(i)
  261.                         temp(1) = block(i+4)
  262.                         temp(2) = block(i+8)
  263.                         temp(3) = block(i+12)
  264.  
  265.                         block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r+i*4)
  266.                         block(i+4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r+i*4+1)
  267.                         block(i+8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r+i*4+2)
  268.                         block(i+12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r+i*4+3)
  269.                     Next
  270.                 Next
  271.  
  272.                 block(0) = sbox(block(0)) Xor expandedKey(224)
  273.                 block(1) = sbox(block(1)) Xor expandedKey(228)
  274.                 block(2) = sbox(block(2)) Xor expandedKey(232)
  275.                 block(3) = sbox(block(3)) Xor expandedKey(236)
  276.  
  277.                 intTemp = sbox(block(4)) Xor expandedKey(237)
  278.                 block(4) = sbox(block(5)) Xor expandedKey(225)
  279.                 block(5) = sbox(block(6)) Xor expandedKey(229)
  280.                 block(6) = sbox(block(7)) Xor expandedKey(233)
  281.                 block(7) = intTemp
  282.  
  283.                 intTemp = sbox(block(8)) Xor expandedKey(234)
  284.                 block(8) = sbox(block(10)) Xor expandedKey(226)
  285.                 block(10) = intTemp
  286.                 intTemp = sbox(block(9)) Xor expandedKey(238)
  287.                 block(9) = sbox(block(11)) Xor expandedKey(230)
  288.                 block(11) = intTemp
  289.  
  290.                 intTemp = sbox(block(12)) Xor expandedKey(231)
  291.                 block(12) = sbox(block(15)) Xor expandedKey(227)
  292.                 block(15) = sbox(block(14)) Xor expandedKey(239)
  293.                 block(14) = sbox(block(13)) Xor expandedKey(235)
  294.                 block(13) = intTemp
  295.  
  296.                 For i = 0 To 15
  297.                     nonce(i) = block(i)
  298.                 Next
  299.             Else
  300.                 For i = 0 To 15
  301.                     priorCipher(i) = block(i)
  302.                 Next
  303.  
  304.                 block(0) = sboxinv(block(0) Xor expandedKey(224))
  305.                 block(1) = sboxinv(block(1) Xor expandedKey(228))
  306.                 block(2) = sboxinv(block(2) Xor expandedKey(232))
  307.                 block(3) = sboxinv(block(3) Xor expandedKey(236))
  308.  
  309.                 intTemp = sboxinv(block(4) Xor expandedKey(225))
  310.                 block(4) = sboxinv(block(7) Xor expandedKey(237))
  311.                 block(7) = sboxinv(block(6) Xor expandedKey(233))
  312.                 block(6) = sboxinv(block(5) Xor expandedKey(229))
  313.                 block(5) = intTemp
  314.  
  315.                 intTemp = sboxinv(block(8) Xor expandedKey(226))
  316.                 block(8) = sboxinv(block(10) Xor expandedKey(234))
  317.                 block(10) = intTemp
  318.                 intTemp = sboxinv(block(9) Xor expandedKey(230))
  319.                 block(9) = sboxinv(block(11) Xor expandedKey(238))
  320.                 block(11) = intTemp
  321.  
  322.                 intTemp = sboxinv(block(12) Xor expandedKey(227))
  323.                 block(12) = sboxinv(block(13) Xor expandedKey(231))
  324.                 block(13) = sboxinv(block(14) Xor expandedKey(235))
  325.                 block(14) = sboxinv(block(15) Xor expandedKey(239))
  326.                 block(15) = intTemp
  327.  
  328.                 For x = 13 To 1 Step -1
  329.                     r = x * 16
  330.  
  331.                     For i = 0 To 3
  332.                         temp(0) = block(i) Xor expandedKey(r+i*4)
  333.                         temp(1) = block(i+4) Xor expandedKey(r+i*4+1)
  334.                         temp(2) = block(i+8) Xor expandedKey(r+i*4+2)
  335.                         temp(3) = block(i+12) Xor expandedKey(r+i*4+3)
  336.  
  337.                         block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
  338.                         block(i+4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
  339.                         block(i+8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
  340.                         block(i+12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
  341.                     Next
  342.  
  343.                     block(0) = sboxinv(block(0))
  344.                     block(1) = sboxinv(block(1))
  345.                     block(2) = sboxinv(block(2))
  346.                     block(3) = sboxinv(block(3))
  347.  
  348.                     intTemp = sboxinv(block(4))
  349.                     block(4) = sboxinv(block(7))
  350.                     block(7) = sboxinv(block(6))
  351.                     block(6) = sboxinv(block(5))
  352.                     block(5) = intTemp
  353.  
  354.                     intTemp = sboxinv(block(8))
  355.                     block(8) = sboxinv(block(10))
  356.                     block(10) = intTemp
  357.                     intTemp = sboxinv(block(9))
  358.                     block(9) = sboxinv(block(11))
  359.                     block(11) = intTemp
  360.  
  361.                     intTemp = sboxinv(block(12))
  362.                     block(12) = sboxinv(block(13))
  363.                     block(13) = sboxinv(block(14))
  364.                     block(14) = sboxinv(block(15))
  365.                     block(15) = intTemp
  366.                 Next
  367.  
  368.                 r= 0
  369.                 For i = 0 To 15
  370.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4)) Xor nonce(i)
  371.                     nonce(i) = priorCipher(i)
  372.                 Next
  373.             End If
  374.  
  375.             For i = 0 To 15
  376.                 sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
  377.             Next
  378.         Loop
  379.  
  380.         oFile2.Write sCipher
  381.     Loop
  382.  
  383.     oFile1.Close
  384.     Set oFile1 = Nothing
  385.     oFile2.Close
  386.     Set oFile2 = Nothing
  387. End Sub
Jan 24 '11 #1
Share this Article
Share on Google+
9 Comments


zmbd
Expert Mod 5K+
P: 5,397
Arthanzar, as well as I, ran into some issues using the original script as posted by Rabbit.

Thus, inspired by Arthanzar to post my version of Rabbit's code which I've had sitting around since... well... https://bytes.com/topic/access/answe...m-vba-vbscript looks like 2012ish

Once again... thank you Rabbit for all the hard work!

This is a VBA ready version of Rabbit's script
AES in CBC mode:

Open a new module and cut and paste.
Be mindful not to duplicate the first two lines if they already exist in your module by default:
Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2. Option Explicit
  3.  
  4. Sub RunAES(sFile, sPassIn)
  5. ''
  6. ''Based on code by Rabbit
  7. 'http://bytes.com/topic/access/insights/906850-aes-encryption-algorithm-vba-vbscript
  8. 'See the ECM version for the changes
  9.     Dim sbox(), sboxinv(), rcon()
  10.     Dim g2, g3, g9, g11, g13, g14
  11.  
  12.     g2 = Array( _
  13.         &H0, &H2, &H4, &H6, &H8, &HA, &HC, &HE, &H10, &H12, &H14, &H16, &H18, &H1A, &H1C, &H1E, _
  14.         &H20, &H22, &H24, &H26, &H28, &H2A, &H2C, &H2E, &H30, &H32, &H34, &H36, &H38, &H3A, &H3C, &H3E, _
  15.         &H40, &H42, &H44, &H46, &H48, &H4A, &H4C, &H4E, &H50, &H52, &H54, &H56, &H58, &H5A, &H5C, &H5E, _
  16.         &H60, &H62, &H64, &H66, &H68, &H6A, &H6C, &H6E, &H70, &H72, &H74, &H76, &H78, &H7A, &H7C, &H7E, _
  17.         &H80, &H82, &H84, &H86, &H88, &H8A, &H8C, &H8E, &H90, &H92, &H94, &H96, &H98, &H9A, &H9C, &H9E, _
  18.         &HA0, &HA2, &HA4, &HA6, &HA8, &HAA, &HAC, &HAE, &HB0, &HB2, &HB4, &HB6, &HB8, &HBA, &HBC, &HBE, _
  19.         &HC0, &HC2, &HC4, &HC6, &HC8, &HCA, &HCC, &HCE, &HD0, &HD2, &HD4, &HD6, &HD8, &HDA, &HDC, &HDE, _
  20.         &HE0, &HE2, &HE4, &HE6, &HE8, &HEA, &HEC, &HEE, &HF0, &HF2, &HF4, &HF6, &HF8, &HFA, &HFC, &HFE, _
  21.         &H1B, &H19, &H1F, &H1D, &H13, &H11, &H17, &H15, &HB, &H9, &HF, &HD, &H3, &H1, &H7, &H5, _
  22.         &H3B, &H39, &H3F, &H3D, &H33, &H31, &H37, &H35, &H2B, &H29, &H2F, &H2D, &H23, &H21, &H27, &H25, _
  23.         &H5B, &H59, &H5F, &H5D, &H53, &H51, &H57, &H55, &H4B, &H49, &H4F, &H4D, &H43, &H41, &H47, &H45, _
  24.         &H7B, &H79, &H7F, &H7D, &H73, &H71, &H77, &H75, &H6B, &H69, &H6F, &H6D, &H63, &H61, &H67, &H65, _
  25.         &H9B, &H99, &H9F, &H9D, &H93, &H91, &H97, &H95, &H8B, &H89, &H8F, &H8D, &H83, &H81, &H87, &H85, _
  26.         &HBB, &HB9, &HBF, &HBD, &HB3, &HB1, &HB7, &HB5, &HAB, &HA9, &HAF, &HAD, &HA3, &HA1, &HA7, &HA5, _
  27.         &HDB, &HD9, &HDF, &HDD, &HD3, &HD1, &HD7, &HD5, &HCB, &HC9, &HCF, &HCD, &HC3, &HC1, &HC7, &HC5, _
  28.         &HFB, &HF9, &HFF, &HFD, &HF3, &HF1, &HF7, &HF5, &HEB, &HE9, &HEF, &HED, &HE3, &HE1, &HE7, &HE5)
  29.  
  30.     g3 = Array( _
  31.         &H0, &H3, &H6, &H5, &HC, &HF, &HA, &H9, &H18, &H1B, &H1E, &H1D, &H14, &H17, &H12, &H11, _
  32.         &H30, &H33, &H36, &H35, &H3C, &H3F, &H3A, &H39, &H28, &H2B, &H2E, &H2D, &H24, &H27, &H22, &H21, _
  33.         &H60, &H63, &H66, &H65, &H6C, &H6F, &H6A, &H69, &H78, &H7B, &H7E, &H7D, &H74, &H77, &H72, &H71, _
  34.         &H50, &H53, &H56, &H55, &H5C, &H5F, &H5A, &H59, &H48, &H4B, &H4E, &H4D, &H44, &H47, &H42, &H41, _
  35.         &HC0, &HC3, &HC6, &HC5, &HCC, &HCF, &HCA, &HC9, &HD8, &HDB, &HDE, &HDD, &HD4, &HD7, &HD2, &HD1, _
  36.         &HF0, &HF3, &HF6, &HF5, &HFC, &HFF, &HFA, &HF9, &HE8, &HEB, &HEE, &HED, &HE4, &HE7, &HE2, &HE1, _
  37.         &HA0, &HA3, &HA6, &HA5, &HAC, &HAF, &HAA, &HA9, &HB8, &HBB, &HBE, &HBD, &HB4, &HB7, &HB2, &HB1, _
  38.         &H90, &H93, &H96, &H95, &H9C, &H9F, &H9A, &H99, &H88, &H8B, &H8E, &H8D, &H84, &H87, &H82, &H81, _
  39.         &H9B, &H98, &H9D, &H9E, &H97, &H94, &H91, &H92, &H83, &H80, &H85, &H86, &H8F, &H8C, &H89, &H8A, _
  40.         &HAB, &HA8, &HAD, &HAE, &HA7, &HA4, &HA1, &HA2, &HB3, &HB0, &HB5, &HB6, &HBF, &HBC, &HB9, &HBA, _
  41.         &HFB, &HF8, &HFD, &HFE, &HF7, &HF4, &HF1, &HF2, &HE3, &HE0, &HE5, &HE6, &HEF, &HEC, &HE9, &HEA, _
  42.         &HCB, &HC8, &HCD, &HCE, &HC7, &HC4, &HC1, &HC2, &HD3, &HD0, &HD5, &HD6, &HDF, &HDC, &HD9, &HDA, _
  43.         &H5B, &H58, &H5D, &H5E, &H57, &H54, &H51, &H52, &H43, &H40, &H45, &H46, &H4F, &H4C, &H49, &H4A, _
  44.         &H6B, &H68, &H6D, &H6E, &H67, &H64, &H61, &H62, &H73, &H70, &H75, &H76, &H7F, &H7C, &H79, &H7A, _
  45.         &H3B, &H38, &H3D, &H3E, &H37, &H34, &H31, &H32, &H23, &H20, &H25, &H26, &H2F, &H2C, &H29, &H2A, _
  46.         &HB, &H8, &HD, &HE, &H7, &H4, &H1, &H2, &H13, &H10, &H15, &H16, &H1F, &H1C, &H19, &H1A)
  47.  
  48.     g9 = Array( _
  49.         &H0, &H9, &H12, &H1B, &H24, &H2D, &H36, &H3F, &H48, &H41, &H5A, &H53, &H6C, &H65, &H7E, &H77, _
  50.         &H90, &H99, &H82, &H8B, &HB4, &HBD, &HA6, &HAF, &HD8, &HD1, &HCA, &HC3, &HFC, &HF5, &HEE, &HE7, _
  51.         &H3B, &H32, &H29, &H20, &H1F, &H16, &HD, &H4, &H73, &H7A, &H61, &H68, &H57, &H5E, &H45, &H4C, _
  52.         &HAB, &HA2, &HB9, &HB0, &H8F, &H86, &H9D, &H94, &HE3, &HEA, &HF1, &HF8, &HC7, &HCE, &HD5, &HDC, _
  53.         &H76, &H7F, &H64, &H6D, &H52, &H5B, &H40, &H49, &H3E, &H37, &H2C, &H25, &H1A, &H13, &H8, &H1, _
  54.         &HE6, &HEF, &HF4, &HFD, &HC2, &HCB, &HD0, &HD9, &HAE, &HA7, &HBC, &HB5, &H8A, &H83, &H98, &H91, _
  55.         &H4D, &H44, &H5F, &H56, &H69, &H60, &H7B, &H72, &H5, &HC, &H17, &H1E, &H21, &H28, &H33, &H3A, _
  56.         &HDD, &HD4, &HCF, &HC6, &HF9, &HF0, &HEB, &HE2, &H95, &H9C, &H87, &H8E, &HB1, &HB8, &HA3, &HAA, _
  57.         &HEC, &HE5, &HFE, &HF7, &HC8, &HC1, &HDA, &HD3, &HA4, &HAD, &HB6, &HBF, &H80, &H89, &H92, &H9B, _
  58.         &H7C, &H75, &H6E, &H67, &H58, &H51, &H4A, &H43, &H34, &H3D, &H26, &H2F, &H10, &H19, &H2, &HB, _
  59.         &HD7, &HDE, &HC5, &HCC, &HF3, &HFA, &HE1, &HE8, &H9F, &H96, &H8D, &H84, &HBB, &HB2, &HA9, &HA0, _
  60.         &H47, &H4E, &H55, &H5C, &H63, &H6A, &H71, &H78, &HF, &H6, &H1D, &H14, &H2B, &H22, &H39, &H30, _
  61.         &H9A, &H93, &H88, &H81, &HBE, &HB7, &HAC, &HA5, &HD2, &HDB, &HC0, &HC9, &HF6, &HFF, &HE4, &HED, _
  62.         &HA, &H3, &H18, &H11, &H2E, &H27, &H3C, &H35, &H42, &H4B, &H50, &H59, &H66, &H6F, &H74, &H7D, _
  63.         &HA1, &HA8, &HB3, &HBA, &H85, &H8C, &H97, &H9E, &HE9, &HE0, &HFB, &HF2, &HCD, &HC4, &HDF, &HD6, _
  64.         &H31, &H38, &H23, &H2A, &H15, &H1C, &H7, &HE, &H79, &H70, &H6B, &H62, &H5D, &H54, &H4F, &H46)
  65.  
  66.     g11 = Array( _
  67.         &H0, &HB, &H16, &H1D, &H2C, &H27, &H3A, &H31, &H58, &H53, &H4E, &H45, &H74, &H7F, &H62, &H69, _
  68.         &HB0, &HBB, &HA6, &HAD, &H9C, &H97, &H8A, &H81, &HE8, &HE3, &HFE, &HF5, &HC4, &HCF, &HD2, &HD9, _
  69.         &H7B, &H70, &H6D, &H66, &H57, &H5C, &H41, &H4A, &H23, &H28, &H35, &H3E, &HF, &H4, &H19, &H12, _
  70.         &HCB, &HC0, &HDD, &HD6, &HE7, &HEC, &HF1, &HFA, &H93, &H98, &H85, &H8E, &HBF, &HB4, &HA9, &HA2, _
  71.         &HF6, &HFD, &HE0, &HEB, &HDA, &HD1, &HCC, &HC7, &HAE, &HA5, &HB8, &HB3, &H82, &H89, &H94, &H9F, _
  72.         &H46, &H4D, &H50, &H5B, &H6A, &H61, &H7C, &H77, &H1E, &H15, &H8, &H3, &H32, &H39, &H24, &H2F, _
  73.         &H8D, &H86, &H9B, &H90, &HA1, &HAA, &HB7, &HBC, &HD5, &HDE, &HC3, &HC8, &HF9, &HF2, &HEF, &HE4, _
  74.         &H3D, &H36, &H2B, &H20, &H11, &H1A, &H7, &HC, &H65, &H6E, &H73, &H78, &H49, &H42, &H5F, &H54, _
  75.         &HF7, &HFC, &HE1, &HEA, &HDB, &HD0, &HCD, &HC6, &HAF, &HA4, &HB9, &HB2, &H83, &H88, &H95, &H9E, _
  76.         &H47, &H4C, &H51, &H5A, &H6B, &H60, &H7D, &H76, &H1F, &H14, &H9, &H2, &H33, &H38, &H25, &H2E, _
  77.         &H8C, &H87, &H9A, &H91, &HA0, &HAB, &HB6, &HBD, &HD4, &HDF, &HC2, &HC9, &HF8, &HF3, &HEE, &HE5, _
  78.         &H3C, &H37, &H2A, &H21, &H10, &H1B, &H6, &HD, &H64, &H6F, &H72, &H79, &H48, &H43, &H5E, &H55, _
  79.         &H1, &HA, &H17, &H1C, &H2D, &H26, &H3B, &H30, &H59, &H52, &H4F, &H44, &H75, &H7E, &H63, &H68, _
  80.         &HB1, &HBA, &HA7, &HAC, &H9D, &H96, &H8B, &H80, &HE9, &HE2, &HFF, &HF4, &HC5, &HCE, &HD3, &HD8, _
  81.         &H7A, &H71, &H6C, &H67, &H56, &H5D, &H40, &H4B, &H22, &H29, &H34, &H3F, &HE, &H5, &H18, &H13, _
  82.         &HCA, &HC1, &HDC, &HD7, &HE6, &HED, &HF0, &HFB, &H92, &H99, &H84, &H8F, &HBE, &HB5, &HA8, &HA3)
  83.  
  84.     g13 = Array( _
  85.         &H0, &HD, &H1A, &H17, &H34, &H39, &H2E, &H23, &H68, &H65, &H72, &H7F, &H5C, &H51, &H46, &H4B, _
  86.         &HD0, &HDD, &HCA, &HC7, &HE4, &HE9, &HFE, &HF3, &HB8, &HB5, &HA2, &HAF, &H8C, &H81, &H96, &H9B, _
  87.         &HBB, &HB6, &HA1, &HAC, &H8F, &H82, &H95, &H98, &HD3, &HDE, &HC9, &HC4, &HE7, &HEA, &HFD, &HF0, _
  88.         &H6B, &H66, &H71, &H7C, &H5F, &H52, &H45, &H48, &H3, &HE, &H19, &H14, &H37, &H3A, &H2D, &H20, _
  89.         &H6D, &H60, &H77, &H7A, &H59, &H54, &H43, &H4E, &H5, &H8, &H1F, &H12, &H31, &H3C, &H2B, &H26, _
  90.         &HBD, &HB0, &HA7, &HAA, &H89, &H84, &H93, &H9E, &HD5, &HD8, &HCF, &HC2, &HE1, &HEC, &HFB, &HF6, _
  91.         &HD6, &HDB, &HCC, &HC1, &HE2, &HEF, &HF8, &HF5, &HBE, &HB3, &HA4, &HA9, &H8A, &H87, &H90, &H9D, _
  92.         &H6, &HB, &H1C, &H11, &H32, &H3F, &H28, &H25, &H6E, &H63, &H74, &H79, &H5A, &H57, &H40, &H4D, _
  93.         &HDA, &HD7, &HC0, &HCD, &HEE, &HE3, &HF4, &HF9, &HB2, &HBF, &HA8, &HA5, &H86, &H8B, &H9C, &H91, _
  94.         &HA, &H7, &H10, &H1D, &H3E, &H33, &H24, &H29, &H62, &H6F, &H78, &H75, &H56, &H5B, &H4C, &H41, _
  95.         &H61, &H6C, &H7B, &H76, &H55, &H58, &H4F, &H42, &H9, &H4, &H13, &H1E, &H3D, &H30, &H27, &H2A, _
  96.         &HB1, &HBC, &HAB, &HA6, &H85, &H88, &H9F, &H92, &HD9, &HD4, &HC3, &HCE, &HED, &HE0, &HF7, &HFA, _
  97.         &HB7, &HBA, &HAD, &HA0, &H83, &H8E, &H99, &H94, &HDF, &HD2, &HC5, &HC8, &HEB, &HE6, &HF1, &HFC, _
  98.         &H67, &H6A, &H7D, &H70, &H53, &H5E, &H49, &H44, &HF, &H2, &H15, &H18, &H3B, &H36, &H21, &H2C, _
  99.         &HC, &H1, &H16, &H1B, &H38, &H35, &H22, &H2F, &H64, &H69, &H7E, &H73, &H50, &H5D, &H4A, &H47, _
  100.         &HDC, &HD1, &HC6, &HCB, &HE8, &HE5, &HF2, &HFF, &HB4, &HB9, &HAE, &HA3, &H80, &H8D, &H9A, &H97)
  101.  
  102.     g14 = Array( _
  103.         &H0, &HE, &H1C, &H12, &H38, &H36, &H24, &H2A, &H70, &H7E, &H6C, &H62, &H48, &H46, &H54, &H5A, _
  104.         &HE0, &HEE, &HFC, &HF2, &HD8, &HD6, &HC4, &HCA, &H90, &H9E, &H8C, &H82, &HA8, &HA6, &HB4, &HBA, _
  105.         &HDB, &HD5, &HC7, &HC9, &HE3, &HED, &HFF, &HF1, &HAB, &HA5, &HB7, &HB9, &H93, &H9D, &H8F, &H81, _
  106.         &H3B, &H35, &H27, &H29, &H3, &HD, &H1F, &H11, &H4B, &H45, &H57, &H59, &H73, &H7D, &H6F, &H61, _
  107.         &HAD, &HA3, &HB1, &HBF, &H95, &H9B, &H89, &H87, &HDD, &HD3, &HC1, &HCF, &HE5, &HEB, &HF9, &HF7, _
  108.         &H4D, &H43, &H51, &H5F, &H75, &H7B, &H69, &H67, &H3D, &H33, &H21, &H2F, &H5, &HB, &H19, &H17, _
  109.         &H76, &H78, &H6A, &H64, &H4E, &H40, &H52, &H5C, &H6, &H8, &H1A, &H14, &H3E, &H30, &H22, &H2C, _
  110.         &H96, &H98, &H8A, &H84, &HAE, &HA0, &HB2, &HBC, &HE6, &HE8, &HFA, &HF4, &HDE, &HD0, &HC2, &HCC, _
  111.         &H41, &H4F, &H5D, &H53, &H79, &H77, &H65, &H6B, &H31, &H3F, &H2D, &H23, &H9, &H7, &H15, &H1B, _
  112.         &HA1, &HAF, &HBD, &HB3, &H99, &H97, &H85, &H8B, &HD1, &HDF, &HCD, &HC3, &HE9, &HE7, &HF5, &HFB, _
  113.         &H9A, &H94, &H86, &H88, &HA2, &HAC, &HBE, &HB0, &HEA, &HE4, &HF6, &HF8, &HD2, &HDC, &HCE, &HC0, _
  114.         &H7A, &H74, &H66, &H68, &H42, &H4C, &H5E, &H50, &HA, &H4, &H16, &H18, &H32, &H3C, &H2E, &H20, _
  115.         &HEC, &HE2, &HF0, &HFE, &HD4, &HDA, &HC8, &HC6, &H9C, &H92, &H80, &H8E, &HA4, &HAA, &HB8, &HB6, _
  116.         &HC, &H2, &H10, &H1E, &H34, &H3A, &H28, &H26, &H7C, &H72, &H60, &H6E, &H44, &H4A, &H58, &H56, _
  117.         &H37, &H39, &H2B, &H25, &HF, &H1, &H13, &H1D, &H47, &H49, &H5B, &H55, &H7F, &H71, &H63, &H6D, _
  118.         &HD7, &HD9, &HCB, &HC5, &HEF, &HE1, &HF3, &HFD, &HA7, &HA9, &HBB, &HB5, &H9F, &H91, &H83, &H8D)
  119.  
  120.     sbox = Array( _
  121.         &H63, &H7C, &H77, &H7B, &HF2, &H6B, &H6F, &HC5, &H30, &H1, &H67, &H2B, &HFE, &HD7, &HAB, &H76, _
  122.         &HCA, &H82, &HC9, &H7D, &HFA, &H59, &H47, &HF0, &HAD, &HD4, &HA2, &HAF, &H9C, &HA4, &H72, &HC0, _
  123.         &HB7, &HFD, &H93, &H26, &H36, &H3F, &HF7, &HCC, &H34, &HA5, &HE5, &HF1, &H71, &HD8, &H31, &H15, _
  124.         &H4, &HC7, &H23, &HC3, &H18, &H96, &H5, &H9A, &H7, &H12, &H80, &HE2, &HEB, &H27, &HB2, &H75, _
  125.         &H9, &H83, &H2C, &H1A, &H1B, &H6E, &H5A, &HA0, &H52, &H3B, &HD6, &HB3, &H29, &HE3, &H2F, &H84, _
  126.         &H53, &HD1, &H0, &HED, &H20, &HFC, &HB1, &H5B, &H6A, &HCB, &HBE, &H39, &H4A, &H4C, &H58, &HCF, _
  127.         &HD0, &HEF, &HAA, &HFB, &H43, &H4D, &H33, &H85, &H45, &HF9, &H2, &H7F, &H50, &H3C, &H9F, &HA8, _
  128.         &H51, &HA3, &H40, &H8F, &H92, &H9D, &H38, &HF5, &HBC, &HB6, &HDA, &H21, &H10, &HFF, &HF3, &HD2, _
  129.         &HCD, &HC, &H13, &HEC, &H5F, &H97, &H44, &H17, &HC4, &HA7, &H7E, &H3D, &H64, &H5D, &H19, &H73, _
  130.         &H60, &H81, &H4F, &HDC, &H22, &H2A, &H90, &H88, &H46, &HEE, &HB8, &H14, &HDE, &H5E, &HB, &HDB, _
  131.         &HE0, &H32, &H3A, &HA, &H49, &H6, &H24, &H5C, &HC2, &HD3, &HAC, &H62, &H91, &H95, &HE4, &H79, _
  132.         &HE7, &HC8, &H37, &H6D, &H8D, &HD5, &H4E, &HA9, &H6C, &H56, &HF4, &HEA, &H65, &H7A, &HAE, &H8, _
  133.         &HBA, &H78, &H25, &H2E, &H1C, &HA6, &HB4, &HC6, &HE8, &HDD, &H74, &H1F, &H4B, &HBD, &H8B, &H8A, _
  134.         &H70, &H3E, &HB5, &H66, &H48, &H3, &HF6, &HE, &H61, &H35, &H57, &HB9, &H86, &HC1, &H1D, &H9E, _
  135.         &HE1, &HF8, &H98, &H11, &H69, &HD9, &H8E, &H94, &H9B, &H1E, &H87, &HE9, &HCE, &H55, &H28, &HDF, _
  136.         &H8C, &HA1, &H89, &HD, &HBF, &HE6, &H42, &H68, &H41, &H99, &H2D, &HF, &HB0, &H54, &HBB, &H16)
  137.  
  138.     sboxinv = Array( _
  139.         &H52, &H9, &H6A, &HD5, &H30, &H36, &HA5, &H38, &HBF, &H40, &HA3, &H9E, &H81, &HF3, &HD7, &HFB, _
  140.         &H7C, &HE3, &H39, &H82, &H9B, &H2F, &HFF, &H87, &H34, &H8E, &H43, &H44, &HC4, &HDE, &HE9, &HCB, _
  141.         &H54, &H7B, &H94, &H32, &HA6, &HC2, &H23, &H3D, &HEE, &H4C, &H95, &HB, &H42, &HFA, &HC3, &H4E, _
  142.         &H8, &H2E, &HA1, &H66, &H28, &HD9, &H24, &HB2, &H76, &H5B, &HA2, &H49, &H6D, &H8B, &HD1, &H25, _
  143.         &H72, &HF8, &HF6, &H64, &H86, &H68, &H98, &H16, &HD4, &HA4, &H5C, &HCC, &H5D, &H65, &HB6, &H92, _
  144.         &H6C, &H70, &H48, &H50, &HFD, &HED, &HB9, &HDA, &H5E, &H15, &H46, &H57, &HA7, &H8D, &H9D, &H84, _
  145.         &H90, &HD8, &HAB, &H0, &H8C, &HBC, &HD3, &HA, &HF7, &HE4, &H58, &H5, &HB8, &HB3, &H45, &H6, _
  146.         &HD0, &H2C, &H1E, &H8F, &HCA, &H3F, &HF, &H2, &HC1, &HAF, &HBD, &H3, &H1, &H13, &H8A, &H6B, _
  147.         &H3A, &H91, &H11, &H41, &H4F, &H67, &HDC, &HEA, &H97, &HF2, &HCF, &HCE, &HF0, &HB4, &HE6, &H73, _
  148.         &H96, &HAC, &H74, &H22, &HE7, &HAD, &H35, &H85, &HE2, &HF9, &H37, &HE8, &H1C, &H75, &HDF, &H6E, _
  149.         &H47, &HF1, &H1A, &H71, &H1D, &H29, &HC5, &H89, &H6F, &HB7, &H62, &HE, &HAA, &H18, &HBE, &H1B, _
  150.         &HFC, &H56, &H3E, &H4B, &HC6, &HD2, &H79, &H20, &H9A, &HDB, &HC0, &HFE, &H78, &HCD, &H5A, &HF4, _
  151.         &H1F, &HDD, &HA8, &H33, &H88, &H7, &HC7, &H31, &HB1, &H12, &H10, &H59, &H27, &H80, &HEC, &H5F, _
  152.         &H60, &H51, &H7F, &HA9, &H19, &HB5, &H4A, &HD, &H2D, &HE5, &H7A, &H9F, &H93, &HC9, &H9C, &HEF, _
  153.         &HA0, &HE0, &H3B, &H4D, &HAE, &H2A, &HF5, &HB0, &HC8, &HEB, &HBB, &H3C, &H83, &H53, &H99, &H61, _
  154.         &H17, &H2B, &H4, &H7E, &HBA, &H77, &HD6, &H26, &HE1, &H69, &H14, &H63, &H55, &H21, &HC, &H7D)
  155.  
  156.     rcon = Array( _
  157.         &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, _
  158.         &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, _
  159.         &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, _
  160.         &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, _
  161.         &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, _
  162.         &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, _
  163.         &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, _
  164.         &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, _
  165.         &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, _
  166.         &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, _
  167.         &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, _
  168.         &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, _
  169.         &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, _
  170.         &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, _
  171.         &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, _
  172.         &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB)
  173.  
  174.     Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
  175.     Dim sPlain, sPass, sCipher, sTemp, nonce(16), priorCipher(16)
  176.     Dim oFile1, oFS, oFile2
  177.     Dim x, r, y, temp(4), intTemp
  178.     Const forreading = 1, forwriting = 2, forappend = 8
  179.  
  180.     Set oFS = CreateObject("Scripting.FileSystemObject")
  181.     Set oFile1 = oFS.OpenTextFile(sFile, forreading)
  182.  
  183.     If Right(sFile, 4) <> ".enc" Then
  184.         sFile = sFile & ".enc"
  185.         oFS.CreateTextFile sFile, 2, True
  186.         isEncode = True
  187.     Else
  188.         sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
  189.         oFS.CreateTextFile sFile, 2, True
  190.         isEncode = False
  191.     End If
  192.  
  193.     Set oFile2 = oFS.OpenTextFile(sFile, forwriting)
  194.     Set oFS = Nothing
  195.  
  196.     For i = 0 To 15
  197.         nonce(i) = 0
  198.     Next
  199.  
  200. '    For i = 0 To (Len(oPW.value) - 1)
  201. '        aesKey(i) = Asc(Mid(oPW.value, i + 1, 1))
  202. '    Next
  203.     For i = 0 To (Len(sPassIn) - 1)
  204.         aesKey(i) = Asc(Mid(sPassIn, i + 1, 1))
  205.     Next
  206.  
  207. '    For i = Len(oPW.value) To 31
  208. '        aesKey(i) = 0
  209. '    Next
  210.      For i = Len(sPassIn) To 31
  211.         aesKey(i) = 0
  212.     Next
  213.  
  214.     expandedKey = expandKey(aesKey, sbox, rcon)
  215.  
  216.     Do Until oFile1.AtEndOfStream
  217.         sPlain = oFile1.Read(1024)
  218.         sCipher = ""
  219.         j = 0
  220.         isDone = False
  221.  
  222.         Do Until isDone
  223.             sTemp = Mid(sPlain, j * 16 + 1, 16)
  224.  
  225.             If Len(sTemp) < 16 Then
  226.                 For i = Len(sTemp) To 15
  227.                     sTemp = sTemp & Chr(0)
  228.                 Next
  229.             End If
  230.  
  231.             For i = 0 To 15
  232.                 block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
  233.             Next
  234.  
  235.             If (j + 1) * 16 >= Len(sPlain) Then
  236.                 isDone = True
  237.             End If
  238.  
  239.             j = j + 1
  240.  
  241.             If isEncode Then
  242.                 r = 0
  243.                 For i = 0 To 15
  244.                     block(i) = block(i) Xor nonce(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  245.                 Next
  246.  
  247.                 For x = 1 To 13
  248.                     block(0) = sbox(block(0))
  249.                     block(1) = sbox(block(1))
  250.                     block(2) = sbox(block(2))
  251.                     block(3) = sbox(block(3))
  252.  
  253.                     intTemp = sbox(block(4))
  254.                     block(4) = sbox(block(5))
  255.                     block(5) = sbox(block(6))
  256.                     block(6) = sbox(block(7))
  257.                     block(7) = intTemp
  258.  
  259.                     intTemp = sbox(block(8))
  260.                     block(8) = sbox(block(10))
  261.                     block(10) = intTemp
  262.                     intTemp = sbox(block(9))
  263.                     block(9) = sbox(block(11))
  264.                     block(11) = intTemp
  265.  
  266.                     intTemp = sbox(block(12))
  267.                     block(12) = sbox(block(15))
  268.                     block(15) = sbox(block(14))
  269.                     block(14) = sbox(block(13))
  270.                     block(13) = intTemp
  271.  
  272.                     r = x * 16
  273.                     For i = 0 To 3
  274.                         temp(0) = block(i)
  275.                         temp(1) = block(i + 4)
  276.                         temp(2) = block(i + 8)
  277.                         temp(3) = block(i + 12)
  278.  
  279.                         block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r + i * 4)
  280.                         block(i + 4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r + i * 4 + 1)
  281.                         block(i + 8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r + i * 4 + 2)
  282.                         block(i + 12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r + i * 4 + 3)
  283.                     Next
  284.                 Next
  285.  
  286.                 block(0) = sbox(block(0)) Xor expandedKey(224)
  287.                 block(1) = sbox(block(1)) Xor expandedKey(228)
  288.                 block(2) = sbox(block(2)) Xor expandedKey(232)
  289.                 block(3) = sbox(block(3)) Xor expandedKey(236)
  290.  
  291.                 intTemp = sbox(block(4)) Xor expandedKey(237)
  292.                 block(4) = sbox(block(5)) Xor expandedKey(225)
  293.                 block(5) = sbox(block(6)) Xor expandedKey(229)
  294.                 block(6) = sbox(block(7)) Xor expandedKey(233)
  295.                 block(7) = intTemp
  296.  
  297.                 intTemp = sbox(block(8)) Xor expandedKey(234)
  298.                 block(8) = sbox(block(10)) Xor expandedKey(226)
  299.                 block(10) = intTemp
  300.                 intTemp = sbox(block(9)) Xor expandedKey(238)
  301.                 block(9) = sbox(block(11)) Xor expandedKey(230)
  302.                 block(11) = intTemp
  303.  
  304.                 intTemp = sbox(block(12)) Xor expandedKey(231)
  305.                 block(12) = sbox(block(15)) Xor expandedKey(227)
  306.                 block(15) = sbox(block(14)) Xor expandedKey(239)
  307.                 block(14) = sbox(block(13)) Xor expandedKey(235)
  308.                 block(13) = intTemp
  309.  
  310.                 For i = 0 To 15
  311.                     nonce(i) = block(i)
  312.                 Next
  313.             Else
  314.                 For i = 0 To 15
  315.                     priorCipher(i) = block(i)
  316.                 Next
  317.  
  318.                 block(0) = sboxinv(block(0) Xor expandedKey(224))
  319.                 block(1) = sboxinv(block(1) Xor expandedKey(228))
  320.                 block(2) = sboxinv(block(2) Xor expandedKey(232))
  321.                 block(3) = sboxinv(block(3) Xor expandedKey(236))
  322.  
  323.                 intTemp = sboxinv(block(4) Xor expandedKey(225))
  324.                 block(4) = sboxinv(block(7) Xor expandedKey(237))
  325.                 block(7) = sboxinv(block(6) Xor expandedKey(233))
  326.                 block(6) = sboxinv(block(5) Xor expandedKey(229))
  327.                 block(5) = intTemp
  328.  
  329.                 intTemp = sboxinv(block(8) Xor expandedKey(226))
  330.                 block(8) = sboxinv(block(10) Xor expandedKey(234))
  331.                 block(10) = intTemp
  332.                 intTemp = sboxinv(block(9) Xor expandedKey(230))
  333.                 block(9) = sboxinv(block(11) Xor expandedKey(238))
  334.                 block(11) = intTemp
  335.  
  336.                 intTemp = sboxinv(block(12) Xor expandedKey(227))
  337.                 block(12) = sboxinv(block(13) Xor expandedKey(231))
  338.                 block(13) = sboxinv(block(14) Xor expandedKey(235))
  339.                 block(14) = sboxinv(block(15) Xor expandedKey(239))
  340.                 block(15) = intTemp
  341.  
  342.                 For x = 13 To 1 Step -1
  343.                     r = x * 16
  344.  
  345.                     For i = 0 To 3
  346.                         temp(0) = block(i) Xor expandedKey(r + i * 4)
  347.                         temp(1) = block(i + 4) Xor expandedKey(r + i * 4 + 1)
  348.                         temp(2) = block(i + 8) Xor expandedKey(r + i * 4 + 2)
  349.                         temp(3) = block(i + 12) Xor expandedKey(r + i * 4 + 3)
  350.  
  351.                         block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
  352.                         block(i + 4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
  353.                         block(i + 8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
  354.                         block(i + 12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
  355.                     Next
  356.  
  357.                     block(0) = sboxinv(block(0))
  358.                     block(1) = sboxinv(block(1))
  359.                     block(2) = sboxinv(block(2))
  360.                     block(3) = sboxinv(block(3))
  361.  
  362.                     intTemp = sboxinv(block(4))
  363.                     block(4) = sboxinv(block(7))
  364.                     block(7) = sboxinv(block(6))
  365.                     block(6) = sboxinv(block(5))
  366.                     block(5) = intTemp
  367.  
  368.                     intTemp = sboxinv(block(8))
  369.                     block(8) = sboxinv(block(10))
  370.                     block(10) = intTemp
  371.                     intTemp = sboxinv(block(9))
  372.                     block(9) = sboxinv(block(11))
  373.                     block(11) = intTemp
  374.  
  375.                     intTemp = sboxinv(block(12))
  376.                     block(12) = sboxinv(block(13))
  377.                     block(13) = sboxinv(block(14))
  378.                     block(14) = sboxinv(block(15))
  379.                     block(15) = intTemp
  380.                 Next
  381.  
  382.                 r = 0
  383.                 For i = 0 To 15
  384.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4)) Xor nonce(i)
  385.                     nonce(i) = priorCipher(i)
  386.                 Next
  387.             End If
  388.  
  389.             For i = 0 To 15
  390.                 sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
  391.             Next
  392.         Loop
  393.  
  394.         oFile2.Write sCipher
  395.     Loop
  396.  
  397.     oFile1.Close
  398.     Set oFile1 = Nothing
  399.     oFile2.Close
  400.     Set oFile2 = Nothing
  401. End Sub
  402.  
  403. Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
  404.     'MOD added () to array variables
  405.     Dim rConIter, temp(), i, result(240)
  406.  
  407.     ReDim temp(4)
  408.     rConIter = 1
  409.  
  410.     For i = 0 To 31
  411.         result(i) = key(i)
  412.     Next
  413.  
  414.     For i = 32 To 239 Step 4
  415.         temp(0) = result(i - 4)
  416.         temp(1) = result(i - 3)
  417.         temp(2) = result(i - 2)
  418.         temp(3) = result(i - 1)
  419.  
  420.         If i Mod 32 = 0 Then
  421.             temp = keyScheduleCore(temp, rConIter, box, rcon)
  422.             rConIter = rConIter + 1
  423.         End If
  424.  
  425.         If i Mod 32 = 16 Then
  426.             temp(0) = box(temp(0))
  427.             temp(1) = box(temp(1))
  428.             temp(2) = box(temp(2))
  429.             temp(3) = box(temp(3))
  430.         End If
  431.  
  432.         result(i) = result(i - 32) Xor temp(0)
  433.         result(i + 1) = result(i - 31) Xor temp(1)
  434.         result(i + 2) = result(i - 30) Xor temp(2)
  435.         result(i + 3) = result(i - 29) Xor temp(3)
  436.     Next
  437.  
  438.     expandKey = result
  439. End Function
  440.  
Nov 9 '15 #2

zmbd
Expert Mod 5K+
P: 5,397
and this is, what I believe to be the ECB version:

I include this here for academic reasons only, from my very limited understanding of encryption algorithms, ECB is a weaker form of encryption; therefore, one should normally use the CBC mode.

Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2. Option Explicit
  3. Sub ztestaes()
  4.     AES "w:\test.txt.enc", "zmbd"
  5. End Sub
  6.  
  7. Sub AES_ECB(sFile, sPassIn)
  8. ''
  9. ''Based on code by Rabbit
  10. 'http://bytes.com/topic/access/insights/906850-aes-encryption-algorithm-vba-vbscript
  11. '
  12. '<<Mod added the sPassin parameter>>
  13. '<<Mod added () at the end of the following array variables>>
  14.     Dim sbox(), sboxinv(), rcon()
  15.     Dim g2(), g3(), g9(), g11(), g13(), g14()
  16.  
  17.     g2 = Array( _
  18.         &H0, &H2, &H4, &H6, &H8, &HA, &HC, &HE, &H10, &H12, &H14, &H16, &H18, &H1A, &H1C, &H1E, _
  19.         &H20, &H22, &H24, &H26, &H28, &H2A, &H2C, &H2E, &H30, &H32, &H34, &H36, &H38, &H3A, &H3C, &H3E, _
  20.         &H40, &H42, &H44, &H46, &H48, &H4A, &H4C, &H4E, &H50, &H52, &H54, &H56, &H58, &H5A, &H5C, &H5E, _
  21.         &H60, &H62, &H64, &H66, &H68, &H6A, &H6C, &H6E, &H70, &H72, &H74, &H76, &H78, &H7A, &H7C, &H7E, _
  22.         &H80, &H82, &H84, &H86, &H88, &H8A, &H8C, &H8E, &H90, &H92, &H94, &H96, &H98, &H9A, &H9C, &H9E, _
  23.         &HA0, &HA2, &HA4, &HA6, &HA8, &HAA, &HAC, &HAE, &HB0, &HB2, &HB4, &HB6, &HB8, &HBA, &HBC, &HBE, _
  24.         &HC0, &HC2, &HC4, &HC6, &HC8, &HCA, &HCC, &HCE, &HD0, &HD2, &HD4, &HD6, &HD8, &HDA, &HDC, &HDE, _
  25.         &HE0, &HE2, &HE4, &HE6, &HE8, &HEA, &HEC, &HEE, &HF0, &HF2, &HF4, &HF6, &HF8, &HFA, &HFC, &HFE, _
  26.         &H1B, &H19, &H1F, &H1D, &H13, &H11, &H17, &H15, &HB, &H9, &HF, &HD, &H3, &H1, &H7, &H5, _
  27.         &H3B, &H39, &H3F, &H3D, &H33, &H31, &H37, &H35, &H2B, &H29, &H2F, &H2D, &H23, &H21, &H27, &H25, _
  28.         &H5B, &H59, &H5F, &H5D, &H53, &H51, &H57, &H55, &H4B, &H49, &H4F, &H4D, &H43, &H41, &H47, &H45, _
  29.         &H7B, &H79, &H7F, &H7D, &H73, &H71, &H77, &H75, &H6B, &H69, &H6F, &H6D, &H63, &H61, &H67, &H65, _
  30.         &H9B, &H99, &H9F, &H9D, &H93, &H91, &H97, &H95, &H8B, &H89, &H8F, &H8D, &H83, &H81, &H87, &H85, _
  31.         &HBB, &HB9, &HBF, &HBD, &HB3, &HB1, &HB7, &HB5, &HAB, &HA9, &HAF, &HAD, &HA3, &HA1, &HA7, &HA5, _
  32.         &HDB, &HD9, &HDF, &HDD, &HD3, &HD1, &HD7, &HD5, &HCB, &HC9, &HCF, &HCD, &HC3, &HC1, &HC7, &HC5, _
  33.         &HFB, &HF9, &HFF, &HFD, &HF3, &HF1, &HF7, &HF5, &HEB, &HE9, &HEF, &HED, &HE3, &HE1, &HE7, &HE5)
  34.  
  35.     g3 = Array( _
  36.         &H0, &H3, &H6, &H5, &HC, &HF, &HA, &H9, &H18, &H1B, &H1E, &H1D, &H14, &H17, &H12, &H11, _
  37.         &H30, &H33, &H36, &H35, &H3C, &H3F, &H3A, &H39, &H28, &H2B, &H2E, &H2D, &H24, &H27, &H22, &H21, _
  38.         &H60, &H63, &H66, &H65, &H6C, &H6F, &H6A, &H69, &H78, &H7B, &H7E, &H7D, &H74, &H77, &H72, &H71, _
  39.         &H50, &H53, &H56, &H55, &H5C, &H5F, &H5A, &H59, &H48, &H4B, &H4E, &H4D, &H44, &H47, &H42, &H41, _
  40.         &HC0, &HC3, &HC6, &HC5, &HCC, &HCF, &HCA, &HC9, &HD8, &HDB, &HDE, &HDD, &HD4, &HD7, &HD2, &HD1, _
  41.         &HF0, &HF3, &HF6, &HF5, &HFC, &HFF, &HFA, &HF9, &HE8, &HEB, &HEE, &HED, &HE4, &HE7, &HE2, &HE1, _
  42.         &HA0, &HA3, &HA6, &HA5, &HAC, &HAF, &HAA, &HA9, &HB8, &HBB, &HBE, &HBD, &HB4, &HB7, &HB2, &HB1, _
  43.         &H90, &H93, &H96, &H95, &H9C, &H9F, &H9A, &H99, &H88, &H8B, &H8E, &H8D, &H84, &H87, &H82, &H81, _
  44.         &H9B, &H98, &H9D, &H9E, &H97, &H94, &H91, &H92, &H83, &H80, &H85, &H86, &H8F, &H8C, &H89, &H8A, _
  45.         &HAB, &HA8, &HAD, &HAE, &HA7, &HA4, &HA1, &HA2, &HB3, &HB0, &HB5, &HB6, &HBF, &HBC, &HB9, &HBA, _
  46.         &HFB, &HF8, &HFD, &HFE, &HF7, &HF4, &HF1, &HF2, &HE3, &HE0, &HE5, &HE6, &HEF, &HEC, &HE9, &HEA, _
  47.         &HCB, &HC8, &HCD, &HCE, &HC7, &HC4, &HC1, &HC2, &HD3, &HD0, &HD5, &HD6, &HDF, &HDC, &HD9, &HDA, _
  48.         &H5B, &H58, &H5D, &H5E, &H57, &H54, &H51, &H52, &H43, &H40, &H45, &H46, &H4F, &H4C, &H49, &H4A, _
  49.         &H6B, &H68, &H6D, &H6E, &H67, &H64, &H61, &H62, &H73, &H70, &H75, &H76, &H7F, &H7C, &H79, &H7A, _
  50.         &H3B, &H38, &H3D, &H3E, &H37, &H34, &H31, &H32, &H23, &H20, &H25, &H26, &H2F, &H2C, &H29, &H2A, _
  51.         &HB, &H8, &HD, &HE, &H7, &H4, &H1, &H2, &H13, &H10, &H15, &H16, &H1F, &H1C, &H19, &H1A)
  52.  
  53.     g9 = Array( _
  54.         &H0, &H9, &H12, &H1B, &H24, &H2D, &H36, &H3F, &H48, &H41, &H5A, &H53, &H6C, &H65, &H7E, &H77, _
  55.         &H90, &H99, &H82, &H8B, &HB4, &HBD, &HA6, &HAF, &HD8, &HD1, &HCA, &HC3, &HFC, &HF5, &HEE, &HE7, _
  56.         &H3B, &H32, &H29, &H20, &H1F, &H16, &HD, &H4, &H73, &H7A, &H61, &H68, &H57, &H5E, &H45, &H4C, _
  57.         &HAB, &HA2, &HB9, &HB0, &H8F, &H86, &H9D, &H94, &HE3, &HEA, &HF1, &HF8, &HC7, &HCE, &HD5, &HDC, _
  58.         &H76, &H7F, &H64, &H6D, &H52, &H5B, &H40, &H49, &H3E, &H37, &H2C, &H25, &H1A, &H13, &H8, &H1, _
  59.         &HE6, &HEF, &HF4, &HFD, &HC2, &HCB, &HD0, &HD9, &HAE, &HA7, &HBC, &HB5, &H8A, &H83, &H98, &H91, _
  60.         &H4D, &H44, &H5F, &H56, &H69, &H60, &H7B, &H72, &H5, &HC, &H17, &H1E, &H21, &H28, &H33, &H3A, _
  61.         &HDD, &HD4, &HCF, &HC6, &HF9, &HF0, &HEB, &HE2, &H95, &H9C, &H87, &H8E, &HB1, &HB8, &HA3, &HAA, _
  62.         &HEC, &HE5, &HFE, &HF7, &HC8, &HC1, &HDA, &HD3, &HA4, &HAD, &HB6, &HBF, &H80, &H89, &H92, &H9B, _
  63.         &H7C, &H75, &H6E, &H67, &H58, &H51, &H4A, &H43, &H34, &H3D, &H26, &H2F, &H10, &H19, &H2, &HB, _
  64.         &HD7, &HDE, &HC5, &HCC, &HF3, &HFA, &HE1, &HE8, &H9F, &H96, &H8D, &H84, &HBB, &HB2, &HA9, &HA0, _
  65.         &H47, &H4E, &H55, &H5C, &H63, &H6A, &H71, &H78, &HF, &H6, &H1D, &H14, &H2B, &H22, &H39, &H30, _
  66.         &H9A, &H93, &H88, &H81, &HBE, &HB7, &HAC, &HA5, &HD2, &HDB, &HC0, &HC9, &HF6, &HFF, &HE4, &HED, _
  67.         &HA, &H3, &H18, &H11, &H2E, &H27, &H3C, &H35, &H42, &H4B, &H50, &H59, &H66, &H6F, &H74, &H7D, _
  68.         &HA1, &HA8, &HB3, &HBA, &H85, &H8C, &H97, &H9E, &HE9, &HE0, &HFB, &HF2, &HCD, &HC4, &HDF, &HD6, _
  69.         &H31, &H38, &H23, &H2A, &H15, &H1C, &H7, &HE, &H79, &H70, &H6B, &H62, &H5D, &H54, &H4F, &H46)
  70.  
  71.     g11 = Array( _
  72.         &H0, &HB, &H16, &H1D, &H2C, &H27, &H3A, &H31, &H58, &H53, &H4E, &H45, &H74, &H7F, &H62, &H69, _
  73.         &HB0, &HBB, &HA6, &HAD, &H9C, &H97, &H8A, &H81, &HE8, &HE3, &HFE, &HF5, &HC4, &HCF, &HD2, &HD9, _
  74.         &H7B, &H70, &H6D, &H66, &H57, &H5C, &H41, &H4A, &H23, &H28, &H35, &H3E, &HF, &H4, &H19, &H12, _
  75.         &HCB, &HC0, &HDD, &HD6, &HE7, &HEC, &HF1, &HFA, &H93, &H98, &H85, &H8E, &HBF, &HB4, &HA9, &HA2, _
  76.         &HF6, &HFD, &HE0, &HEB, &HDA, &HD1, &HCC, &HC7, &HAE, &HA5, &HB8, &HB3, &H82, &H89, &H94, &H9F, _
  77.         &H46, &H4D, &H50, &H5B, &H6A, &H61, &H7C, &H77, &H1E, &H15, &H8, &H3, &H32, &H39, &H24, &H2F, _
  78.         &H8D, &H86, &H9B, &H90, &HA1, &HAA, &HB7, &HBC, &HD5, &HDE, &HC3, &HC8, &HF9, &HF2, &HEF, &HE4, _
  79.         &H3D, &H36, &H2B, &H20, &H11, &H1A, &H7, &HC, &H65, &H6E, &H73, &H78, &H49, &H42, &H5F, &H54, _
  80.         &HF7, &HFC, &HE1, &HEA, &HDB, &HD0, &HCD, &HC6, &HAF, &HA4, &HB9, &HB2, &H83, &H88, &H95, &H9E, _
  81.         &H47, &H4C, &H51, &H5A, &H6B, &H60, &H7D, &H76, &H1F, &H14, &H9, &H2, &H33, &H38, &H25, &H2E, _
  82.         &H8C, &H87, &H9A, &H91, &HA0, &HAB, &HB6, &HBD, &HD4, &HDF, &HC2, &HC9, &HF8, &HF3, &HEE, &HE5, _
  83.         &H3C, &H37, &H2A, &H21, &H10, &H1B, &H6, &HD, &H64, &H6F, &H72, &H79, &H48, &H43, &H5E, &H55, _
  84.         &H1, &HA, &H17, &H1C, &H2D, &H26, &H3B, &H30, &H59, &H52, &H4F, &H44, &H75, &H7E, &H63, &H68, _
  85.         &HB1, &HBA, &HA7, &HAC, &H9D, &H96, &H8B, &H80, &HE9, &HE2, &HFF, &HF4, &HC5, &HCE, &HD3, &HD8, _
  86.         &H7A, &H71, &H6C, &H67, &H56, &H5D, &H40, &H4B, &H22, &H29, &H34, &H3F, &HE, &H5, &H18, &H13, _
  87.         &HCA, &HC1, &HDC, &HD7, &HE6, &HED, &HF0, &HFB, &H92, &H99, &H84, &H8F, &HBE, &HB5, &HA8, &HA3)
  88.  
  89.     g13 = Array( _
  90.         &H0, &HD, &H1A, &H17, &H34, &H39, &H2E, &H23, &H68, &H65, &H72, &H7F, &H5C, &H51, &H46, &H4B, _
  91.         &HD0, &HDD, &HCA, &HC7, &HE4, &HE9, &HFE, &HF3, &HB8, &HB5, &HA2, &HAF, &H8C, &H81, &H96, &H9B, _
  92.         &HBB, &HB6, &HA1, &HAC, &H8F, &H82, &H95, &H98, &HD3, &HDE, &HC9, &HC4, &HE7, &HEA, &HFD, &HF0, _
  93.         &H6B, &H66, &H71, &H7C, &H5F, &H52, &H45, &H48, &H3, &HE, &H19, &H14, &H37, &H3A, &H2D, &H20, _
  94.         &H6D, &H60, &H77, &H7A, &H59, &H54, &H43, &H4E, &H5, &H8, &H1F, &H12, &H31, &H3C, &H2B, &H26, _
  95.         &HBD, &HB0, &HA7, &HAA, &H89, &H84, &H93, &H9E, &HD5, &HD8, &HCF, &HC2, &HE1, &HEC, &HFB, &HF6, _
  96.         &HD6, &HDB, &HCC, &HC1, &HE2, &HEF, &HF8, &HF5, &HBE, &HB3, &HA4, &HA9, &H8A, &H87, &H90, &H9D, _
  97.         &H6, &HB, &H1C, &H11, &H32, &H3F, &H28, &H25, &H6E, &H63, &H74, &H79, &H5A, &H57, &H40, &H4D, _
  98.         &HDA, &HD7, &HC0, &HCD, &HEE, &HE3, &HF4, &HF9, &HB2, &HBF, &HA8, &HA5, &H86, &H8B, &H9C, &H91, _
  99.         &HA, &H7, &H10, &H1D, &H3E, &H33, &H24, &H29, &H62, &H6F, &H78, &H75, &H56, &H5B, &H4C, &H41, _
  100.         &H61, &H6C, &H7B, &H76, &H55, &H58, &H4F, &H42, &H9, &H4, &H13, &H1E, &H3D, &H30, &H27, &H2A, _
  101.         &HB1, &HBC, &HAB, &HA6, &H85, &H88, &H9F, &H92, &HD9, &HD4, &HC3, &HCE, &HED, &HE0, &HF7, &HFA, _
  102.         &HB7, &HBA, &HAD, &HA0, &H83, &H8E, &H99, &H94, &HDF, &HD2, &HC5, &HC8, &HEB, &HE6, &HF1, &HFC, _
  103.         &H67, &H6A, &H7D, &H70, &H53, &H5E, &H49, &H44, &HF, &H2, &H15, &H18, &H3B, &H36, &H21, &H2C, _
  104.         &HC, &H1, &H16, &H1B, &H38, &H35, &H22, &H2F, &H64, &H69, &H7E, &H73, &H50, &H5D, &H4A, &H47, _
  105.         &HDC, &HD1, &HC6, &HCB, &HE8, &HE5, &HF2, &HFF, &HB4, &HB9, &HAE, &HA3, &H80, &H8D, &H9A, &H97)
  106.  
  107.     g14 = Array( _
  108.         &H0, &HE, &H1C, &H12, &H38, &H36, &H24, &H2A, &H70, &H7E, &H6C, &H62, &H48, &H46, &H54, &H5A, _
  109.         &HE0, &HEE, &HFC, &HF2, &HD8, &HD6, &HC4, &HCA, &H90, &H9E, &H8C, &H82, &HA8, &HA6, &HB4, &HBA, _
  110.         &HDB, &HD5, &HC7, &HC9, &HE3, &HED, &HFF, &HF1, &HAB, &HA5, &HB7, &HB9, &H93, &H9D, &H8F, &H81, _
  111.         &H3B, &H35, &H27, &H29, &H3, &HD, &H1F, &H11, &H4B, &H45, &H57, &H59, &H73, &H7D, &H6F, &H61, _
  112.         &HAD, &HA3, &HB1, &HBF, &H95, &H9B, &H89, &H87, &HDD, &HD3, &HC1, &HCF, &HE5, &HEB, &HF9, &HF7, _
  113.         &H4D, &H43, &H51, &H5F, &H75, &H7B, &H69, &H67, &H3D, &H33, &H21, &H2F, &H5, &HB, &H19, &H17, _
  114.         &H76, &H78, &H6A, &H64, &H4E, &H40, &H52, &H5C, &H6, &H8, &H1A, &H14, &H3E, &H30, &H22, &H2C, _
  115.         &H96, &H98, &H8A, &H84, &HAE, &HA0, &HB2, &HBC, &HE6, &HE8, &HFA, &HF4, &HDE, &HD0, &HC2, &HCC, _
  116.         &H41, &H4F, &H5D, &H53, &H79, &H77, &H65, &H6B, &H31, &H3F, &H2D, &H23, &H9, &H7, &H15, &H1B, _
  117.         &HA1, &HAF, &HBD, &HB3, &H99, &H97, &H85, &H8B, &HD1, &HDF, &HCD, &HC3, &HE9, &HE7, &HF5, &HFB, _
  118.         &H9A, &H94, &H86, &H88, &HA2, &HAC, &HBE, &HB0, &HEA, &HE4, &HF6, &HF8, &HD2, &HDC, &HCE, &HC0, _
  119.         &H7A, &H74, &H66, &H68, &H42, &H4C, &H5E, &H50, &HA, &H4, &H16, &H18, &H32, &H3C, &H2E, &H20, _
  120.         &HEC, &HE2, &HF0, &HFE, &HD4, &HDA, &HC8, &HC6, &H9C, &H92, &H80, &H8E, &HA4, &HAA, &HB8, &HB6, _
  121.         &HC, &H2, &H10, &H1E, &H34, &H3A, &H28, &H26, &H7C, &H72, &H60, &H6E, &H44, &H4A, &H58, &H56, _
  122.         &H37, &H39, &H2B, &H25, &HF, &H1, &H13, &H1D, &H47, &H49, &H5B, &H55, &H7F, &H71, &H63, &H6D, _
  123.         &HD7, &HD9, &HCB, &HC5, &HEF, &HE1, &HF3, &HFD, &HA7, &HA9, &HBB, &HB5, &H9F, &H91, &H83, &H8D)
  124.  
  125.    sbox = Array(&H63, &H7C, &H77, &H7B, &HF2, &H6B, &H6F, &HC5, &H30, &H1, &H67, &H2B, &HFE, &HD7, &HAB, &H76, _
  126.         &HCA, &H82, &HC9, &H7D, &HFA, &H59, &H47, &HF0, &HAD, &HD4, &HA2, &HAF, &H9C, &HA4, &H72, &HC0, _
  127.         &HB7, &HFD, &H93, &H26, &H36, &H3F, &HF7, &HCC, &H34, &HA5, &HE5, &HF1, &H71, &HD8, &H31, &H15, _
  128.         &H4, &HC7, &H23, &HC3, &H18, &H96, &H5, &H9A, &H7, &H12, &H80, &HE2, &HEB, &H27, &HB2, &H75, _
  129.         &H9, &H83, &H2C, &H1A, &H1B, &H6E, &H5A, &HA0, &H52, &H3B, &HD6, &HB3, &H29, &HE3, &H2F, &H84, _
  130.         &H53, &HD1, &H0, &HED, &H20, &HFC, &HB1, &H5B, &H6A, &HCB, &HBE, &H39, &H4A, &H4C, &H58, &HCF, _
  131.         &HD0, &HEF, &HAA, &HFB, &H43, &H4D, &H33, &H85, &H45, &HF9, &H2, &H7F, &H50, &H3C, &H9F, &HA8, _
  132.         &H51, &HA3, &H40, &H8F, &H92, &H9D, &H38, &HF5, &HBC, &HB6, &HDA, &H21, &H10, &HFF, &HF3, &HD2, _
  133.         &HCD, &HC, &H13, &HEC, &H5F, &H97, &H44, &H17, &HC4, &HA7, &H7E, &H3D, &H64, &H5D, &H19, &H73, _
  134.         &H60, &H81, &H4F, &HDC, &H22, &H2A, &H90, &H88, &H46, &HEE, &HB8, &H14, &HDE, &H5E, &HB, &HDB, _
  135.         &HE0, &H32, &H3A, &HA, &H49, &H6, &H24, &H5C, &HC2, &HD3, &HAC, &H62, &H91, &H95, &HE4, &H79, _
  136.         &HE7, &HC8, &H37, &H6D, &H8D, &HD5, &H4E, &HA9, &H6C, &H56, &HF4, &HEA, &H65, &H7A, &HAE, &H8, _
  137.         &HBA, &H78, &H25, &H2E, &H1C, &HA6, &HB4, &HC6, &HE8, &HDD, &H74, &H1F, &H4B, &HBD, &H8B, &H8A, _
  138.         &H70, &H3E, &HB5, &H66, &H48, &H3, &HF6, &HE, &H61, &H35, &H57, &HB9, &H86, &HC1, &H1D, &H9E, _
  139.         &HE1, &HF8, &H98, &H11, &H69, &HD9, &H8E, &H94, &H9B, &H1E, &H87, &HE9, &HCE, &H55, &H28, &HDF, _
  140.         &H8C, &HA1, &H89, &HD, &HBF, &HE6, &H42, &H68, &H41, &H99, &H2D, &HF, &HB0, &H54, &HBB, &H16)
  141.  
  142.     sboxinv = Array( _
  143.         &H52, &H9, &H6A, &HD5, &H30, &H36, &HA5, &H38, &HBF, &H40, &HA3, &H9E, &H81, &HF3, &HD7, &HFB, _
  144.         &H7C, &HE3, &H39, &H82, &H9B, &H2F, &HFF, &H87, &H34, &H8E, &H43, &H44, &HC4, &HDE, &HE9, &HCB, _
  145.         &H54, &H7B, &H94, &H32, &HA6, &HC2, &H23, &H3D, &HEE, &H4C, &H95, &HB, &H42, &HFA, &HC3, &H4E, _
  146.         &H8, &H2E, &HA1, &H66, &H28, &HD9, &H24, &HB2, &H76, &H5B, &HA2, &H49, &H6D, &H8B, &HD1, &H25, _
  147.         &H72, &HF8, &HF6, &H64, &H86, &H68, &H98, &H16, &HD4, &HA4, &H5C, &HCC, &H5D, &H65, &HB6, &H92, _
  148.         &H6C, &H70, &H48, &H50, &HFD, &HED, &HB9, &HDA, &H5E, &H15, &H46, &H57, &HA7, &H8D, &H9D, &H84, _
  149.         &H90, &HD8, &HAB, &H0, &H8C, &HBC, &HD3, &HA, &HF7, &HE4, &H58, &H5, &HB8, &HB3, &H45, &H6, _
  150.         &HD0, &H2C, &H1E, &H8F, &HCA, &H3F, &HF, &H2, &HC1, &HAF, &HBD, &H3, &H1, &H13, &H8A, &H6B, _
  151.         &H3A, &H91, &H11, &H41, &H4F, &H67, &HDC, &HEA, &H97, &HF2, &HCF, &HCE, &HF0, &HB4, &HE6, &H73, _
  152.         &H96, &HAC, &H74, &H22, &HE7, &HAD, &H35, &H85, &HE2, &HF9, &H37, &HE8, &H1C, &H75, &HDF, &H6E, _
  153.         &H47, &HF1, &H1A, &H71, &H1D, &H29, &HC5, &H89, &H6F, &HB7, &H62, &HE, &HAA, &H18, &HBE, &H1B, _
  154.         &HFC, &H56, &H3E, &H4B, &HC6, &HD2, &H79, &H20, &H9A, &HDB, &HC0, &HFE, &H78, &HCD, &H5A, &HF4, _
  155.         &H1F, &HDD, &HA8, &H33, &H88, &H7, &HC7, &H31, &HB1, &H12, &H10, &H59, &H27, &H80, &HEC, &H5F, _
  156.         &H60, &H51, &H7F, &HA9, &H19, &HB5, &H4A, &HD, &H2D, &HE5, &H7A, &H9F, &H93, &HC9, &H9C, &HEF, _
  157.         &HA0, &HE0, &H3B, &H4D, &HAE, &H2A, &HF5, &HB0, &HC8, &HEB, &HBB, &H3C, &H83, &H53, &H99, &H61, _
  158.         &H17, &H2B, &H4, &H7E, &HBA, &H77, &HD6, &H26, &HE1, &H69, &H14, &H63, &H55, &H21, &HC, &H7D)
  159.  
  160.     rcon = Array( _
  161.         &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, _
  162.         &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, _
  163.         &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, _
  164.         &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, _
  165.         &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, _
  166.         &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, _
  167.         &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, _
  168.         &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, _
  169.         &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, _
  170.         &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, _
  171.         &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, _
  172.         &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, _
  173.         &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, _
  174.         &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, _
  175.         &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, _
  176.         &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB)
  177.  
  178.     Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
  179.     Dim sPlain, sPass, sCipher, sTemp
  180.     Dim oFile1, oFS, oFile2
  181.     Dim x, r, y, temp(4), intTemp
  182.     '<<<MOD = Added the following constants
  183.     Const forreading = 1, forwriting = 2, forappend = 8
  184.     '>>>
  185.  
  186.     Set oFS = CreateObject("Scripting.FileSystemObject")
  187.     Set oFile1 = oFS.OpenTextFile(sFile, forreading)
  188.  
  189.     If Right(sFile, 4) <> ".enc" Then
  190.         sFile = sFile & ".enc"
  191.         oFS.CreateTextFile sFile, 2, True
  192.         isEncode = True
  193.     Else
  194.         sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
  195.         oFS.CreateTextFile sFile, 2, True
  196.         isEncode = False
  197.     End If
  198.  
  199.     Set oFile2 = oFS.OpenTextFile(sFile, forwriting)
  200.     Set oFS = Nothing
  201.     '<<MOD
  202.     sPass = sPassIn
  203.     '>>
  204.     '<<Mod changed the following line
  205.     'For i = 0 To (Len(oPW.value) - 1)
  206.     '
  207.     For i = 0 To (Len(sPass) - 1)
  208.     '>>
  209.     '<<Mod changed the following line
  210.         'aesKey(i) = Asc(Mid(oPW.value, i + 1, 1))
  211.         aesKey(i) = Asc(Mid(sPass, i + 1, 1))
  212.     '>>>
  213.     Next
  214.     '<<Mod changed the following line
  215.     'For i = Len(oPW.value) To 31
  216.     For i = Len(sPass) To 31
  217.     '>>
  218.         aesKey(i) = 0
  219.     Next
  220.     'missing sbox
  221.     expandedKey = expandKey(aesKey, sbox, rcon)
  222.  
  223.     Do Until oFile1.AtEndOfStream
  224.         sPlain = oFile1.Read(1024)
  225.         sCipher = ""
  226.         j = 0
  227.         isDone = False
  228.  
  229.         Do Until isDone
  230.             sTemp = Mid(sPlain, j * 16 + 1, 16)
  231.  
  232.             If Len(sTemp) < 16 Then
  233.                 For i = Len(sTemp) To 15
  234.                     sTemp = sTemp & Chr(0)
  235.                 Next
  236.             End If
  237.  
  238.             For i = 0 To 15
  239.                 block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
  240.             Next
  241.  
  242.             If (j + 1) * 16 >= Len(sPlain) Then
  243.                 isDone = True
  244.             End If
  245.  
  246.             j = j + 1
  247.  
  248.             If isEncode Then
  249.                 r = 0
  250.                 For i = 0 To 15
  251.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  252.                 Next
  253.  
  254.                 For x = 1 To 13
  255.                     block(0) = sbox(block(0))
  256.                     block(1) = sbox(block(1))
  257.                     block(2) = sbox(block(2))
  258.                     block(3) = sbox(block(3))
  259.  
  260.                     intTemp = sbox(block(4))
  261.                     block(4) = sbox(block(5))
  262.                     block(5) = sbox(block(6))
  263.                     block(6) = sbox(block(7))
  264.                     block(7) = intTemp
  265.  
  266.                     intTemp = sbox(block(8))
  267.                     block(8) = sbox(block(10))
  268.                     block(10) = intTemp
  269.                     intTemp = sbox(block(9))
  270.                     block(9) = sbox(block(11))
  271.                     block(11) = intTemp
  272.  
  273.                     intTemp = sbox(block(12))
  274.                     block(12) = sbox(block(15))
  275.                     block(15) = sbox(block(14))
  276.                     block(14) = sbox(block(13))
  277.                     block(13) = intTemp
  278.  
  279.                     r = x * 16
  280.                     For i = 0 To 3
  281.                         temp(0) = block(i)
  282.                         temp(1) = block(i + 4)
  283.                         temp(2) = block(i + 8)
  284.                         temp(3) = block(i + 12)
  285.  
  286.                         block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r + i * 4)
  287.                         block(i + 4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r + i * 4 + 1)
  288.                         block(i + 8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r + i * 4 + 2)
  289.                         block(i + 12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r + i * 4 + 3)
  290.                     Next
  291.                 Next
  292.  
  293.                 block(0) = sbox(block(0)) Xor expandedKey(224)
  294.                 block(1) = sbox(block(1)) Xor expandedKey(228)
  295.                 block(2) = sbox(block(2)) Xor expandedKey(232)
  296.                 block(3) = sbox(block(3)) Xor expandedKey(236)
  297.  
  298.                 intTemp = sbox(block(4)) Xor expandedKey(237)
  299.                 block(4) = sbox(block(5)) Xor expandedKey(225)
  300.                 block(5) = sbox(block(6)) Xor expandedKey(229)
  301.                 block(6) = sbox(block(7)) Xor expandedKey(233)
  302.                 block(7) = intTemp
  303.  
  304.                 intTemp = sbox(block(8)) Xor expandedKey(234)
  305.                 block(8) = sbox(block(10)) Xor expandedKey(226)
  306.                 block(10) = intTemp
  307.                 intTemp = sbox(block(9)) Xor expandedKey(238)
  308.                 block(9) = sbox(block(11)) Xor expandedKey(230)
  309.                 block(11) = intTemp
  310.  
  311.                 intTemp = sbox(block(12)) Xor expandedKey(231)
  312.                 block(12) = sbox(block(15)) Xor expandedKey(227)
  313.                 block(15) = sbox(block(14)) Xor expandedKey(239)
  314.                 block(14) = sbox(block(13)) Xor expandedKey(235)
  315.                 block(13) = intTemp
  316.             Else
  317.                 block(0) = sboxinv(block(0) Xor expandedKey(224))
  318.                 block(1) = sboxinv(block(1) Xor expandedKey(228))
  319.                 block(2) = sboxinv(block(2) Xor expandedKey(232))
  320.                 block(3) = sboxinv(block(3) Xor expandedKey(236))
  321.  
  322.                 intTemp = sboxinv(block(4) Xor expandedKey(225))
  323.                 block(4) = sboxinv(block(7) Xor expandedKey(237))
  324.                 block(7) = sboxinv(block(6) Xor expandedKey(233))
  325.                 block(6) = sboxinv(block(5) Xor expandedKey(229))
  326.                 block(5) = intTemp
  327.  
  328.                 intTemp = sboxinv(block(8) Xor expandedKey(226))
  329.                 block(8) = sboxinv(block(10) Xor expandedKey(234))
  330.                 block(10) = intTemp
  331.                 intTemp = sboxinv(block(9) Xor expandedKey(230))
  332.                 block(9) = sboxinv(block(11) Xor expandedKey(238))
  333.                 block(11) = intTemp
  334.  
  335.                 intTemp = sboxinv(block(12) Xor expandedKey(227))
  336.                 block(12) = sboxinv(block(13) Xor expandedKey(231))
  337.                 block(13) = sboxinv(block(14) Xor expandedKey(235))
  338.                 block(14) = sboxinv(block(15) Xor expandedKey(239))
  339.                 block(15) = intTemp
  340.  
  341.                 For x = 13 To 1 Step -1
  342.                     r = x * 16
  343.  
  344.                     For i = 0 To 3
  345.                         temp(0) = block(i) Xor expandedKey(r + i * 4)
  346.                         temp(1) = block(i + 4) Xor expandedKey(r + i * 4 + 1)
  347.                         temp(2) = block(i + 8) Xor expandedKey(r + i * 4 + 2)
  348.                         temp(3) = block(i + 12) Xor expandedKey(r + i * 4 + 3)
  349.  
  350.                         block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
  351.                         block(i + 4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
  352.                         block(i + 8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
  353.                         block(i + 12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
  354.                     Next
  355.  
  356.                     block(0) = sboxinv(block(0))
  357.                     block(1) = sboxinv(block(1))
  358.                     block(2) = sboxinv(block(2))
  359.                     block(3) = sboxinv(block(3))
  360.  
  361.                     intTemp = sboxinv(block(4))
  362.                     block(4) = sboxinv(block(7))
  363.                     block(7) = sboxinv(block(6))
  364.                     block(6) = sboxinv(block(5))
  365.                     block(5) = intTemp
  366.  
  367.                     intTemp = sboxinv(block(8))
  368.                     block(8) = sboxinv(block(10))
  369.                     block(10) = intTemp
  370.                     intTemp = sboxinv(block(9))
  371.                     block(9) = sboxinv(block(11))
  372.                     block(11) = intTemp
  373.  
  374.                     intTemp = sboxinv(block(12))
  375.                     block(12) = sboxinv(block(13))
  376.                     block(13) = sboxinv(block(14))
  377.                     block(14) = sboxinv(block(15))
  378.                     block(15) = intTemp
  379.                 Next
  380.  
  381.                 r = 0
  382.                 For i = 0 To 15
  383.                     block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
  384.                 Next
  385.             End If
  386.  
  387.             For i = 0 To 15
  388.                 sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
  389.             Next
  390.         Loop
  391.  
  392.         oFile2.Write sCipher
  393.     Loop
  394.  
  395.     oFile1.Close
  396.     Set oFile1 = Nothing
  397.     oFile2.Close
  398.     Set oFile2 = Nothing
  399. End Sub
  400.  
  401. Function keyScheduleCore(ByRef row(), ByVal a, ByRef box(), ByRef rcon())
  402.     Dim result(4), i
  403.  
  404.     For i = 0 To 3
  405.         result(i) = box(row((i + 5) Mod 4))
  406.     Next
  407.  
  408.     result(0) = result(0) Xor rcon(a)
  409.     keyScheduleCore = result
  410. End Function
  411.  
  412. Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
  413.     'MOD added () to array variables
  414.     Dim rConIter, temp(), i, result(240)
  415.  
  416.     ReDim temp(4)
  417.     rConIter = 1
  418.  
  419.     For i = 0 To 31
  420.         result(i) = key(i)
  421.     Next
  422.  
  423.     For i = 32 To 239 Step 4
  424.         temp(0) = result(i - 4)
  425.         temp(1) = result(i - 3)
  426.         temp(2) = result(i - 2)
  427.         temp(3) = result(i - 1)
  428.  
  429.         If i Mod 32 = 0 Then
  430.             temp = keyScheduleCore(temp, rConIter, box, rcon)
  431.             rConIter = rConIter + 1
  432.         End If
  433.  
  434.         If i Mod 32 = 16 Then
  435.             temp(0) = box(temp(0))
  436.             temp(1) = box(temp(1))
  437.             temp(2) = box(temp(2))
  438.             temp(3) = box(temp(3))
  439.         End If
  440.  
  441.         result(i) = result(i - 32) Xor temp(0)
  442.         result(i + 1) = result(i - 31) Xor temp(1)
  443.         result(i + 2) = result(i - 30) Xor temp(2)
  444.         result(i + 3) = result(i - 29) Xor temp(3)
  445.     Next
  446.  
  447.     expandKey = result
  448. End Function 
Nov 9 '15 #3

P: 1
Thank your for yourCode!
I was looking for something like that!
I will try to modify Sub RunAES(sFile, sPassIn) to :
Function strEncryptAES(strInputString, strPassphrase) As String

End Function

My question before I start running into the false direction: Will it work if I use strings instead of the File-objects?
Jan 16 '16 #4

Rabbit
Expert Mod 10K+
P: 12,374
Yes you can use it to encode strings
Jan 16 '16 #5

zmbd
Expert Mod 5K+
P: 5,397
If you are wanting to take a value from a record-source, encrypt, and write back to a field, then as written, no; however, a simple modification to where the code is looking for input and output would change that :)

However, keep in mind that the text-fields (short) have a 255 character limit. Access 2013 changed the "Memo" field to "long text" which may help; however, in the past, this type of field has had issues converting to other databases and with general data corruption within Access itself.

Please start a new thread if you run in to issues with your conversion.

(And I cross-posted with Rabbit, silly kids.... :-D )
Jan 16 '16 #6

P: 1
hi rabbit,

is there a version of this code for aes-128 ecb pkcs5/7, for string,
not for file ? i am beginner, can't modify the code.
Apr 28 '18 #7

Rabbit
Expert Mod 10K+
P: 12,374
I don't have a vesion of the code with those characteristics
Apr 28 '18 #8

P: 1
Hi Rabbit,

How can I modify your code to be able to decrypt aes128 ecb coded content?
Jun 20 '18 #9

Rabbit
Expert Mod 10K+
P: 12,374
The main differences are
  • 128-bit uses 10 rounds and 256-bit uses 14 rounds
  • The key expansion differs.

The main algorithm remains the same. You'll have to look up how the key expansion differs and make those changes.
Jun 20 '18 #10