AES Encryption Algorithm for VBA and VBScript

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Rabbit
    Recognized Expert MVP
    • Jan 2007
    • 12517

    AES Encryption Algorithm for VBA and VBScript

    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.
    Code:
    Sub AES(sFile)
    	Dim sbox, sboxinv, rcon
    	Dim g2, g3, g9, g11, g13, g14
    
    	g2 = Array( _
    		&h00,&h02,&h04,&h06,&h08,&h0a,&h0c,&h0e,&h10,&h12,&h14,&h16,&h18,&h1a,&h1c,&h1e, _
    		&h20,&h22,&h24,&h26,&h28,&h2a,&h2c,&h2e,&h30,&h32,&h34,&h36,&h38,&h3a,&h3c,&h3e, _
    		&h40,&h42,&h44,&h46,&h48,&h4a,&h4c,&h4e,&h50,&h52,&h54,&h56,&h58,&h5a,&h5c,&h5e, _
    		&h60,&h62,&h64,&h66,&h68,&h6a,&h6c,&h6e,&h70,&h72,&h74,&h76,&h78,&h7a,&h7c,&h7e, _
    		&h80,&h82,&h84,&h86,&h88,&h8a,&h8c,&h8e,&h90,&h92,&h94,&h96,&h98,&h9a,&h9c,&h9e, _
    		&ha0,&ha2,&ha4,&ha6,&ha8,&haa,&hac,&hae,&hb0,&hb2,&hb4,&hb6,&hb8,&hba,&hbc,&hbe, _
    		&hc0,&hc2,&hc4,&hc6,&hc8,&hca,&hcc,&hce,&hd0,&hd2,&hd4,&hd6,&hd8,&hda,&hdc,&hde, _
    		&he0,&he2,&he4,&he6,&he8,&hea,&hec,&hee,&hf0,&hf2,&hf4,&hf6,&hf8,&hfa,&hfc,&hfe, _
    		&h1b,&h19,&h1f,&h1d,&h13,&h11,&h17,&h15,&h0b,&h09,&h0f,&h0d,&h03,&h01,&h07,&h05, _
    		&h3b,&h39,&h3f,&h3d,&h33,&h31,&h37,&h35,&h2b,&h29,&h2f,&h2d,&h23,&h21,&h27,&h25, _
    		&h5b,&h59,&h5f,&h5d,&h53,&h51,&h57,&h55,&h4b,&h49,&h4f,&h4d,&h43,&h41,&h47,&h45, _
    		&h7b,&h79,&h7f,&h7d,&h73,&h71,&h77,&h75,&h6b,&h69,&h6f,&h6d,&h63,&h61,&h67,&h65, _
    		&h9b,&h99,&h9f,&h9d,&h93,&h91,&h97,&h95,&h8b,&h89,&h8f,&h8d,&h83,&h81,&h87,&h85, _
    		&hbb,&hb9,&hbf,&hbd,&hb3,&hb1,&hb7,&hb5,&hab,&ha9,&haf,&had,&ha3,&ha1,&ha7,&ha5, _
    		&hdb,&hd9,&hdf,&hdd,&hd3,&hd1,&hd7,&hd5,&hcb,&hc9,&hcf,&hcd,&hc3,&hc1,&hc7,&hc5, _
    		&hfb,&hf9,&hff,&hfd,&hf3,&hf1,&hf7,&hf5,&heb,&he9,&hef,&hed,&he3,&he1,&he7,&he5)
    
    	g3 = Array( _
    		&h00,&h03,&h06,&h05,&h0c,&h0f,&h0a,&h09,&h18,&h1b,&h1e,&h1d,&h14,&h17,&h12,&h11, _
    		&h30,&h33,&h36,&h35,&h3c,&h3f,&h3a,&h39,&h28,&h2b,&h2e,&h2d,&h24,&h27,&h22,&h21, _
    		&h60,&h63,&h66,&h65,&h6c,&h6f,&h6a,&h69,&h78,&h7b,&h7e,&h7d,&h74,&h77,&h72,&h71, _
    		&h50,&h53,&h56,&h55,&h5c,&h5f,&h5a,&h59,&h48,&h4b,&h4e,&h4d,&h44,&h47,&h42,&h41, _
    		&hc0,&hc3,&hc6,&hc5,&hcc,&hcf,&hca,&hc9,&hd8,&hdb,&hde,&hdd,&hd4,&hd7,&hd2,&hd1, _
    		&hf0,&hf3,&hf6,&hf5,&hfc,&hff,&hfa,&hf9,&he8,&heb,&hee,&hed,&he4,&he7,&he2,&he1, _
    		&ha0,&ha3,&ha6,&ha5,&hac,&haf,&haa,&ha9,&hb8,&hbb,&hbe,&hbd,&hb4,&hb7,&hb2,&hb1, _
    		&h90,&h93,&h96,&h95,&h9c,&h9f,&h9a,&h99,&h88,&h8b,&h8e,&h8d,&h84,&h87,&h82,&h81, _
    		&h9b,&h98,&h9d,&h9e,&h97,&h94,&h91,&h92,&h83,&h80,&h85,&h86,&h8f,&h8c,&h89,&h8a, _
    		&hab,&ha8,&had,&hae,&ha7,&ha4,&ha1,&ha2,&hb3,&hb0,&hb5,&hb6,&hbf,&hbc,&hb9,&hba, _
    		&hfb,&hf8,&hfd,&hfe,&hf7,&hf4,&hf1,&hf2,&he3,&he0,&he5,&he6,&hef,&hec,&he9,&hea, _
    		&hcb,&hc8,&hcd,&hce,&hc7,&hc4,&hc1,&hc2,&hd3,&hd0,&hd5,&hd6,&hdf,&hdc,&hd9,&hda, _
    		&h5b,&h58,&h5d,&h5e,&h57,&h54,&h51,&h52,&h43,&h40,&h45,&h46,&h4f,&h4c,&h49,&h4a, _
    		&h6b,&h68,&h6d,&h6e,&h67,&h64,&h61,&h62,&h73,&h70,&h75,&h76,&h7f,&h7c,&h79,&h7a, _
    		&h3b,&h38,&h3d,&h3e,&h37,&h34,&h31,&h32,&h23,&h20,&h25,&h26,&h2f,&h2c,&h29,&h2a, _
    		&h0b,&h08,&h0d,&h0e,&h07,&h04,&h01,&h02,&h13,&h10,&h15,&h16,&h1f,&h1c,&h19,&h1a)
    
    	g9 = Array( _
    		&h00,&h09,&h12,&h1b,&h24,&h2d,&h36,&h3f,&h48,&h41,&h5a,&h53,&h6c,&h65,&h7e,&h77, _
    		&h90,&h99,&h82,&h8b,&hb4,&hbd,&ha6,&haf,&hd8,&hd1,&hca,&hc3,&hfc,&hf5,&hee,&he7, _
    		&h3b,&h32,&h29,&h20,&h1f,&h16,&h0d,&h04,&h73,&h7a,&h61,&h68,&h57,&h5e,&h45,&h4c, _
    		&hab,&ha2,&hb9,&hb0,&h8f,&h86,&h9d,&h94,&he3,&hea,&hf1,&hf8,&hc7,&hce,&hd5,&hdc, _
    		&h76,&h7f,&h64,&h6d,&h52,&h5b,&h40,&h49,&h3e,&h37,&h2c,&h25,&h1a,&h13,&h08,&h01, _
    		&he6,&hef,&hf4,&hfd,&hc2,&hcb,&hd0,&hd9,&hae,&ha7,&hbc,&hb5,&h8a,&h83,&h98,&h91, _
    		&h4d,&h44,&h5f,&h56,&h69,&h60,&h7b,&h72,&h05,&h0c,&h17,&h1e,&h21,&h28,&h33,&h3a, _
    		&hdd,&hd4,&hcf,&hc6,&hf9,&hf0,&heb,&he2,&h95,&h9c,&h87,&h8e,&hb1,&hb8,&ha3,&haa, _
    		&hec,&he5,&hfe,&hf7,&hc8,&hc1,&hda,&hd3,&ha4,&had,&hb6,&hbf,&h80,&h89,&h92,&h9b, _
    		&h7c,&h75,&h6e,&h67,&h58,&h51,&h4a,&h43,&h34,&h3d,&h26,&h2f,&h10,&h19,&h02,&h0b, _
    		&hd7,&hde,&hc5,&hcc,&hf3,&hfa,&he1,&he8,&h9f,&h96,&h8d,&h84,&hbb,&hb2,&ha9,&ha0, _
    		&h47,&h4e,&h55,&h5c,&h63,&h6a,&h71,&h78,&h0f,&h06,&h1d,&h14,&h2b,&h22,&h39,&h30, _
    		&h9a,&h93,&h88,&h81,&hbe,&hb7,&hac,&ha5,&hd2,&hdb,&hc0,&hc9,&hf6,&hff,&he4,&hed, _
    		&h0a,&h03,&h18,&h11,&h2e,&h27,&h3c,&h35,&h42,&h4b,&h50,&h59,&h66,&h6f,&h74,&h7d, _
    		&ha1,&ha8,&hb3,&hba,&h85,&h8c,&h97,&h9e,&he9,&he0,&hfb,&hf2,&hcd,&hc4,&hdf,&hd6, _
    		&h31,&h38,&h23,&h2a,&h15,&h1c,&h07,&h0e,&h79,&h70,&h6b,&h62,&h5d,&h54,&h4f,&h46)
    
    	g11 = Array( _
    		&h00,&h0b,&h16,&h1d,&h2c,&h27,&h3a,&h31,&h58,&h53,&h4e,&h45,&h74,&h7f,&h62,&h69, _
    		&hb0,&hbb,&ha6,&had,&h9c,&h97,&h8a,&h81,&he8,&he3,&hfe,&hf5,&hc4,&hcf,&hd2,&hd9, _
    		&h7b,&h70,&h6d,&h66,&h57,&h5c,&h41,&h4a,&h23,&h28,&h35,&h3e,&h0f,&h04,&h19,&h12, _
    		&hcb,&hc0,&hdd,&hd6,&he7,&hec,&hf1,&hfa,&h93,&h98,&h85,&h8e,&hbf,&hb4,&ha9,&ha2, _
    		&hf6,&hfd,&he0,&heb,&hda,&hd1,&hcc,&hc7,&hae,&ha5,&hb8,&hb3,&h82,&h89,&h94,&h9f, _
    		&h46,&h4d,&h50,&h5b,&h6a,&h61,&h7c,&h77,&h1e,&h15,&h08,&h03,&h32,&h39,&h24,&h2f, _
    		&h8d,&h86,&h9b,&h90,&ha1,&haa,&hb7,&hbc,&hd5,&hde,&hc3,&hc8,&hf9,&hf2,&hef,&he4, _
    		&h3d,&h36,&h2b,&h20,&h11,&h1a,&h07,&h0c,&h65,&h6e,&h73,&h78,&h49,&h42,&h5f,&h54, _
    		&hf7,&hfc,&he1,&hea,&hdb,&hd0,&hcd,&hc6,&haf,&ha4,&hb9,&hb2,&h83,&h88,&h95,&h9e, _
    		&h47,&h4c,&h51,&h5a,&h6b,&h60,&h7d,&h76,&h1f,&h14,&h09,&h02,&h33,&h38,&h25,&h2e, _
    		&h8c,&h87,&h9a,&h91,&ha0,&hab,&hb6,&hbd,&hd4,&hdf,&hc2,&hc9,&hf8,&hf3,&hee,&he5, _
    		&h3c,&h37,&h2a,&h21,&h10,&h1b,&h06,&h0d,&h64,&h6f,&h72,&h79,&h48,&h43,&h5e,&h55, _
    		&h01,&h0a,&h17,&h1c,&h2d,&h26,&h3b,&h30,&h59,&h52,&h4f,&h44,&h75,&h7e,&h63,&h68, _
    		&hb1,&hba,&ha7,&hac,&h9d,&h96,&h8b,&h80,&he9,&he2,&hff,&hf4,&hc5,&hce,&hd3,&hd8, _
    		&h7a,&h71,&h6c,&h67,&h56,&h5d,&h40,&h4b,&h22,&h29,&h34,&h3f,&h0e,&h05,&h18,&h13, _
    		&hca,&hc1,&hdc,&hd7,&he6,&hed,&hf0,&hfb,&h92,&h99,&h84,&h8f,&hbe,&hb5,&ha8,&ha3)
    
    	g13 = Array( _
    		&h00,&h0d,&h1a,&h17,&h34,&h39,&h2e,&h23,&h68,&h65,&h72,&h7f,&h5c,&h51,&h46,&h4b, _
    		&hd0,&hdd,&hca,&hc7,&he4,&he9,&hfe,&hf3,&hb8,&hb5,&ha2,&haf,&h8c,&h81,&h96,&h9b, _
    		&hbb,&hb6,&ha1,&hac,&h8f,&h82,&h95,&h98,&hd3,&hde,&hc9,&hc4,&he7,&hea,&hfd,&hf0, _
    		&h6b,&h66,&h71,&h7c,&h5f,&h52,&h45,&h48,&h03,&h0e,&h19,&h14,&h37,&h3a,&h2d,&h20, _
    		&h6d,&h60,&h77,&h7a,&h59,&h54,&h43,&h4e,&h05,&h08,&h1f,&h12,&h31,&h3c,&h2b,&h26, _
    		&hbd,&hb0,&ha7,&haa,&h89,&h84,&h93,&h9e,&hd5,&hd8,&hcf,&hc2,&he1,&hec,&hfb,&hf6, _
    		&hd6,&hdb,&hcc,&hc1,&he2,&hef,&hf8,&hf5,&hbe,&hb3,&ha4,&ha9,&h8a,&h87,&h90,&h9d, _
    		&h06,&h0b,&h1c,&h11,&h32,&h3f,&h28,&h25,&h6e,&h63,&h74,&h79,&h5a,&h57,&h40,&h4d, _
    		&hda,&hd7,&hc0,&hcd,&hee,&he3,&hf4,&hf9,&hb2,&hbf,&ha8,&ha5,&h86,&h8b,&h9c,&h91, _
    		&h0a,&h07,&h10,&h1d,&h3e,&h33,&h24,&h29,&h62,&h6f,&h78,&h75,&h56,&h5b,&h4c,&h41, _
    		&h61,&h6c,&h7b,&h76,&h55,&h58,&h4f,&h42,&h09,&h04,&h13,&h1e,&h3d,&h30,&h27,&h2a, _
    		&hb1,&hbc,&hab,&ha6,&h85,&h88,&h9f,&h92,&hd9,&hd4,&hc3,&hce,&hed,&he0,&hf7,&hfa, _
    		&hb7,&hba,&had,&ha0,&h83,&h8e,&h99,&h94,&hdf,&hd2,&hc5,&hc8,&heb,&he6,&hf1,&hfc, _
    		&h67,&h6a,&h7d,&h70,&h53,&h5e,&h49,&h44,&h0f,&h02,&h15,&h18,&h3b,&h36,&h21,&h2c, _
    		&h0c,&h01,&h16,&h1b,&h38,&h35,&h22,&h2f,&h64,&h69,&h7e,&h73,&h50,&h5d,&h4a,&h47, _
    		&hdc,&hd1,&hc6,&hcb,&he8,&he5,&hf2,&hff,&hb4,&hb9,&hae,&ha3,&h80,&h8d,&h9a,&h97)
    
    	g14 = Array( _
    		&h00,&h0e,&h1c,&h12,&h38,&h36,&h24,&h2a,&h70,&h7e,&h6c,&h62,&h48,&h46,&h54,&h5a, _
    		&he0,&hee,&hfc,&hf2,&hd8,&hd6,&hc4,&hca,&h90,&h9e,&h8c,&h82,&ha8,&ha6,&hb4,&hba, _
    		&hdb,&hd5,&hc7,&hc9,&he3,&hed,&hff,&hf1,&hab,&ha5,&hb7,&hb9,&h93,&h9d,&h8f,&h81, _
    		&h3b,&h35,&h27,&h29,&h03,&h0d,&h1f,&h11,&h4b,&h45,&h57,&h59,&h73,&h7d,&h6f,&h61, _
    		&had,&ha3,&hb1,&hbf,&h95,&h9b,&h89,&h87,&hdd,&hd3,&hc1,&hcf,&he5,&heb,&hf9,&hf7, _
    		&h4d,&h43,&h51,&h5f,&h75,&h7b,&h69,&h67,&h3d,&h33,&h21,&h2f,&h05,&h0b,&h19,&h17, _
    		&h76,&h78,&h6a,&h64,&h4e,&h40,&h52,&h5c,&h06,&h08,&h1a,&h14,&h3e,&h30,&h22,&h2c, _
    		&h96,&h98,&h8a,&h84,&hae,&ha0,&hb2,&hbc,&he6,&he8,&hfa,&hf4,&hde,&hd0,&hc2,&hcc, _
    		&h41,&h4f,&h5d,&h53,&h79,&h77,&h65,&h6b,&h31,&h3f,&h2d,&h23,&h09,&h07,&h15,&h1b, _
    		&ha1,&haf,&hbd,&hb3,&h99,&h97,&h85,&h8b,&hd1,&hdf,&hcd,&hc3,&he9,&he7,&hf5,&hfb, _
    		&h9a,&h94,&h86,&h88,&ha2,&hac,&hbe,&hb0,&hea,&he4,&hf6,&hf8,&hd2,&hdc,&hce,&hc0, _
    		&h7a,&h74,&h66,&h68,&h42,&h4c,&h5e,&h50,&h0a,&h04,&h16,&h18,&h32,&h3c,&h2e,&h20, _
    		&hec,&he2,&hf0,&hfe,&hd4,&hda,&hc8,&hc6,&h9c,&h92,&h80,&h8e,&ha4,&haa,&hb8,&hb6, _
    		&h0c,&h02,&h10,&h1e,&h34,&h3a,&h28,&h26,&h7c,&h72,&h60,&h6e,&h44,&h4a,&h58,&h56, _
    		&h37,&h39,&h2b,&h25,&h0f,&h01,&h13,&h1d,&h47,&h49,&h5b,&h55,&h7f,&h71,&h63,&h6d, _
    		&hd7,&hd9,&hcb,&hc5,&hef,&he1,&hf3,&hfd,&ha7,&ha9,&hbb,&hb5,&h9f,&h91,&h83,&h8d)
    
    	sbox = Array( _
    		&h63, &h7c, &h77, &h7b, &hf2, &h6b, &h6f, &hc5, &h30, &h01, &h67, &h2b, &hfe, &hd7, &hab, &h76, _
    		&hca, &h82, &hc9, &h7d, &hfa, &h59, &h47, &hf0, &had, &hd4, &ha2, &haf, &h9c, &ha4, &h72, &hc0, _
    		&hb7, &hfd, &h93, &h26, &h36, &h3f, &hf7, &hcc, &h34, &ha5, &he5, &hf1, &h71, &hd8, &h31, &h15, _
    		&h04, &hc7, &h23, &hc3, &h18, &h96, &h05, &h9a, &h07, &h12, &h80, &he2, &heb, &h27, &hb2, &h75, _
    		&h09, &h83, &h2c, &h1a, &h1b, &h6e, &h5a, &ha0, &h52, &h3b, &hd6, &hb3, &h29, &he3, &h2f, &h84, _
    		&h53, &hd1, &h00, &hed, &h20, &hfc, &hb1, &h5b, &h6a, &hcb, &hbe, &h39, &h4a, &h4c, &h58, &hcf, _
    		&hd0, &hef, &haa, &hfb, &h43, &h4d, &h33, &h85, &h45, &hf9, &h02, &h7f, &h50, &h3c, &h9f, &ha8, _
    		&h51, &ha3, &h40, &h8f, &h92, &h9d, &h38, &hf5, &hbc, &hb6, &hda, &h21, &h10, &hff, &hf3, &hd2, _
    		&hcd, &h0c, &h13, &hec, &h5f, &h97, &h44, &h17, &hc4, &ha7, &h7e, &h3d, &h64, &h5d, &h19, &h73, _
    		&h60, &h81, &h4f, &hdc, &h22, &h2a, &h90, &h88, &h46, &hee, &hb8, &h14, &hde, &h5e, &h0b, &hdb, _
    		&he0, &h32, &h3a, &h0a, &h49, &h06, &h24, &h5c, &hc2, &hd3, &hac, &h62, &h91, &h95, &he4, &h79, _
    		&he7, &hc8, &h37, &h6d, &h8d, &hd5, &h4e, &ha9, &h6c, &h56, &hf4, &hea, &h65, &h7a, &hae, &h08, _
    		&hba, &h78, &h25, &h2e, &h1c, &ha6, &hb4, &hc6, &he8, &hdd, &h74, &h1f, &h4b, &hbd, &h8b, &h8a, _
    		&h70, &h3e, &hb5, &h66, &h48, &h03, &hf6, &h0e, &h61, &h35, &h57, &hb9, &h86, &hc1, &h1d, &h9e, _
    		&he1, &hf8, &h98, &h11, &h69, &hd9, &h8e, &h94, &h9b, &h1e, &h87, &he9, &hce, &h55, &h28, &hdf, _
    		&h8c, &ha1, &h89, &h0d, &hbf, &he6, &h42, &h68, &h41, &h99, &h2d, &h0f, &hb0, &h54, &hbb, &h16)
    		
    	sboxinv = Array( _
    		&h52, &h09, &h6a, &hd5, &h30, &h36, &ha5, &h38, &hbf, &h40, &ha3, &h9e, &h81, &hf3, &hd7, &hfb, _
    		&h7c, &he3, &h39, &h82, &h9b, &h2f, &hff, &h87, &h34, &h8e, &h43, &h44, &hc4, &hde, &he9, &hcb, _
    		&h54, &h7b, &h94, &h32, &ha6, &hc2, &h23, &h3d, &hee, &h4c, &h95, &h0b, &h42, &hfa, &hc3, &h4e, _
    		&h08, &h2e, &ha1, &h66, &h28, &hd9, &h24, &hb2, &h76, &h5b, &ha2, &h49, &h6d, &h8b, &hd1, &h25, _
    		&h72, &hf8, &hf6, &h64, &h86, &h68, &h98, &h16, &hd4, &ha4, &h5c, &hcc, &h5d, &h65, &hb6, &h92, _
    		&h6c, &h70, &h48, &h50, &hfd, &hed, &hb9, &hda, &h5e, &h15, &h46, &h57, &ha7, &h8d, &h9d, &h84, _
    		&h90, &hd8, &hab, &h00, &h8c, &hbc, &hd3, &h0a, &hf7, &he4, &h58, &h05, &hb8, &hb3, &h45, &h06, _
    		&hd0, &h2c, &h1e, &h8f, &hca, &h3f, &h0f, &h02, &hc1, &haf, &hbd, &h03, &h01, &h13, &h8a, &h6b, _
    		&h3a, &h91, &h11, &h41, &h4f, &h67, &hdc, &hea, &h97, &hf2, &hcf, &hce, &hf0, &hb4, &he6, &h73, _
    		&h96, &hac, &h74, &h22, &he7, &had, &h35, &h85, &he2, &hf9, &h37, &he8, &h1c, &h75, &hdf, &h6e, _
    		&h47, &hf1, &h1a, &h71, &h1d, &h29, &hc5, &h89, &h6f, &hb7, &h62, &h0e, &haa, &h18, &hbe, &h1b, _
    		&hfc, &h56, &h3e, &h4b, &hc6, &hd2, &h79, &h20, &h9a, &hdb, &hc0, &hfe, &h78, &hcd, &h5a, &hf4, _
    		&h1f, &hdd, &ha8, &h33, &h88, &h07, &hc7, &h31, &hb1, &h12, &h10, &h59, &h27, &h80, &hec, &h5f, _
    		&h60, &h51, &h7f, &ha9, &h19, &hb5, &h4a, &h0d, &h2d, &he5, &h7a, &h9f, &h93, &hc9, &h9c, &hef, _
    		&ha0, &he0, &h3b, &h4d, &hae, &h2a, &hf5, &hb0, &hc8, &heb, &hbb, &h3c, &h83, &h53, &h99, &h61, _
    		&h17, &h2b, &h04, &h7e, &hba, &h77, &hd6, &h26, &he1, &h69, &h14, &h63, &h55, &h21, &h0c, &h7d)
    		
    	rcon = Array( _
    		&h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, _
    		&h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, _
    		&h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, _
    		&h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, _
    		&hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, _
    		&hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, _
    		&h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, _
    		&h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, _
    		&h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, _
    		&h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, _
    		&h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, _
    		&h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, _
    		&h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, _
    		&h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, _
    		&hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, _
    		&h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb)
    
    	Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
    	Dim sPlain, sPass, sCipher, sTemp
    	Dim oFile1, oFS, oFile2
    	Dim x, r, y, temp(4), intTemp
    
    	Set oFS = CreateObject("Scripting.FileSystemObject")
    	Set oFile1 = oFS.OpenTextFile(sFile, ForReading)
    
    	If Right(sFile, 4) <> ".enc" Then
    		sFile = sFile & ".enc"
    		oFS.CreateTextFile sFile, 2, True
    		isEncode = True
    	Else
    		sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
    		oFS.CreateTextFile sFile, 2, True
    		isEncode = False
    	End If
    
    	Set oFile2 = oFS.OpenTextFile(sFile, ForWriting)
    	Set oFS = Nothing
    
    	For i = 0 To (Len(oPW.Value) - 1)
    		aesKey(i) = Asc(Mid(oPW.Value, i + 1, 1))
    	Next
    	
    	For i = Len(oPW.Value) To 31
    		aesKey(i) = 0
    	Next
    	
    	expandedKey = expandKey(aesKey, sbox, rcon)
    
    	Do Until oFile1.AtEndOfStream
    		sPlain = oFile1.Read(1024)
    		sCipher = ""
    		j = 0
    		isDone = False
    		
    		Do Until isDone
    			sTemp = Mid(sPlain, j*16 + 1, 16)
    			
    			If Len(sTemp) < 16 Then
    				For i = Len(sTemp) To 15
    					sTemp = sTemp & Chr(0)
    				Next
    			End If
    			
    			For i = 0 To 15
    				block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
    			Next
    			
    			If (j + 1) * 16 >= Len(sPlain) Then
    				isDone = True
    			End If
    			
    			j = j + 1
    			
    			If isEncode Then
    				r= 0
    				For i = 0 To 15
    					block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
    				Next
    				
    				For x = 1 To 13
    					block(0) = sbox(block(0))
    					block(1) = sbox(block(1))
    					block(2) = sbox(block(2))
    					block(3) = sbox(block(3))
    					
    					intTemp = sbox(block(4))
    					block(4) = sbox(block(5))
    					block(5) = sbox(block(6))
    					block(6) = sbox(block(7))
    					block(7) = intTemp
    					
    					intTemp = sbox(block(8))
    					block(8) = sbox(block(10))
    					block(10) = intTemp
    					intTemp = sbox(block(9))
    					block(9) = sbox(block(11))
    					block(11) = intTemp
    					
    					intTemp = sbox(block(12))
    					block(12) = sbox(block(15))
    					block(15) = sbox(block(14))
    					block(14) = sbox(block(13))
    					block(13) = intTemp
    					
    					r = x * 16
    					For i = 0 To 3
    						temp(0) = block(i)
    						temp(1) = block(i+4)
    						temp(2) = block(i+8)
    						temp(3) = block(i+12)
    						
    						block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r+i*4)
    						block(i+4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r+i*4+1)
    						block(i+8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r+i*4+2)
    						block(i+12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r+i*4+3)
    					Next
    				Next
    				
    				block(0) = sbox(block(0)) Xor expandedKey(224)
    				block(1) = sbox(block(1)) Xor expandedKey(228)
    				block(2) = sbox(block(2)) Xor expandedKey(232)
    				block(3) = sbox(block(3)) Xor expandedKey(236)
    				
    				intTemp = sbox(block(4)) Xor expandedKey(237)
    				block(4) = sbox(block(5)) Xor expandedKey(225)
    				block(5) = sbox(block(6)) Xor expandedKey(229)
    				block(6) = sbox(block(7)) Xor expandedKey(233)
    				block(7) = intTemp
    				
    				intTemp = sbox(block(8)) Xor expandedKey(234)
    				block(8) = sbox(block(10)) Xor expandedKey(226)
    				block(10) = intTemp
    				intTemp = sbox(block(9)) Xor expandedKey(238)
    				block(9) = sbox(block(11)) Xor expandedKey(230)
    				block(11) = intTemp
    				
    				intTemp = sbox(block(12)) Xor expandedKey(231)
    				block(12) = sbox(block(15)) Xor expandedKey(227)
    				block(15) = sbox(block(14)) Xor expandedKey(239)
    				block(14) = sbox(block(13)) Xor expandedKey(235)
    				block(13) = intTemp
    			Else
    				block(0) = sboxinv(block(0) Xor expandedKey(224))
    				block(1) = sboxinv(block(1) Xor expandedKey(228))
    				block(2) = sboxinv(block(2) Xor expandedKey(232))
    				block(3) = sboxinv(block(3) Xor expandedKey(236))
    				
    				intTemp = sboxinv(block(4) Xor expandedKey(225))
    				block(4) = sboxinv(block(7) Xor expandedKey(237))
    				block(7) = sboxinv(block(6) Xor expandedKey(233))
    				block(6) = sboxinv(block(5) Xor expandedKey(229))
    				block(5) = intTemp
    				
    				intTemp = sboxinv(block(8) Xor expandedKey(226))
    				block(8) = sboxinv(block(10) Xor expandedKey(234))
    				block(10) = intTemp
    				intTemp = sboxinv(block(9) Xor expandedKey(230))
    				block(9) = sboxinv(block(11) Xor expandedKey(238))
    				block(11) = intTemp
    				
    				intTemp = sboxinv(block(12) Xor expandedKey(227))
    				block(12) = sboxinv(block(13) Xor expandedKey(231))
    				block(13) = sboxinv(block(14) Xor expandedKey(235))
    				block(14) = sboxinv(block(15) Xor expandedKey(239))
    				block(15) = intTemp
    				
    				For x = 13 To 1 Step -1
    					r = x * 16
    					
    					For i = 0 To 3
    						temp(0) = block(i) Xor expandedKey(r+i*4)
    						temp(1) = block(i+4) Xor expandedKey(r+i*4+1)
    						temp(2) = block(i+8) Xor expandedKey(r+i*4+2)
    						temp(3) = block(i+12) Xor expandedKey(r+i*4+3)
    						
    						block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
    						block(i+4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
    						block(i+8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
    						block(i+12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
    					Next
    				
    					block(0) = sboxinv(block(0))
    					block(1) = sboxinv(block(1))
    					block(2) = sboxinv(block(2))
    					block(3) = sboxinv(block(3))
    					
    					intTemp = sboxinv(block(4))
    					block(4) = sboxinv(block(7))
    					block(7) = sboxinv(block(6))
    					block(6) = sboxinv(block(5))
    					block(5) = intTemp
    					
    					intTemp = sboxinv(block(8))
    					block(8) = sboxinv(block(10))
    					block(10) = intTemp
    					intTemp = sboxinv(block(9))
    					block(9) = sboxinv(block(11))
    					block(11) = intTemp
    					
    					intTemp = sboxinv(block(12))
    					block(12) = sboxinv(block(13))
    					block(13) = sboxinv(block(14))
    					block(14) = sboxinv(block(15))
    					block(15) = intTemp
    				Next
    				
    				r= 0
    				For i = 0 To 15
    					block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
    				Next
    			End If
    			
    			For i = 0 To 15
    				sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
    			Next
    		Loop
    		
    		oFile2.Write sCipher
    	Loop
    			
    	oFile1.Close
    	Set oFile1 = Nothing
    	oFile2.Close
    	Set oFile2 = Nothing
    End Sub
    
    Function keyScheduleCore(ByVal row(), ByVal a, ByRef box(), ByRef rcon())
    	Dim result(4), i
    	
    	For i = 0 To 3
    		result(i) = box(row((i + 5) Mod 4))
    	Next
    	
    	result(0) = result(0) Xor rcon(a)
    	keyScheduleCore = result
    End Function
    
    Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
    	Dim rConIter, temp, i, result(240)
    	
    	ReDim temp(4)
    	rConIter = 1
    	
    	For i = 0 To 31
    		result(i) = key(i)
    	Next
    	
    	For i = 32 To 239 Step 4
    		temp(0) = result(i - 4)
    		temp(1) = result(i - 3)
    		temp(2) = result(i - 2)
    		temp(3) = result(i - 1)
    		
    		If i Mod 32 = 0 Then
    			temp = keyScheduleCore(temp, rConIter, box, rcon)
    			rConIter = rConIter + 1
    		End If
    		
    		If i Mod 32 = 16 Then
    			temp(0) = box(temp(0))
    			temp(1) = box(temp(1))
    			temp(2) = box(temp(2))
    			temp(3) = box(temp(3))
    		End If
    		
    		result(i) = result(i-32) Xor temp(0)
    		result(i+1) = result(i-31) Xor temp(1)
    		result(i+2) = result(i-30) Xor temp(2)
    		result(i+3) = result(i-29) Xor temp(3)
    	Next
    	
    	exPandKey = result
    End Function
    Here is the code for Cipher-block Chaining mode.
    Code:
    Sub RunAES(sFile)
    	Dim sbox, sboxinv, rcon
    	Dim g2, g3, g9, g11, g13, g14
    
    	g2 = Array( _
    		&h00,&h02,&h04,&h06,&h08,&h0a,&h0c,&h0e,&h10,&h12,&h14,&h16,&h18,&h1a,&h1c,&h1e, _
    		&h20,&h22,&h24,&h26,&h28,&h2a,&h2c,&h2e,&h30,&h32,&h34,&h36,&h38,&h3a,&h3c,&h3e, _
    		&h40,&h42,&h44,&h46,&h48,&h4a,&h4c,&h4e,&h50,&h52,&h54,&h56,&h58,&h5a,&h5c,&h5e, _
    		&h60,&h62,&h64,&h66,&h68,&h6a,&h6c,&h6e,&h70,&h72,&h74,&h76,&h78,&h7a,&h7c,&h7e, _
    		&h80,&h82,&h84,&h86,&h88,&h8a,&h8c,&h8e,&h90,&h92,&h94,&h96,&h98,&h9a,&h9c,&h9e, _
    		&ha0,&ha2,&ha4,&ha6,&ha8,&haa,&hac,&hae,&hb0,&hb2,&hb4,&hb6,&hb8,&hba,&hbc,&hbe, _
    		&hc0,&hc2,&hc4,&hc6,&hc8,&hca,&hcc,&hce,&hd0,&hd2,&hd4,&hd6,&hd8,&hda,&hdc,&hde, _
    		&he0,&he2,&he4,&he6,&he8,&hea,&hec,&hee,&hf0,&hf2,&hf4,&hf6,&hf8,&hfa,&hfc,&hfe, _
    		&h1b,&h19,&h1f,&h1d,&h13,&h11,&h17,&h15,&h0b,&h09,&h0f,&h0d,&h03,&h01,&h07,&h05, _
    		&h3b,&h39,&h3f,&h3d,&h33,&h31,&h37,&h35,&h2b,&h29,&h2f,&h2d,&h23,&h21,&h27,&h25, _
    		&h5b,&h59,&h5f,&h5d,&h53,&h51,&h57,&h55,&h4b,&h49,&h4f,&h4d,&h43,&h41,&h47,&h45, _
    		&h7b,&h79,&h7f,&h7d,&h73,&h71,&h77,&h75,&h6b,&h69,&h6f,&h6d,&h63,&h61,&h67,&h65, _
    		&h9b,&h99,&h9f,&h9d,&h93,&h91,&h97,&h95,&h8b,&h89,&h8f,&h8d,&h83,&h81,&h87,&h85, _
    		&hbb,&hb9,&hbf,&hbd,&hb3,&hb1,&hb7,&hb5,&hab,&ha9,&haf,&had,&ha3,&ha1,&ha7,&ha5, _
    		&hdb,&hd9,&hdf,&hdd,&hd3,&hd1,&hd7,&hd5,&hcb,&hc9,&hcf,&hcd,&hc3,&hc1,&hc7,&hc5, _
    		&hfb,&hf9,&hff,&hfd,&hf3,&hf1,&hf7,&hf5,&heb,&he9,&hef,&hed,&he3,&he1,&he7,&he5)
    
    	g3 = Array( _
    		&h00,&h03,&h06,&h05,&h0c,&h0f,&h0a,&h09,&h18,&h1b,&h1e,&h1d,&h14,&h17,&h12,&h11, _
    		&h30,&h33,&h36,&h35,&h3c,&h3f,&h3a,&h39,&h28,&h2b,&h2e,&h2d,&h24,&h27,&h22,&h21, _
    		&h60,&h63,&h66,&h65,&h6c,&h6f,&h6a,&h69,&h78,&h7b,&h7e,&h7d,&h74,&h77,&h72,&h71, _
    		&h50,&h53,&h56,&h55,&h5c,&h5f,&h5a,&h59,&h48,&h4b,&h4e,&h4d,&h44,&h47,&h42,&h41, _
    		&hc0,&hc3,&hc6,&hc5,&hcc,&hcf,&hca,&hc9,&hd8,&hdb,&hde,&hdd,&hd4,&hd7,&hd2,&hd1, _
    		&hf0,&hf3,&hf6,&hf5,&hfc,&hff,&hfa,&hf9,&he8,&heb,&hee,&hed,&he4,&he7,&he2,&he1, _
    		&ha0,&ha3,&ha6,&ha5,&hac,&haf,&haa,&ha9,&hb8,&hbb,&hbe,&hbd,&hb4,&hb7,&hb2,&hb1, _
    		&h90,&h93,&h96,&h95,&h9c,&h9f,&h9a,&h99,&h88,&h8b,&h8e,&h8d,&h84,&h87,&h82,&h81, _
    		&h9b,&h98,&h9d,&h9e,&h97,&h94,&h91,&h92,&h83,&h80,&h85,&h86,&h8f,&h8c,&h89,&h8a, _
    		&hab,&ha8,&had,&hae,&ha7,&ha4,&ha1,&ha2,&hb3,&hb0,&hb5,&hb6,&hbf,&hbc,&hb9,&hba, _
    		&hfb,&hf8,&hfd,&hfe,&hf7,&hf4,&hf1,&hf2,&he3,&he0,&he5,&he6,&hef,&hec,&he9,&hea, _
    		&hcb,&hc8,&hcd,&hce,&hc7,&hc4,&hc1,&hc2,&hd3,&hd0,&hd5,&hd6,&hdf,&hdc,&hd9,&hda, _
    		&h5b,&h58,&h5d,&h5e,&h57,&h54,&h51,&h52,&h43,&h40,&h45,&h46,&h4f,&h4c,&h49,&h4a, _
    		&h6b,&h68,&h6d,&h6e,&h67,&h64,&h61,&h62,&h73,&h70,&h75,&h76,&h7f,&h7c,&h79,&h7a, _
    		&h3b,&h38,&h3d,&h3e,&h37,&h34,&h31,&h32,&h23,&h20,&h25,&h26,&h2f,&h2c,&h29,&h2a, _
    		&h0b,&h08,&h0d,&h0e,&h07,&h04,&h01,&h02,&h13,&h10,&h15,&h16,&h1f,&h1c,&h19,&h1a)
    
    	g9 = Array( _
    		&h00,&h09,&h12,&h1b,&h24,&h2d,&h36,&h3f,&h48,&h41,&h5a,&h53,&h6c,&h65,&h7e,&h77, _
    		&h90,&h99,&h82,&h8b,&hb4,&hbd,&ha6,&haf,&hd8,&hd1,&hca,&hc3,&hfc,&hf5,&hee,&he7, _
    		&h3b,&h32,&h29,&h20,&h1f,&h16,&h0d,&h04,&h73,&h7a,&h61,&h68,&h57,&h5e,&h45,&h4c, _
    		&hab,&ha2,&hb9,&hb0,&h8f,&h86,&h9d,&h94,&he3,&hea,&hf1,&hf8,&hc7,&hce,&hd5,&hdc, _
    		&h76,&h7f,&h64,&h6d,&h52,&h5b,&h40,&h49,&h3e,&h37,&h2c,&h25,&h1a,&h13,&h08,&h01, _
    		&he6,&hef,&hf4,&hfd,&hc2,&hcb,&hd0,&hd9,&hae,&ha7,&hbc,&hb5,&h8a,&h83,&h98,&h91, _
    		&h4d,&h44,&h5f,&h56,&h69,&h60,&h7b,&h72,&h05,&h0c,&h17,&h1e,&h21,&h28,&h33,&h3a, _
    		&hdd,&hd4,&hcf,&hc6,&hf9,&hf0,&heb,&he2,&h95,&h9c,&h87,&h8e,&hb1,&hb8,&ha3,&haa, _
    		&hec,&he5,&hfe,&hf7,&hc8,&hc1,&hda,&hd3,&ha4,&had,&hb6,&hbf,&h80,&h89,&h92,&h9b, _
    		&h7c,&h75,&h6e,&h67,&h58,&h51,&h4a,&h43,&h34,&h3d,&h26,&h2f,&h10,&h19,&h02,&h0b, _
    		&hd7,&hde,&hc5,&hcc,&hf3,&hfa,&he1,&he8,&h9f,&h96,&h8d,&h84,&hbb,&hb2,&ha9,&ha0, _
    		&h47,&h4e,&h55,&h5c,&h63,&h6a,&h71,&h78,&h0f,&h06,&h1d,&h14,&h2b,&h22,&h39,&h30, _
    		&h9a,&h93,&h88,&h81,&hbe,&hb7,&hac,&ha5,&hd2,&hdb,&hc0,&hc9,&hf6,&hff,&he4,&hed, _
    		&h0a,&h03,&h18,&h11,&h2e,&h27,&h3c,&h35,&h42,&h4b,&h50,&h59,&h66,&h6f,&h74,&h7d, _
    		&ha1,&ha8,&hb3,&hba,&h85,&h8c,&h97,&h9e,&he9,&he0,&hfb,&hf2,&hcd,&hc4,&hdf,&hd6, _
    		&h31,&h38,&h23,&h2a,&h15,&h1c,&h07,&h0e,&h79,&h70,&h6b,&h62,&h5d,&h54,&h4f,&h46)
    
    	g11 = Array( _
    		&h00,&h0b,&h16,&h1d,&h2c,&h27,&h3a,&h31,&h58,&h53,&h4e,&h45,&h74,&h7f,&h62,&h69, _
    		&hb0,&hbb,&ha6,&had,&h9c,&h97,&h8a,&h81,&he8,&he3,&hfe,&hf5,&hc4,&hcf,&hd2,&hd9, _
    		&h7b,&h70,&h6d,&h66,&h57,&h5c,&h41,&h4a,&h23,&h28,&h35,&h3e,&h0f,&h04,&h19,&h12, _
    		&hcb,&hc0,&hdd,&hd6,&he7,&hec,&hf1,&hfa,&h93,&h98,&h85,&h8e,&hbf,&hb4,&ha9,&ha2, _
    		&hf6,&hfd,&he0,&heb,&hda,&hd1,&hcc,&hc7,&hae,&ha5,&hb8,&hb3,&h82,&h89,&h94,&h9f, _
    		&h46,&h4d,&h50,&h5b,&h6a,&h61,&h7c,&h77,&h1e,&h15,&h08,&h03,&h32,&h39,&h24,&h2f, _
    		&h8d,&h86,&h9b,&h90,&ha1,&haa,&hb7,&hbc,&hd5,&hde,&hc3,&hc8,&hf9,&hf2,&hef,&he4, _
    		&h3d,&h36,&h2b,&h20,&h11,&h1a,&h07,&h0c,&h65,&h6e,&h73,&h78,&h49,&h42,&h5f,&h54, _
    		&hf7,&hfc,&he1,&hea,&hdb,&hd0,&hcd,&hc6,&haf,&ha4,&hb9,&hb2,&h83,&h88,&h95,&h9e, _
    		&h47,&h4c,&h51,&h5a,&h6b,&h60,&h7d,&h76,&h1f,&h14,&h09,&h02,&h33,&h38,&h25,&h2e, _
    		&h8c,&h87,&h9a,&h91,&ha0,&hab,&hb6,&hbd,&hd4,&hdf,&hc2,&hc9,&hf8,&hf3,&hee,&he5, _
    		&h3c,&h37,&h2a,&h21,&h10,&h1b,&h06,&h0d,&h64,&h6f,&h72,&h79,&h48,&h43,&h5e,&h55, _
    		&h01,&h0a,&h17,&h1c,&h2d,&h26,&h3b,&h30,&h59,&h52,&h4f,&h44,&h75,&h7e,&h63,&h68, _
    		&hb1,&hba,&ha7,&hac,&h9d,&h96,&h8b,&h80,&he9,&he2,&hff,&hf4,&hc5,&hce,&hd3,&hd8, _
    		&h7a,&h71,&h6c,&h67,&h56,&h5d,&h40,&h4b,&h22,&h29,&h34,&h3f,&h0e,&h05,&h18,&h13, _
    		&hca,&hc1,&hdc,&hd7,&he6,&hed,&hf0,&hfb,&h92,&h99,&h84,&h8f,&hbe,&hb5,&ha8,&ha3)
    
    	g13 = Array( _
    		&h00,&h0d,&h1a,&h17,&h34,&h39,&h2e,&h23,&h68,&h65,&h72,&h7f,&h5c,&h51,&h46,&h4b, _
    		&hd0,&hdd,&hca,&hc7,&he4,&he9,&hfe,&hf3,&hb8,&hb5,&ha2,&haf,&h8c,&h81,&h96,&h9b, _
    		&hbb,&hb6,&ha1,&hac,&h8f,&h82,&h95,&h98,&hd3,&hde,&hc9,&hc4,&he7,&hea,&hfd,&hf0, _
    		&h6b,&h66,&h71,&h7c,&h5f,&h52,&h45,&h48,&h03,&h0e,&h19,&h14,&h37,&h3a,&h2d,&h20, _
    		&h6d,&h60,&h77,&h7a,&h59,&h54,&h43,&h4e,&h05,&h08,&h1f,&h12,&h31,&h3c,&h2b,&h26, _
    		&hbd,&hb0,&ha7,&haa,&h89,&h84,&h93,&h9e,&hd5,&hd8,&hcf,&hc2,&he1,&hec,&hfb,&hf6, _
    		&hd6,&hdb,&hcc,&hc1,&he2,&hef,&hf8,&hf5,&hbe,&hb3,&ha4,&ha9,&h8a,&h87,&h90,&h9d, _
    		&h06,&h0b,&h1c,&h11,&h32,&h3f,&h28,&h25,&h6e,&h63,&h74,&h79,&h5a,&h57,&h40,&h4d, _
    		&hda,&hd7,&hc0,&hcd,&hee,&he3,&hf4,&hf9,&hb2,&hbf,&ha8,&ha5,&h86,&h8b,&h9c,&h91, _
    		&h0a,&h07,&h10,&h1d,&h3e,&h33,&h24,&h29,&h62,&h6f,&h78,&h75,&h56,&h5b,&h4c,&h41, _
    		&h61,&h6c,&h7b,&h76,&h55,&h58,&h4f,&h42,&h09,&h04,&h13,&h1e,&h3d,&h30,&h27,&h2a, _
    		&hb1,&hbc,&hab,&ha6,&h85,&h88,&h9f,&h92,&hd9,&hd4,&hc3,&hce,&hed,&he0,&hf7,&hfa, _
    		&hb7,&hba,&had,&ha0,&h83,&h8e,&h99,&h94,&hdf,&hd2,&hc5,&hc8,&heb,&he6,&hf1,&hfc, _
    		&h67,&h6a,&h7d,&h70,&h53,&h5e,&h49,&h44,&h0f,&h02,&h15,&h18,&h3b,&h36,&h21,&h2c, _
    		&h0c,&h01,&h16,&h1b,&h38,&h35,&h22,&h2f,&h64,&h69,&h7e,&h73,&h50,&h5d,&h4a,&h47, _
    		&hdc,&hd1,&hc6,&hcb,&he8,&he5,&hf2,&hff,&hb4,&hb9,&hae,&ha3,&h80,&h8d,&h9a,&h97)
    
    	g14 = Array( _
    		&h00,&h0e,&h1c,&h12,&h38,&h36,&h24,&h2a,&h70,&h7e,&h6c,&h62,&h48,&h46,&h54,&h5a, _
    		&he0,&hee,&hfc,&hf2,&hd8,&hd6,&hc4,&hca,&h90,&h9e,&h8c,&h82,&ha8,&ha6,&hb4,&hba, _
    		&hdb,&hd5,&hc7,&hc9,&he3,&hed,&hff,&hf1,&hab,&ha5,&hb7,&hb9,&h93,&h9d,&h8f,&h81, _
    		&h3b,&h35,&h27,&h29,&h03,&h0d,&h1f,&h11,&h4b,&h45,&h57,&h59,&h73,&h7d,&h6f,&h61, _
    		&had,&ha3,&hb1,&hbf,&h95,&h9b,&h89,&h87,&hdd,&hd3,&hc1,&hcf,&he5,&heb,&hf9,&hf7, _
    		&h4d,&h43,&h51,&h5f,&h75,&h7b,&h69,&h67,&h3d,&h33,&h21,&h2f,&h05,&h0b,&h19,&h17, _
    		&h76,&h78,&h6a,&h64,&h4e,&h40,&h52,&h5c,&h06,&h08,&h1a,&h14,&h3e,&h30,&h22,&h2c, _
    		&h96,&h98,&h8a,&h84,&hae,&ha0,&hb2,&hbc,&he6,&he8,&hfa,&hf4,&hde,&hd0,&hc2,&hcc, _
    		&h41,&h4f,&h5d,&h53,&h79,&h77,&h65,&h6b,&h31,&h3f,&h2d,&h23,&h09,&h07,&h15,&h1b, _
    		&ha1,&haf,&hbd,&hb3,&h99,&h97,&h85,&h8b,&hd1,&hdf,&hcd,&hc3,&he9,&he7,&hf5,&hfb, _
    		&h9a,&h94,&h86,&h88,&ha2,&hac,&hbe,&hb0,&hea,&he4,&hf6,&hf8,&hd2,&hdc,&hce,&hc0, _
    		&h7a,&h74,&h66,&h68,&h42,&h4c,&h5e,&h50,&h0a,&h04,&h16,&h18,&h32,&h3c,&h2e,&h20, _
    		&hec,&he2,&hf0,&hfe,&hd4,&hda,&hc8,&hc6,&h9c,&h92,&h80,&h8e,&ha4,&haa,&hb8,&hb6, _
    		&h0c,&h02,&h10,&h1e,&h34,&h3a,&h28,&h26,&h7c,&h72,&h60,&h6e,&h44,&h4a,&h58,&h56, _
    		&h37,&h39,&h2b,&h25,&h0f,&h01,&h13,&h1d,&h47,&h49,&h5b,&h55,&h7f,&h71,&h63,&h6d, _
    		&hd7,&hd9,&hcb,&hc5,&hef,&he1,&hf3,&hfd,&ha7,&ha9,&hbb,&hb5,&h9f,&h91,&h83,&h8d)
    
    	sbox = Array( _
    		&h63, &h7c, &h77, &h7b, &hf2, &h6b, &h6f, &hc5, &h30, &h01, &h67, &h2b, &hfe, &hd7, &hab, &h76, _
    		&hca, &h82, &hc9, &h7d, &hfa, &h59, &h47, &hf0, &had, &hd4, &ha2, &haf, &h9c, &ha4, &h72, &hc0, _
    		&hb7, &hfd, &h93, &h26, &h36, &h3f, &hf7, &hcc, &h34, &ha5, &he5, &hf1, &h71, &hd8, &h31, &h15, _
    		&h04, &hc7, &h23, &hc3, &h18, &h96, &h05, &h9a, &h07, &h12, &h80, &he2, &heb, &h27, &hb2, &h75, _
    		&h09, &h83, &h2c, &h1a, &h1b, &h6e, &h5a, &ha0, &h52, &h3b, &hd6, &hb3, &h29, &he3, &h2f, &h84, _
    		&h53, &hd1, &h00, &hed, &h20, &hfc, &hb1, &h5b, &h6a, &hcb, &hbe, &h39, &h4a, &h4c, &h58, &hcf, _
    		&hd0, &hef, &haa, &hfb, &h43, &h4d, &h33, &h85, &h45, &hf9, &h02, &h7f, &h50, &h3c, &h9f, &ha8, _
    		&h51, &ha3, &h40, &h8f, &h92, &h9d, &h38, &hf5, &hbc, &hb6, &hda, &h21, &h10, &hff, &hf3, &hd2, _
    		&hcd, &h0c, &h13, &hec, &h5f, &h97, &h44, &h17, &hc4, &ha7, &h7e, &h3d, &h64, &h5d, &h19, &h73, _
    		&h60, &h81, &h4f, &hdc, &h22, &h2a, &h90, &h88, &h46, &hee, &hb8, &h14, &hde, &h5e, &h0b, &hdb, _
    		&he0, &h32, &h3a, &h0a, &h49, &h06, &h24, &h5c, &hc2, &hd3, &hac, &h62, &h91, &h95, &he4, &h79, _
    		&he7, &hc8, &h37, &h6d, &h8d, &hd5, &h4e, &ha9, &h6c, &h56, &hf4, &hea, &h65, &h7a, &hae, &h08, _
    		&hba, &h78, &h25, &h2e, &h1c, &ha6, &hb4, &hc6, &he8, &hdd, &h74, &h1f, &h4b, &hbd, &h8b, &h8a, _
    		&h70, &h3e, &hb5, &h66, &h48, &h03, &hf6, &h0e, &h61, &h35, &h57, &hb9, &h86, &hc1, &h1d, &h9e, _
    		&he1, &hf8, &h98, &h11, &h69, &hd9, &h8e, &h94, &h9b, &h1e, &h87, &he9, &hce, &h55, &h28, &hdf, _
    		&h8c, &ha1, &h89, &h0d, &hbf, &he6, &h42, &h68, &h41, &h99, &h2d, &h0f, &hb0, &h54, &hbb, &h16)
    		
    	sboxinv = Array( _
    		&h52, &h09, &h6a, &hd5, &h30, &h36, &ha5, &h38, &hbf, &h40, &ha3, &h9e, &h81, &hf3, &hd7, &hfb, _
    		&h7c, &he3, &h39, &h82, &h9b, &h2f, &hff, &h87, &h34, &h8e, &h43, &h44, &hc4, &hde, &he9, &hcb, _
    		&h54, &h7b, &h94, &h32, &ha6, &hc2, &h23, &h3d, &hee, &h4c, &h95, &h0b, &h42, &hfa, &hc3, &h4e, _
    		&h08, &h2e, &ha1, &h66, &h28, &hd9, &h24, &hb2, &h76, &h5b, &ha2, &h49, &h6d, &h8b, &hd1, &h25, _
    		&h72, &hf8, &hf6, &h64, &h86, &h68, &h98, &h16, &hd4, &ha4, &h5c, &hcc, &h5d, &h65, &hb6, &h92, _
    		&h6c, &h70, &h48, &h50, &hfd, &hed, &hb9, &hda, &h5e, &h15, &h46, &h57, &ha7, &h8d, &h9d, &h84, _
    		&h90, &hd8, &hab, &h00, &h8c, &hbc, &hd3, &h0a, &hf7, &he4, &h58, &h05, &hb8, &hb3, &h45, &h06, _
    		&hd0, &h2c, &h1e, &h8f, &hca, &h3f, &h0f, &h02, &hc1, &haf, &hbd, &h03, &h01, &h13, &h8a, &h6b, _
    		&h3a, &h91, &h11, &h41, &h4f, &h67, &hdc, &hea, &h97, &hf2, &hcf, &hce, &hf0, &hb4, &he6, &h73, _
    		&h96, &hac, &h74, &h22, &he7, &had, &h35, &h85, &he2, &hf9, &h37, &he8, &h1c, &h75, &hdf, &h6e, _
    		&h47, &hf1, &h1a, &h71, &h1d, &h29, &hc5, &h89, &h6f, &hb7, &h62, &h0e, &haa, &h18, &hbe, &h1b, _
    		&hfc, &h56, &h3e, &h4b, &hc6, &hd2, &h79, &h20, &h9a, &hdb, &hc0, &hfe, &h78, &hcd, &h5a, &hf4, _
    		&h1f, &hdd, &ha8, &h33, &h88, &h07, &hc7, &h31, &hb1, &h12, &h10, &h59, &h27, &h80, &hec, &h5f, _
    		&h60, &h51, &h7f, &ha9, &h19, &hb5, &h4a, &h0d, &h2d, &he5, &h7a, &h9f, &h93, &hc9, &h9c, &hef, _
    		&ha0, &he0, &h3b, &h4d, &hae, &h2a, &hf5, &hb0, &hc8, &heb, &hbb, &h3c, &h83, &h53, &h99, &h61, _
    		&h17, &h2b, &h04, &h7e, &hba, &h77, &hd6, &h26, &he1, &h69, &h14, &h63, &h55, &h21, &h0c, &h7d)
    		
    	rcon = Array( _
    		&h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, _
    		&h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, _
    		&h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, _
    		&h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, _
    		&hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, _
    		&hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, _
    		&h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, &h40, &h80, &h1b, _
    		&h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, &h6a, &hd4, &hb3, _
    		&h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, &h25, &h4a, &h94, _
    		&h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, &h08, &h10, &h20, _
    		&h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, &hc6, &h97, &h35, _
    		&h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, &h61, &hc2, &h9f, _
    		&h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb, &h8d, &h01, &h02, &h04, _
    		&h08, &h10, &h20, &h40, &h80, &h1b, &h36, &h6c, &hd8, &hab, &h4d, &h9a, &h2f, &h5e, &hbc, &h63, _
    		&hc6, &h97, &h35, &h6a, &hd4, &hb3, &h7d, &hfa, &hef, &hc5, &h91, &h39, &h72, &he4, &hd3, &hbd, _
    		&h61, &hc2, &h9f, &h25, &h4a, &h94, &h33, &h66, &hcc, &h83, &h1d, &h3a, &h74, &he8, &hcb)
    
    	Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
    	Dim sPlain, sPass, sCipher, sTemp, nonce(16), priorCipher(16)
    	Dim oFile1, oFS, oFile2
    	Dim x, r, y, temp(4), intTemp
    
    	Set oFS = CreateObject("Scripting.FileSystemObject")
    	Set oFile1 = oFS.OpenTextFile(sFile, ForReading)
    
    	If Right(sFile, 4) <> ".enc" Then
    		sFile = sFile & ".enc"
    		oFS.CreateTextFile sFile, 2, True
    		isEncode = True
    	Else
    		sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
    		oFS.CreateTextFile sFile, 2, True
    		isEncode = False
    	End If
    
    	Set oFile2 = oFS.OpenTextFile(sFile, ForWriting)
    	Set oFS = Nothing
    	
    	For i = 0 To 15
    		nonce(i) = 0
    	Next
    
    	For i = 0 To (Len(oPW.Value) - 1)
    		aesKey(i) = Asc(Mid(oPW.Value, i + 1, 1))
    	Next
    	
    	For i = Len(oPW.Value) To 31
    		aesKey(i) = 0
    	Next
    	
    	expandedKey = expandKey(aesKey, sbox, rcon)
    
    	Do Until oFile1.AtEndOfStream
    		sPlain = oFile1.Read(1024)
    		sCipher = ""
    		j = 0
    		isDone = False
    		
    		Do Until isDone
    			sTemp = Mid(sPlain, j*16 + 1, 16)
    			
    			If Len(sTemp) < 16 Then
    				For i = Len(sTemp) To 15
    					sTemp = sTemp & Chr(0)
    				Next
    			End If
    			
    			For i = 0 To 15
    				block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
    			Next
    			
    			If (j + 1) * 16 >= Len(sPlain) Then
    				isDone = True
    			End If
    			
    			j = j + 1
    			
    			If isEncode Then
    				r= 0
    				For i = 0 To 15
    					block(i) = block(i) Xor nonce(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
    				Next
    				
    				For x = 1 To 13
    					block(0) = sbox(block(0))
    					block(1) = sbox(block(1))
    					block(2) = sbox(block(2))
    					block(3) = sbox(block(3))
    					
    					intTemp = sbox(block(4))
    					block(4) = sbox(block(5))
    					block(5) = sbox(block(6))
    					block(6) = sbox(block(7))
    					block(7) = intTemp
    					
    					intTemp = sbox(block(8))
    					block(8) = sbox(block(10))
    					block(10) = intTemp
    					intTemp = sbox(block(9))
    					block(9) = sbox(block(11))
    					block(11) = intTemp
    					
    					intTemp = sbox(block(12))
    					block(12) = sbox(block(15))
    					block(15) = sbox(block(14))
    					block(14) = sbox(block(13))
    					block(13) = intTemp
    					
    					r = x * 16
    					For i = 0 To 3
    						temp(0) = block(i)
    						temp(1) = block(i+4)
    						temp(2) = block(i+8)
    						temp(3) = block(i+12)
    						
    						block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r+i*4)
    						block(i+4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r+i*4+1)
    						block(i+8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r+i*4+2)
    						block(i+12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r+i*4+3)
    					Next
    				Next
    				
    				block(0) = sbox(block(0)) Xor expandedKey(224)
    				block(1) = sbox(block(1)) Xor expandedKey(228)
    				block(2) = sbox(block(2)) Xor expandedKey(232)
    				block(3) = sbox(block(3)) Xor expandedKey(236)
    				
    				intTemp = sbox(block(4)) Xor expandedKey(237)
    				block(4) = sbox(block(5)) Xor expandedKey(225)
    				block(5) = sbox(block(6)) Xor expandedKey(229)
    				block(6) = sbox(block(7)) Xor expandedKey(233)
    				block(7) = intTemp
    				
    				intTemp = sbox(block(8)) Xor expandedKey(234)
    				block(8) = sbox(block(10)) Xor expandedKey(226)
    				block(10) = intTemp
    				intTemp = sbox(block(9)) Xor expandedKey(238)
    				block(9) = sbox(block(11)) Xor expandedKey(230)
    				block(11) = intTemp
    				
    				intTemp = sbox(block(12)) Xor expandedKey(231)
    				block(12) = sbox(block(15)) Xor expandedKey(227)
    				block(15) = sbox(block(14)) Xor expandedKey(239)
    				block(14) = sbox(block(13)) Xor expandedKey(235)
    				block(13) = intTemp
    				
    				For i = 0 To 15
    					nonce(i) = block(i)
    				Next
    			Else
    				For i = 0 To 15
    					priorCipher(i) = block(i)
    				Next
    			
    				block(0) = sboxinv(block(0) Xor expandedKey(224))
    				block(1) = sboxinv(block(1) Xor expandedKey(228))
    				block(2) = sboxinv(block(2) Xor expandedKey(232))
    				block(3) = sboxinv(block(3) Xor expandedKey(236))
    				
    				intTemp = sboxinv(block(4) Xor expandedKey(225))
    				block(4) = sboxinv(block(7) Xor expandedKey(237))
    				block(7) = sboxinv(block(6) Xor expandedKey(233))
    				block(6) = sboxinv(block(5) Xor expandedKey(229))
    				block(5) = intTemp
    				
    				intTemp = sboxinv(block(8) Xor expandedKey(226))
    				block(8) = sboxinv(block(10) Xor expandedKey(234))
    				block(10) = intTemp
    				intTemp = sboxinv(block(9) Xor expandedKey(230))
    				block(9) = sboxinv(block(11) Xor expandedKey(238))
    				block(11) = intTemp
    				
    				intTemp = sboxinv(block(12) Xor expandedKey(227))
    				block(12) = sboxinv(block(13) Xor expandedKey(231))
    				block(13) = sboxinv(block(14) Xor expandedKey(235))
    				block(14) = sboxinv(block(15) Xor expandedKey(239))
    				block(15) = intTemp
    				
    				For x = 13 To 1 Step -1
    					r = x * 16
    					
    					For i = 0 To 3
    						temp(0) = block(i) Xor expandedKey(r+i*4)
    						temp(1) = block(i+4) Xor expandedKey(r+i*4+1)
    						temp(2) = block(i+8) Xor expandedKey(r+i*4+2)
    						temp(3) = block(i+12) Xor expandedKey(r+i*4+3)
    						
    						block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
    						block(i+4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
    						block(i+8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
    						block(i+12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
    					Next
    				
    					block(0) = sboxinv(block(0))
    					block(1) = sboxinv(block(1))
    					block(2) = sboxinv(block(2))
    					block(3) = sboxinv(block(3))
    					
    					intTemp = sboxinv(block(4))
    					block(4) = sboxinv(block(7))
    					block(7) = sboxinv(block(6))
    					block(6) = sboxinv(block(5))
    					block(5) = intTemp
    					
    					intTemp = sboxinv(block(8))
    					block(8) = sboxinv(block(10))
    					block(10) = intTemp
    					intTemp = sboxinv(block(9))
    					block(9) = sboxinv(block(11))
    					block(11) = intTemp
    					
    					intTemp = sboxinv(block(12))
    					block(12) = sboxinv(block(13))
    					block(13) = sboxinv(block(14))
    					block(14) = sboxinv(block(15))
    					block(15) = intTemp
    				Next
    				
    				r= 0
    				For i = 0 To 15
    					block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4)) Xor nonce(i)
    					nonce(i) = priorCipher(i)
    				Next
    			End If
    			
    			For i = 0 To 15
    				sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
    			Next
    		Loop
    		
    		oFile2.Write sCipher
    	Loop
    			
    	oFile1.Close
    	Set oFile1 = Nothing
    	oFile2.Close
    	Set oFile2 = Nothing
    End Sub
  • zmbd
    Recognized Expert Moderator Expert
    • Mar 2012
    • 5501

    #2
    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:
    Code:
    Option Compare Database
    Option Explicit
    
    Sub RunAES(sFile, sPassIn)
    ''
    ''Based on code by Rabbit
    'http://bytes.com/topic/access/insights/906850-aes-encryption-algorithm-vba-vbscript
    'See the ECM version for the changes
        Dim sbox(), sboxinv(), rcon()
        Dim g2, g3, g9, g11, g13, g14
      
        g2 = Array( _
            &H0, &H2, &H4, &H6, &H8, &HA, &HC, &HE, &H10, &H12, &H14, &H16, &H18, &H1A, &H1C, &H1E, _
            &H20, &H22, &H24, &H26, &H28, &H2A, &H2C, &H2E, &H30, &H32, &H34, &H36, &H38, &H3A, &H3C, &H3E, _
            &H40, &H42, &H44, &H46, &H48, &H4A, &H4C, &H4E, &H50, &H52, &H54, &H56, &H58, &H5A, &H5C, &H5E, _
            &H60, &H62, &H64, &H66, &H68, &H6A, &H6C, &H6E, &H70, &H72, &H74, &H76, &H78, &H7A, &H7C, &H7E, _
            &H80, &H82, &H84, &H86, &H88, &H8A, &H8C, &H8E, &H90, &H92, &H94, &H96, &H98, &H9A, &H9C, &H9E, _
            &HA0, &HA2, &HA4, &HA6, &HA8, &HAA, &HAC, &HAE, &HB0, &HB2, &HB4, &HB6, &HB8, &HBA, &HBC, &HBE, _
            &HC0, &HC2, &HC4, &HC6, &HC8, &HCA, &HCC, &HCE, &HD0, &HD2, &HD4, &HD6, &HD8, &HDA, &HDC, &HDE, _
            &HE0, &HE2, &HE4, &HE6, &HE8, &HEA, &HEC, &HEE, &HF0, &HF2, &HF4, &HF6, &HF8, &HFA, &HFC, &HFE, _
            &H1B, &H19, &H1F, &H1D, &H13, &H11, &H17, &H15, &HB, &H9, &HF, &HD, &H3, &H1, &H7, &H5, _
            &H3B, &H39, &H3F, &H3D, &H33, &H31, &H37, &H35, &H2B, &H29, &H2F, &H2D, &H23, &H21, &H27, &H25, _
            &H5B, &H59, &H5F, &H5D, &H53, &H51, &H57, &H55, &H4B, &H49, &H4F, &H4D, &H43, &H41, &H47, &H45, _
            &H7B, &H79, &H7F, &H7D, &H73, &H71, &H77, &H75, &H6B, &H69, &H6F, &H6D, &H63, &H61, &H67, &H65, _
            &H9B, &H99, &H9F, &H9D, &H93, &H91, &H97, &H95, &H8B, &H89, &H8F, &H8D, &H83, &H81, &H87, &H85, _
            &HBB, &HB9, &HBF, &HBD, &HB3, &HB1, &HB7, &HB5, &HAB, &HA9, &HAF, &HAD, &HA3, &HA1, &HA7, &HA5, _
            &HDB, &HD9, &HDF, &HDD, &HD3, &HD1, &HD7, &HD5, &HCB, &HC9, &HCF, &HCD, &HC3, &HC1, &HC7, &HC5, _
            &HFB, &HF9, &HFF, &HFD, &HF3, &HF1, &HF7, &HF5, &HEB, &HE9, &HEF, &HED, &HE3, &HE1, &HE7, &HE5)
      
        g3 = Array( _
            &H0, &H3, &H6, &H5, &HC, &HF, &HA, &H9, &H18, &H1B, &H1E, &H1D, &H14, &H17, &H12, &H11, _
            &H30, &H33, &H36, &H35, &H3C, &H3F, &H3A, &H39, &H28, &H2B, &H2E, &H2D, &H24, &H27, &H22, &H21, _
            &H60, &H63, &H66, &H65, &H6C, &H6F, &H6A, &H69, &H78, &H7B, &H7E, &H7D, &H74, &H77, &H72, &H71, _
            &H50, &H53, &H56, &H55, &H5C, &H5F, &H5A, &H59, &H48, &H4B, &H4E, &H4D, &H44, &H47, &H42, &H41, _
            &HC0, &HC3, &HC6, &HC5, &HCC, &HCF, &HCA, &HC9, &HD8, &HDB, &HDE, &HDD, &HD4, &HD7, &HD2, &HD1, _
            &HF0, &HF3, &HF6, &HF5, &HFC, &HFF, &HFA, &HF9, &HE8, &HEB, &HEE, &HED, &HE4, &HE7, &HE2, &HE1, _
            &HA0, &HA3, &HA6, &HA5, &HAC, &HAF, &HAA, &HA9, &HB8, &HBB, &HBE, &HBD, &HB4, &HB7, &HB2, &HB1, _
            &H90, &H93, &H96, &H95, &H9C, &H9F, &H9A, &H99, &H88, &H8B, &H8E, &H8D, &H84, &H87, &H82, &H81, _
            &H9B, &H98, &H9D, &H9E, &H97, &H94, &H91, &H92, &H83, &H80, &H85, &H86, &H8F, &H8C, &H89, &H8A, _
            &HAB, &HA8, &HAD, &HAE, &HA7, &HA4, &HA1, &HA2, &HB3, &HB0, &HB5, &HB6, &HBF, &HBC, &HB9, &HBA, _
            &HFB, &HF8, &HFD, &HFE, &HF7, &HF4, &HF1, &HF2, &HE3, &HE0, &HE5, &HE6, &HEF, &HEC, &HE9, &HEA, _
            &HCB, &HC8, &HCD, &HCE, &HC7, &HC4, &HC1, &HC2, &HD3, &HD0, &HD5, &HD6, &HDF, &HDC, &HD9, &HDA, _
            &H5B, &H58, &H5D, &H5E, &H57, &H54, &H51, &H52, &H43, &H40, &H45, &H46, &H4F, &H4C, &H49, &H4A, _
            &H6B, &H68, &H6D, &H6E, &H67, &H64, &H61, &H62, &H73, &H70, &H75, &H76, &H7F, &H7C, &H79, &H7A, _
            &H3B, &H38, &H3D, &H3E, &H37, &H34, &H31, &H32, &H23, &H20, &H25, &H26, &H2F, &H2C, &H29, &H2A, _
            &HB, &H8, &HD, &HE, &H7, &H4, &H1, &H2, &H13, &H10, &H15, &H16, &H1F, &H1C, &H19, &H1A)
      
        g9 = Array( _
            &H0, &H9, &H12, &H1B, &H24, &H2D, &H36, &H3F, &H48, &H41, &H5A, &H53, &H6C, &H65, &H7E, &H77, _
            &H90, &H99, &H82, &H8B, &HB4, &HBD, &HA6, &HAF, &HD8, &HD1, &HCA, &HC3, &HFC, &HF5, &HEE, &HE7, _
            &H3B, &H32, &H29, &H20, &H1F, &H16, &HD, &H4, &H73, &H7A, &H61, &H68, &H57, &H5E, &H45, &H4C, _
            &HAB, &HA2, &HB9, &HB0, &H8F, &H86, &H9D, &H94, &HE3, &HEA, &HF1, &HF8, &HC7, &HCE, &HD5, &HDC, _
            &H76, &H7F, &H64, &H6D, &H52, &H5B, &H40, &H49, &H3E, &H37, &H2C, &H25, &H1A, &H13, &H8, &H1, _
            &HE6, &HEF, &HF4, &HFD, &HC2, &HCB, &HD0, &HD9, &HAE, &HA7, &HBC, &HB5, &H8A, &H83, &H98, &H91, _
            &H4D, &H44, &H5F, &H56, &H69, &H60, &H7B, &H72, &H5, &HC, &H17, &H1E, &H21, &H28, &H33, &H3A, _
            &HDD, &HD4, &HCF, &HC6, &HF9, &HF0, &HEB, &HE2, &H95, &H9C, &H87, &H8E, &HB1, &HB8, &HA3, &HAA, _
            &HEC, &HE5, &HFE, &HF7, &HC8, &HC1, &HDA, &HD3, &HA4, &HAD, &HB6, &HBF, &H80, &H89, &H92, &H9B, _
            &H7C, &H75, &H6E, &H67, &H58, &H51, &H4A, &H43, &H34, &H3D, &H26, &H2F, &H10, &H19, &H2, &HB, _
            &HD7, &HDE, &HC5, &HCC, &HF3, &HFA, &HE1, &HE8, &H9F, &H96, &H8D, &H84, &HBB, &HB2, &HA9, &HA0, _
            &H47, &H4E, &H55, &H5C, &H63, &H6A, &H71, &H78, &HF, &H6, &H1D, &H14, &H2B, &H22, &H39, &H30, _
            &H9A, &H93, &H88, &H81, &HBE, &HB7, &HAC, &HA5, &HD2, &HDB, &HC0, &HC9, &HF6, &HFF, &HE4, &HED, _
            &HA, &H3, &H18, &H11, &H2E, &H27, &H3C, &H35, &H42, &H4B, &H50, &H59, &H66, &H6F, &H74, &H7D, _
            &HA1, &HA8, &HB3, &HBA, &H85, &H8C, &H97, &H9E, &HE9, &HE0, &HFB, &HF2, &HCD, &HC4, &HDF, &HD6, _
            &H31, &H38, &H23, &H2A, &H15, &H1C, &H7, &HE, &H79, &H70, &H6B, &H62, &H5D, &H54, &H4F, &H46)
      
        g11 = Array( _
            &H0, &HB, &H16, &H1D, &H2C, &H27, &H3A, &H31, &H58, &H53, &H4E, &H45, &H74, &H7F, &H62, &H69, _
            &HB0, &HBB, &HA6, &HAD, &H9C, &H97, &H8A, &H81, &HE8, &HE3, &HFE, &HF5, &HC4, &HCF, &HD2, &HD9, _
            &H7B, &H70, &H6D, &H66, &H57, &H5C, &H41, &H4A, &H23, &H28, &H35, &H3E, &HF, &H4, &H19, &H12, _
            &HCB, &HC0, &HDD, &HD6, &HE7, &HEC, &HF1, &HFA, &H93, &H98, &H85, &H8E, &HBF, &HB4, &HA9, &HA2, _
            &HF6, &HFD, &HE0, &HEB, &HDA, &HD1, &HCC, &HC7, &HAE, &HA5, &HB8, &HB3, &H82, &H89, &H94, &H9F, _
            &H46, &H4D, &H50, &H5B, &H6A, &H61, &H7C, &H77, &H1E, &H15, &H8, &H3, &H32, &H39, &H24, &H2F, _
            &H8D, &H86, &H9B, &H90, &HA1, &HAA, &HB7, &HBC, &HD5, &HDE, &HC3, &HC8, &HF9, &HF2, &HEF, &HE4, _
            &H3D, &H36, &H2B, &H20, &H11, &H1A, &H7, &HC, &H65, &H6E, &H73, &H78, &H49, &H42, &H5F, &H54, _
            &HF7, &HFC, &HE1, &HEA, &HDB, &HD0, &HCD, &HC6, &HAF, &HA4, &HB9, &HB2, &H83, &H88, &H95, &H9E, _
            &H47, &H4C, &H51, &H5A, &H6B, &H60, &H7D, &H76, &H1F, &H14, &H9, &H2, &H33, &H38, &H25, &H2E, _
            &H8C, &H87, &H9A, &H91, &HA0, &HAB, &HB6, &HBD, &HD4, &HDF, &HC2, &HC9, &HF8, &HF3, &HEE, &HE5, _
            &H3C, &H37, &H2A, &H21, &H10, &H1B, &H6, &HD, &H64, &H6F, &H72, &H79, &H48, &H43, &H5E, &H55, _
            &H1, &HA, &H17, &H1C, &H2D, &H26, &H3B, &H30, &H59, &H52, &H4F, &H44, &H75, &H7E, &H63, &H68, _
            &HB1, &HBA, &HA7, &HAC, &H9D, &H96, &H8B, &H80, &HE9, &HE2, &HFF, &HF4, &HC5, &HCE, &HD3, &HD8, _
            &H7A, &H71, &H6C, &H67, &H56, &H5D, &H40, &H4B, &H22, &H29, &H34, &H3F, &HE, &H5, &H18, &H13, _
            &HCA, &HC1, &HDC, &HD7, &HE6, &HED, &HF0, &HFB, &H92, &H99, &H84, &H8F, &HBE, &HB5, &HA8, &HA3)
      
        g13 = Array( _
            &H0, &HD, &H1A, &H17, &H34, &H39, &H2E, &H23, &H68, &H65, &H72, &H7F, &H5C, &H51, &H46, &H4B, _
            &HD0, &HDD, &HCA, &HC7, &HE4, &HE9, &HFE, &HF3, &HB8, &HB5, &HA2, &HAF, &H8C, &H81, &H96, &H9B, _
            &HBB, &HB6, &HA1, &HAC, &H8F, &H82, &H95, &H98, &HD3, &HDE, &HC9, &HC4, &HE7, &HEA, &HFD, &HF0, _
            &H6B, &H66, &H71, &H7C, &H5F, &H52, &H45, &H48, &H3, &HE, &H19, &H14, &H37, &H3A, &H2D, &H20, _
            &H6D, &H60, &H77, &H7A, &H59, &H54, &H43, &H4E, &H5, &H8, &H1F, &H12, &H31, &H3C, &H2B, &H26, _
            &HBD, &HB0, &HA7, &HAA, &H89, &H84, &H93, &H9E, &HD5, &HD8, &HCF, &HC2, &HE1, &HEC, &HFB, &HF6, _
            &HD6, &HDB, &HCC, &HC1, &HE2, &HEF, &HF8, &HF5, &HBE, &HB3, &HA4, &HA9, &H8A, &H87, &H90, &H9D, _
            &H6, &HB, &H1C, &H11, &H32, &H3F, &H28, &H25, &H6E, &H63, &H74, &H79, &H5A, &H57, &H40, &H4D, _
            &HDA, &HD7, &HC0, &HCD, &HEE, &HE3, &HF4, &HF9, &HB2, &HBF, &HA8, &HA5, &H86, &H8B, &H9C, &H91, _
            &HA, &H7, &H10, &H1D, &H3E, &H33, &H24, &H29, &H62, &H6F, &H78, &H75, &H56, &H5B, &H4C, &H41, _
            &H61, &H6C, &H7B, &H76, &H55, &H58, &H4F, &H42, &H9, &H4, &H13, &H1E, &H3D, &H30, &H27, &H2A, _
            &HB1, &HBC, &HAB, &HA6, &H85, &H88, &H9F, &H92, &HD9, &HD4, &HC3, &HCE, &HED, &HE0, &HF7, &HFA, _
            &HB7, &HBA, &HAD, &HA0, &H83, &H8E, &H99, &H94, &HDF, &HD2, &HC5, &HC8, &HEB, &HE6, &HF1, &HFC, _
            &H67, &H6A, &H7D, &H70, &H53, &H5E, &H49, &H44, &HF, &H2, &H15, &H18, &H3B, &H36, &H21, &H2C, _
            &HC, &H1, &H16, &H1B, &H38, &H35, &H22, &H2F, &H64, &H69, &H7E, &H73, &H50, &H5D, &H4A, &H47, _
            &HDC, &HD1, &HC6, &HCB, &HE8, &HE5, &HF2, &HFF, &HB4, &HB9, &HAE, &HA3, &H80, &H8D, &H9A, &H97)
      
        g14 = Array( _
            &H0, &HE, &H1C, &H12, &H38, &H36, &H24, &H2A, &H70, &H7E, &H6C, &H62, &H48, &H46, &H54, &H5A, _
            &HE0, &HEE, &HFC, &HF2, &HD8, &HD6, &HC4, &HCA, &H90, &H9E, &H8C, &H82, &HA8, &HA6, &HB4, &HBA, _
            &HDB, &HD5, &HC7, &HC9, &HE3, &HED, &HFF, &HF1, &HAB, &HA5, &HB7, &HB9, &H93, &H9D, &H8F, &H81, _
            &H3B, &H35, &H27, &H29, &H3, &HD, &H1F, &H11, &H4B, &H45, &H57, &H59, &H73, &H7D, &H6F, &H61, _
            &HAD, &HA3, &HB1, &HBF, &H95, &H9B, &H89, &H87, &HDD, &HD3, &HC1, &HCF, &HE5, &HEB, &HF9, &HF7, _
            &H4D, &H43, &H51, &H5F, &H75, &H7B, &H69, &H67, &H3D, &H33, &H21, &H2F, &H5, &HB, &H19, &H17, _
            &H76, &H78, &H6A, &H64, &H4E, &H40, &H52, &H5C, &H6, &H8, &H1A, &H14, &H3E, &H30, &H22, &H2C, _
            &H96, &H98, &H8A, &H84, &HAE, &HA0, &HB2, &HBC, &HE6, &HE8, &HFA, &HF4, &HDE, &HD0, &HC2, &HCC, _
            &H41, &H4F, &H5D, &H53, &H79, &H77, &H65, &H6B, &H31, &H3F, &H2D, &H23, &H9, &H7, &H15, &H1B, _
            &HA1, &HAF, &HBD, &HB3, &H99, &H97, &H85, &H8B, &HD1, &HDF, &HCD, &HC3, &HE9, &HE7, &HF5, &HFB, _
            &H9A, &H94, &H86, &H88, &HA2, &HAC, &HBE, &HB0, &HEA, &HE4, &HF6, &HF8, &HD2, &HDC, &HCE, &HC0, _
            &H7A, &H74, &H66, &H68, &H42, &H4C, &H5E, &H50, &HA, &H4, &H16, &H18, &H32, &H3C, &H2E, &H20, _
            &HEC, &HE2, &HF0, &HFE, &HD4, &HDA, &HC8, &HC6, &H9C, &H92, &H80, &H8E, &HA4, &HAA, &HB8, &HB6, _
            &HC, &H2, &H10, &H1E, &H34, &H3A, &H28, &H26, &H7C, &H72, &H60, &H6E, &H44, &H4A, &H58, &H56, _
            &H37, &H39, &H2B, &H25, &HF, &H1, &H13, &H1D, &H47, &H49, &H5B, &H55, &H7F, &H71, &H63, &H6D, _
            &HD7, &HD9, &HCB, &HC5, &HEF, &HE1, &HF3, &HFD, &HA7, &HA9, &HBB, &HB5, &H9F, &H91, &H83, &H8D)
      
        sbox = Array( _
            &H63, &H7C, &H77, &H7B, &HF2, &H6B, &H6F, &HC5, &H30, &H1, &H67, &H2B, &HFE, &HD7, &HAB, &H76, _
            &HCA, &H82, &HC9, &H7D, &HFA, &H59, &H47, &HF0, &HAD, &HD4, &HA2, &HAF, &H9C, &HA4, &H72, &HC0, _
            &HB7, &HFD, &H93, &H26, &H36, &H3F, &HF7, &HCC, &H34, &HA5, &HE5, &HF1, &H71, &HD8, &H31, &H15, _
            &H4, &HC7, &H23, &HC3, &H18, &H96, &H5, &H9A, &H7, &H12, &H80, &HE2, &HEB, &H27, &HB2, &H75, _
            &H9, &H83, &H2C, &H1A, &H1B, &H6E, &H5A, &HA0, &H52, &H3B, &HD6, &HB3, &H29, &HE3, &H2F, &H84, _
            &H53, &HD1, &H0, &HED, &H20, &HFC, &HB1, &H5B, &H6A, &HCB, &HBE, &H39, &H4A, &H4C, &H58, &HCF, _
            &HD0, &HEF, &HAA, &HFB, &H43, &H4D, &H33, &H85, &H45, &HF9, &H2, &H7F, &H50, &H3C, &H9F, &HA8, _
            &H51, &HA3, &H40, &H8F, &H92, &H9D, &H38, &HF5, &HBC, &HB6, &HDA, &H21, &H10, &HFF, &HF3, &HD2, _
            &HCD, &HC, &H13, &HEC, &H5F, &H97, &H44, &H17, &HC4, &HA7, &H7E, &H3D, &H64, &H5D, &H19, &H73, _
            &H60, &H81, &H4F, &HDC, &H22, &H2A, &H90, &H88, &H46, &HEE, &HB8, &H14, &HDE, &H5E, &HB, &HDB, _
            &HE0, &H32, &H3A, &HA, &H49, &H6, &H24, &H5C, &HC2, &HD3, &HAC, &H62, &H91, &H95, &HE4, &H79, _
            &HE7, &HC8, &H37, &H6D, &H8D, &HD5, &H4E, &HA9, &H6C, &H56, &HF4, &HEA, &H65, &H7A, &HAE, &H8, _
            &HBA, &H78, &H25, &H2E, &H1C, &HA6, &HB4, &HC6, &HE8, &HDD, &H74, &H1F, &H4B, &HBD, &H8B, &H8A, _
            &H70, &H3E, &HB5, &H66, &H48, &H3, &HF6, &HE, &H61, &H35, &H57, &HB9, &H86, &HC1, &H1D, &H9E, _
            &HE1, &HF8, &H98, &H11, &H69, &HD9, &H8E, &H94, &H9B, &H1E, &H87, &HE9, &HCE, &H55, &H28, &HDF, _
            &H8C, &HA1, &H89, &HD, &HBF, &HE6, &H42, &H68, &H41, &H99, &H2D, &HF, &HB0, &H54, &HBB, &H16)
      
        sboxinv = Array( _
            &H52, &H9, &H6A, &HD5, &H30, &H36, &HA5, &H38, &HBF, &H40, &HA3, &H9E, &H81, &HF3, &HD7, &HFB, _
            &H7C, &HE3, &H39, &H82, &H9B, &H2F, &HFF, &H87, &H34, &H8E, &H43, &H44, &HC4, &HDE, &HE9, &HCB, _
            &H54, &H7B, &H94, &H32, &HA6, &HC2, &H23, &H3D, &HEE, &H4C, &H95, &HB, &H42, &HFA, &HC3, &H4E, _
            &H8, &H2E, &HA1, &H66, &H28, &HD9, &H24, &HB2, &H76, &H5B, &HA2, &H49, &H6D, &H8B, &HD1, &H25, _
            &H72, &HF8, &HF6, &H64, &H86, &H68, &H98, &H16, &HD4, &HA4, &H5C, &HCC, &H5D, &H65, &HB6, &H92, _
            &H6C, &H70, &H48, &H50, &HFD, &HED, &HB9, &HDA, &H5E, &H15, &H46, &H57, &HA7, &H8D, &H9D, &H84, _
            &H90, &HD8, &HAB, &H0, &H8C, &HBC, &HD3, &HA, &HF7, &HE4, &H58, &H5, &HB8, &HB3, &H45, &H6, _
            &HD0, &H2C, &H1E, &H8F, &HCA, &H3F, &HF, &H2, &HC1, &HAF, &HBD, &H3, &H1, &H13, &H8A, &H6B, _
            &H3A, &H91, &H11, &H41, &H4F, &H67, &HDC, &HEA, &H97, &HF2, &HCF, &HCE, &HF0, &HB4, &HE6, &H73, _
            &H96, &HAC, &H74, &H22, &HE7, &HAD, &H35, &H85, &HE2, &HF9, &H37, &HE8, &H1C, &H75, &HDF, &H6E, _
            &H47, &HF1, &H1A, &H71, &H1D, &H29, &HC5, &H89, &H6F, &HB7, &H62, &HE, &HAA, &H18, &HBE, &H1B, _
            &HFC, &H56, &H3E, &H4B, &HC6, &HD2, &H79, &H20, &H9A, &HDB, &HC0, &HFE, &H78, &HCD, &H5A, &HF4, _
            &H1F, &HDD, &HA8, &H33, &H88, &H7, &HC7, &H31, &HB1, &H12, &H10, &H59, &H27, &H80, &HEC, &H5F, _
            &H60, &H51, &H7F, &HA9, &H19, &HB5, &H4A, &HD, &H2D, &HE5, &H7A, &H9F, &H93, &HC9, &H9C, &HEF, _
            &HA0, &HE0, &H3B, &H4D, &HAE, &H2A, &HF5, &HB0, &HC8, &HEB, &HBB, &H3C, &H83, &H53, &H99, &H61, _
            &H17, &H2B, &H4, &H7E, &HBA, &H77, &HD6, &H26, &HE1, &H69, &H14, &H63, &H55, &H21, &HC, &H7D)
      
        rcon = Array( _
            &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, _
            &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, _
            &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, _
            &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, _
            &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, _
            &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, _
            &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, _
            &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, _
            &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, _
            &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, _
            &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, _
            &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, _
            &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, _
            &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, _
            &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, _
            &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB)
      
        Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
        Dim sPlain, sPass, sCipher, sTemp, nonce(16), priorCipher(16)
        Dim oFile1, oFS, oFile2
        Dim x, r, y, temp(4), intTemp
        Const forreading = 1, forwriting = 2, forappend = 8
      
        Set oFS = CreateObject("Scripting.FileSystemObject")
        Set oFile1 = oFS.OpenTextFile(sFile, forreading)
      
        If Right(sFile, 4) <> ".enc" Then
            sFile = sFile & ".enc"
            oFS.CreateTextFile sFile, 2, True
            isEncode = True
        Else
            sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
            oFS.CreateTextFile sFile, 2, True
            isEncode = False
        End If
      
        Set oFile2 = oFS.OpenTextFile(sFile, forwriting)
        Set oFS = Nothing
      
        For i = 0 To 15
            nonce(i) = 0
        Next
      
    '    For i = 0 To (Len(oPW.value) - 1)
    '        aesKey(i) = Asc(Mid(oPW.value, i + 1, 1))
    '    Next
        For i = 0 To (Len(sPassIn) - 1)
            aesKey(i) = Asc(Mid(sPassIn, i + 1, 1))
        Next
      
    '    For i = Len(oPW.value) To 31
    '        aesKey(i) = 0
    '    Next
         For i = Len(sPassIn) To 31
            aesKey(i) = 0
        Next
      
        expandedKey = expandKey(aesKey, sbox, rcon)
      
        Do Until oFile1.AtEndOfStream
            sPlain = oFile1.Read(1024)
            sCipher = ""
            j = 0
            isDone = False
      
            Do Until isDone
                sTemp = Mid(sPlain, j * 16 + 1, 16)
      
                If Len(sTemp) < 16 Then
                    For i = Len(sTemp) To 15
                        sTemp = sTemp & Chr(0)
                    Next
                End If
      
                For i = 0 To 15
                    block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
                Next
      
                If (j + 1) * 16 >= Len(sPlain) Then
                    isDone = True
                End If
      
                j = j + 1
      
                If isEncode Then
                    r = 0
                    For i = 0 To 15
                        block(i) = block(i) Xor nonce(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
                    Next
      
                    For x = 1 To 13
                        block(0) = sbox(block(0))
                        block(1) = sbox(block(1))
                        block(2) = sbox(block(2))
                        block(3) = sbox(block(3))
      
                        intTemp = sbox(block(4))
                        block(4) = sbox(block(5))
                        block(5) = sbox(block(6))
                        block(6) = sbox(block(7))
                        block(7) = intTemp
      
                        intTemp = sbox(block(8))
                        block(8) = sbox(block(10))
                        block(10) = intTemp
                        intTemp = sbox(block(9))
                        block(9) = sbox(block(11))
                        block(11) = intTemp
      
                        intTemp = sbox(block(12))
                        block(12) = sbox(block(15))
                        block(15) = sbox(block(14))
                        block(14) = sbox(block(13))
                        block(13) = intTemp
      
                        r = x * 16
                        For i = 0 To 3
                            temp(0) = block(i)
                            temp(1) = block(i + 4)
                            temp(2) = block(i + 8)
                            temp(3) = block(i + 12)
      
                            block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r + i * 4)
                            block(i + 4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r + i * 4 + 1)
                            block(i + 8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r + i * 4 + 2)
                            block(i + 12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r + i * 4 + 3)
                        Next
                    Next
      
                    block(0) = sbox(block(0)) Xor expandedKey(224)
                    block(1) = sbox(block(1)) Xor expandedKey(228)
                    block(2) = sbox(block(2)) Xor expandedKey(232)
                    block(3) = sbox(block(3)) Xor expandedKey(236)
      
                    intTemp = sbox(block(4)) Xor expandedKey(237)
                    block(4) = sbox(block(5)) Xor expandedKey(225)
                    block(5) = sbox(block(6)) Xor expandedKey(229)
                    block(6) = sbox(block(7)) Xor expandedKey(233)
                    block(7) = intTemp
      
                    intTemp = sbox(block(8)) Xor expandedKey(234)
                    block(8) = sbox(block(10)) Xor expandedKey(226)
                    block(10) = intTemp
                    intTemp = sbox(block(9)) Xor expandedKey(238)
                    block(9) = sbox(block(11)) Xor expandedKey(230)
                    block(11) = intTemp
      
                    intTemp = sbox(block(12)) Xor expandedKey(231)
                    block(12) = sbox(block(15)) Xor expandedKey(227)
                    block(15) = sbox(block(14)) Xor expandedKey(239)
                    block(14) = sbox(block(13)) Xor expandedKey(235)
                    block(13) = intTemp
      
                    For i = 0 To 15
                        nonce(i) = block(i)
                    Next
                Else
                    For i = 0 To 15
                        priorCipher(i) = block(i)
                    Next
      
                    block(0) = sboxinv(block(0) Xor expandedKey(224))
                    block(1) = sboxinv(block(1) Xor expandedKey(228))
                    block(2) = sboxinv(block(2) Xor expandedKey(232))
                    block(3) = sboxinv(block(3) Xor expandedKey(236))
      
                    intTemp = sboxinv(block(4) Xor expandedKey(225))
                    block(4) = sboxinv(block(7) Xor expandedKey(237))
                    block(7) = sboxinv(block(6) Xor expandedKey(233))
                    block(6) = sboxinv(block(5) Xor expandedKey(229))
                    block(5) = intTemp
      
                    intTemp = sboxinv(block(8) Xor expandedKey(226))
                    block(8) = sboxinv(block(10) Xor expandedKey(234))
                    block(10) = intTemp
                    intTemp = sboxinv(block(9) Xor expandedKey(230))
                    block(9) = sboxinv(block(11) Xor expandedKey(238))
                    block(11) = intTemp
      
                    intTemp = sboxinv(block(12) Xor expandedKey(227))
                    block(12) = sboxinv(block(13) Xor expandedKey(231))
                    block(13) = sboxinv(block(14) Xor expandedKey(235))
                    block(14) = sboxinv(block(15) Xor expandedKey(239))
                    block(15) = intTemp
      
                    For x = 13 To 1 Step -1
                        r = x * 16
      
                        For i = 0 To 3
                            temp(0) = block(i) Xor expandedKey(r + i * 4)
                            temp(1) = block(i + 4) Xor expandedKey(r + i * 4 + 1)
                            temp(2) = block(i + 8) Xor expandedKey(r + i * 4 + 2)
                            temp(3) = block(i + 12) Xor expandedKey(r + i * 4 + 3)
      
                            block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
                            block(i + 4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
                            block(i + 8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
                            block(i + 12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
                        Next
      
                        block(0) = sboxinv(block(0))
                        block(1) = sboxinv(block(1))
                        block(2) = sboxinv(block(2))
                        block(3) = sboxinv(block(3))
      
                        intTemp = sboxinv(block(4))
                        block(4) = sboxinv(block(7))
                        block(7) = sboxinv(block(6))
                        block(6) = sboxinv(block(5))
                        block(5) = intTemp
      
                        intTemp = sboxinv(block(8))
                        block(8) = sboxinv(block(10))
                        block(10) = intTemp
                        intTemp = sboxinv(block(9))
                        block(9) = sboxinv(block(11))
                        block(11) = intTemp
      
                        intTemp = sboxinv(block(12))
                        block(12) = sboxinv(block(13))
                        block(13) = sboxinv(block(14))
                        block(14) = sboxinv(block(15))
                        block(15) = intTemp
                    Next
      
                    r = 0
                    For i = 0 To 15
                        block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4)) Xor nonce(i)
                        nonce(i) = priorCipher(i)
                    Next
                End If
      
                For i = 0 To 15
                    sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
                Next
            Loop
      
            oFile2.Write sCipher
        Loop
      
        oFile1.Close
        Set oFile1 = Nothing
        oFile2.Close
        Set oFile2 = Nothing
    End Sub
      
    Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
        'MOD added () to array variables
        Dim rConIter, temp(), i, result(240)
      
        ReDim temp(4)
        rConIter = 1
      
        For i = 0 To 31
            result(i) = key(i)
        Next
      
        For i = 32 To 239 Step 4
            temp(0) = result(i - 4)
            temp(1) = result(i - 3)
            temp(2) = result(i - 2)
            temp(3) = result(i - 1)
      
            If i Mod 32 = 0 Then
                temp = keyScheduleCore(temp, rConIter, box, rcon)
                rConIter = rConIter + 1
            End If
      
            If i Mod 32 = 16 Then
                temp(0) = box(temp(0))
                temp(1) = box(temp(1))
                temp(2) = box(temp(2))
                temp(3) = box(temp(3))
            End If
      
            result(i) = result(i - 32) Xor temp(0)
            result(i + 1) = result(i - 31) Xor temp(1)
            result(i + 2) = result(i - 30) Xor temp(2)
            result(i + 3) = result(i - 29) Xor temp(3)
        Next
      
        expandKey = result
    End Function
    Last edited by zmbd; Nov 9 '15, 04:36 AM.

    Comment

    • zmbd
      Recognized Expert Moderator Expert
      • Mar 2012
      • 5501

      #3
      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.

      Code:
      Option Compare Database
      Option Explicit
      Sub ztestaes()
          AES "w:\test.txt.enc", "zmbd"
      End Sub
      
      Sub AES_ECB(sFile, sPassIn)
      ''
      ''Based on code by Rabbit
      'http://bytes.com/topic/access/insights/906850-aes-encryption-algorithm-vba-vbscript
      '
      '<<Mod added the sPassin parameter>>
      '<<Mod added () at the end of the following array variables>>
          Dim sbox(), sboxinv(), rcon()
          Dim g2(), g3(), g9(), g11(), g13(), g14()
        
          g2 = Array( _
              &H0, &H2, &H4, &H6, &H8, &HA, &HC, &HE, &H10, &H12, &H14, &H16, &H18, &H1A, &H1C, &H1E, _
              &H20, &H22, &H24, &H26, &H28, &H2A, &H2C, &H2E, &H30, &H32, &H34, &H36, &H38, &H3A, &H3C, &H3E, _
              &H40, &H42, &H44, &H46, &H48, &H4A, &H4C, &H4E, &H50, &H52, &H54, &H56, &H58, &H5A, &H5C, &H5E, _
              &H60, &H62, &H64, &H66, &H68, &H6A, &H6C, &H6E, &H70, &H72, &H74, &H76, &H78, &H7A, &H7C, &H7E, _
              &H80, &H82, &H84, &H86, &H88, &H8A, &H8C, &H8E, &H90, &H92, &H94, &H96, &H98, &H9A, &H9C, &H9E, _
              &HA0, &HA2, &HA4, &HA6, &HA8, &HAA, &HAC, &HAE, &HB0, &HB2, &HB4, &HB6, &HB8, &HBA, &HBC, &HBE, _
              &HC0, &HC2, &HC4, &HC6, &HC8, &HCA, &HCC, &HCE, &HD0, &HD2, &HD4, &HD6, &HD8, &HDA, &HDC, &HDE, _
              &HE0, &HE2, &HE4, &HE6, &HE8, &HEA, &HEC, &HEE, &HF0, &HF2, &HF4, &HF6, &HF8, &HFA, &HFC, &HFE, _
              &H1B, &H19, &H1F, &H1D, &H13, &H11, &H17, &H15, &HB, &H9, &HF, &HD, &H3, &H1, &H7, &H5, _
              &H3B, &H39, &H3F, &H3D, &H33, &H31, &H37, &H35, &H2B, &H29, &H2F, &H2D, &H23, &H21, &H27, &H25, _
              &H5B, &H59, &H5F, &H5D, &H53, &H51, &H57, &H55, &H4B, &H49, &H4F, &H4D, &H43, &H41, &H47, &H45, _
              &H7B, &H79, &H7F, &H7D, &H73, &H71, &H77, &H75, &H6B, &H69, &H6F, &H6D, &H63, &H61, &H67, &H65, _
              &H9B, &H99, &H9F, &H9D, &H93, &H91, &H97, &H95, &H8B, &H89, &H8F, &H8D, &H83, &H81, &H87, &H85, _
              &HBB, &HB9, &HBF, &HBD, &HB3, &HB1, &HB7, &HB5, &HAB, &HA9, &HAF, &HAD, &HA3, &HA1, &HA7, &HA5, _
              &HDB, &HD9, &HDF, &HDD, &HD3, &HD1, &HD7, &HD5, &HCB, &HC9, &HCF, &HCD, &HC3, &HC1, &HC7, &HC5, _
              &HFB, &HF9, &HFF, &HFD, &HF3, &HF1, &HF7, &HF5, &HEB, &HE9, &HEF, &HED, &HE3, &HE1, &HE7, &HE5)
        
          g3 = Array( _
              &H0, &H3, &H6, &H5, &HC, &HF, &HA, &H9, &H18, &H1B, &H1E, &H1D, &H14, &H17, &H12, &H11, _
              &H30, &H33, &H36, &H35, &H3C, &H3F, &H3A, &H39, &H28, &H2B, &H2E, &H2D, &H24, &H27, &H22, &H21, _
              &H60, &H63, &H66, &H65, &H6C, &H6F, &H6A, &H69, &H78, &H7B, &H7E, &H7D, &H74, &H77, &H72, &H71, _
              &H50, &H53, &H56, &H55, &H5C, &H5F, &H5A, &H59, &H48, &H4B, &H4E, &H4D, &H44, &H47, &H42, &H41, _
              &HC0, &HC3, &HC6, &HC5, &HCC, &HCF, &HCA, &HC9, &HD8, &HDB, &HDE, &HDD, &HD4, &HD7, &HD2, &HD1, _
              &HF0, &HF3, &HF6, &HF5, &HFC, &HFF, &HFA, &HF9, &HE8, &HEB, &HEE, &HED, &HE4, &HE7, &HE2, &HE1, _
              &HA0, &HA3, &HA6, &HA5, &HAC, &HAF, &HAA, &HA9, &HB8, &HBB, &HBE, &HBD, &HB4, &HB7, &HB2, &HB1, _
              &H90, &H93, &H96, &H95, &H9C, &H9F, &H9A, &H99, &H88, &H8B, &H8E, &H8D, &H84, &H87, &H82, &H81, _
              &H9B, &H98, &H9D, &H9E, &H97, &H94, &H91, &H92, &H83, &H80, &H85, &H86, &H8F, &H8C, &H89, &H8A, _
              &HAB, &HA8, &HAD, &HAE, &HA7, &HA4, &HA1, &HA2, &HB3, &HB0, &HB5, &HB6, &HBF, &HBC, &HB9, &HBA, _
              &HFB, &HF8, &HFD, &HFE, &HF7, &HF4, &HF1, &HF2, &HE3, &HE0, &HE5, &HE6, &HEF, &HEC, &HE9, &HEA, _
              &HCB, &HC8, &HCD, &HCE, &HC7, &HC4, &HC1, &HC2, &HD3, &HD0, &HD5, &HD6, &HDF, &HDC, &HD9, &HDA, _
              &H5B, &H58, &H5D, &H5E, &H57, &H54, &H51, &H52, &H43, &H40, &H45, &H46, &H4F, &H4C, &H49, &H4A, _
              &H6B, &H68, &H6D, &H6E, &H67, &H64, &H61, &H62, &H73, &H70, &H75, &H76, &H7F, &H7C, &H79, &H7A, _
              &H3B, &H38, &H3D, &H3E, &H37, &H34, &H31, &H32, &H23, &H20, &H25, &H26, &H2F, &H2C, &H29, &H2A, _
              &HB, &H8, &HD, &HE, &H7, &H4, &H1, &H2, &H13, &H10, &H15, &H16, &H1F, &H1C, &H19, &H1A)
        
          g9 = Array( _
              &H0, &H9, &H12, &H1B, &H24, &H2D, &H36, &H3F, &H48, &H41, &H5A, &H53, &H6C, &H65, &H7E, &H77, _
              &H90, &H99, &H82, &H8B, &HB4, &HBD, &HA6, &HAF, &HD8, &HD1, &HCA, &HC3, &HFC, &HF5, &HEE, &HE7, _
              &H3B, &H32, &H29, &H20, &H1F, &H16, &HD, &H4, &H73, &H7A, &H61, &H68, &H57, &H5E, &H45, &H4C, _
              &HAB, &HA2, &HB9, &HB0, &H8F, &H86, &H9D, &H94, &HE3, &HEA, &HF1, &HF8, &HC7, &HCE, &HD5, &HDC, _
              &H76, &H7F, &H64, &H6D, &H52, &H5B, &H40, &H49, &H3E, &H37, &H2C, &H25, &H1A, &H13, &H8, &H1, _
              &HE6, &HEF, &HF4, &HFD, &HC2, &HCB, &HD0, &HD9, &HAE, &HA7, &HBC, &HB5, &H8A, &H83, &H98, &H91, _
              &H4D, &H44, &H5F, &H56, &H69, &H60, &H7B, &H72, &H5, &HC, &H17, &H1E, &H21, &H28, &H33, &H3A, _
              &HDD, &HD4, &HCF, &HC6, &HF9, &HF0, &HEB, &HE2, &H95, &H9C, &H87, &H8E, &HB1, &HB8, &HA3, &HAA, _
              &HEC, &HE5, &HFE, &HF7, &HC8, &HC1, &HDA, &HD3, &HA4, &HAD, &HB6, &HBF, &H80, &H89, &H92, &H9B, _
              &H7C, &H75, &H6E, &H67, &H58, &H51, &H4A, &H43, &H34, &H3D, &H26, &H2F, &H10, &H19, &H2, &HB, _
              &HD7, &HDE, &HC5, &HCC, &HF3, &HFA, &HE1, &HE8, &H9F, &H96, &H8D, &H84, &HBB, &HB2, &HA9, &HA0, _
              &H47, &H4E, &H55, &H5C, &H63, &H6A, &H71, &H78, &HF, &H6, &H1D, &H14, &H2B, &H22, &H39, &H30, _
              &H9A, &H93, &H88, &H81, &HBE, &HB7, &HAC, &HA5, &HD2, &HDB, &HC0, &HC9, &HF6, &HFF, &HE4, &HED, _
              &HA, &H3, &H18, &H11, &H2E, &H27, &H3C, &H35, &H42, &H4B, &H50, &H59, &H66, &H6F, &H74, &H7D, _
              &HA1, &HA8, &HB3, &HBA, &H85, &H8C, &H97, &H9E, &HE9, &HE0, &HFB, &HF2, &HCD, &HC4, &HDF, &HD6, _
              &H31, &H38, &H23, &H2A, &H15, &H1C, &H7, &HE, &H79, &H70, &H6B, &H62, &H5D, &H54, &H4F, &H46)
        
          g11 = Array( _
              &H0, &HB, &H16, &H1D, &H2C, &H27, &H3A, &H31, &H58, &H53, &H4E, &H45, &H74, &H7F, &H62, &H69, _
              &HB0, &HBB, &HA6, &HAD, &H9C, &H97, &H8A, &H81, &HE8, &HE3, &HFE, &HF5, &HC4, &HCF, &HD2, &HD9, _
              &H7B, &H70, &H6D, &H66, &H57, &H5C, &H41, &H4A, &H23, &H28, &H35, &H3E, &HF, &H4, &H19, &H12, _
              &HCB, &HC0, &HDD, &HD6, &HE7, &HEC, &HF1, &HFA, &H93, &H98, &H85, &H8E, &HBF, &HB4, &HA9, &HA2, _
              &HF6, &HFD, &HE0, &HEB, &HDA, &HD1, &HCC, &HC7, &HAE, &HA5, &HB8, &HB3, &H82, &H89, &H94, &H9F, _
              &H46, &H4D, &H50, &H5B, &H6A, &H61, &H7C, &H77, &H1E, &H15, &H8, &H3, &H32, &H39, &H24, &H2F, _
              &H8D, &H86, &H9B, &H90, &HA1, &HAA, &HB7, &HBC, &HD5, &HDE, &HC3, &HC8, &HF9, &HF2, &HEF, &HE4, _
              &H3D, &H36, &H2B, &H20, &H11, &H1A, &H7, &HC, &H65, &H6E, &H73, &H78, &H49, &H42, &H5F, &H54, _
              &HF7, &HFC, &HE1, &HEA, &HDB, &HD0, &HCD, &HC6, &HAF, &HA4, &HB9, &HB2, &H83, &H88, &H95, &H9E, _
              &H47, &H4C, &H51, &H5A, &H6B, &H60, &H7D, &H76, &H1F, &H14, &H9, &H2, &H33, &H38, &H25, &H2E, _
              &H8C, &H87, &H9A, &H91, &HA0, &HAB, &HB6, &HBD, &HD4, &HDF, &HC2, &HC9, &HF8, &HF3, &HEE, &HE5, _
              &H3C, &H37, &H2A, &H21, &H10, &H1B, &H6, &HD, &H64, &H6F, &H72, &H79, &H48, &H43, &H5E, &H55, _
              &H1, &HA, &H17, &H1C, &H2D, &H26, &H3B, &H30, &H59, &H52, &H4F, &H44, &H75, &H7E, &H63, &H68, _
              &HB1, &HBA, &HA7, &HAC, &H9D, &H96, &H8B, &H80, &HE9, &HE2, &HFF, &HF4, &HC5, &HCE, &HD3, &HD8, _
              &H7A, &H71, &H6C, &H67, &H56, &H5D, &H40, &H4B, &H22, &H29, &H34, &H3F, &HE, &H5, &H18, &H13, _
              &HCA, &HC1, &HDC, &HD7, &HE6, &HED, &HF0, &HFB, &H92, &H99, &H84, &H8F, &HBE, &HB5, &HA8, &HA3)
        
          g13 = Array( _
              &H0, &HD, &H1A, &H17, &H34, &H39, &H2E, &H23, &H68, &H65, &H72, &H7F, &H5C, &H51, &H46, &H4B, _
              &HD0, &HDD, &HCA, &HC7, &HE4, &HE9, &HFE, &HF3, &HB8, &HB5, &HA2, &HAF, &H8C, &H81, &H96, &H9B, _
              &HBB, &HB6, &HA1, &HAC, &H8F, &H82, &H95, &H98, &HD3, &HDE, &HC9, &HC4, &HE7, &HEA, &HFD, &HF0, _
              &H6B, &H66, &H71, &H7C, &H5F, &H52, &H45, &H48, &H3, &HE, &H19, &H14, &H37, &H3A, &H2D, &H20, _
              &H6D, &H60, &H77, &H7A, &H59, &H54, &H43, &H4E, &H5, &H8, &H1F, &H12, &H31, &H3C, &H2B, &H26, _
              &HBD, &HB0, &HA7, &HAA, &H89, &H84, &H93, &H9E, &HD5, &HD8, &HCF, &HC2, &HE1, &HEC, &HFB, &HF6, _
              &HD6, &HDB, &HCC, &HC1, &HE2, &HEF, &HF8, &HF5, &HBE, &HB3, &HA4, &HA9, &H8A, &H87, &H90, &H9D, _
              &H6, &HB, &H1C, &H11, &H32, &H3F, &H28, &H25, &H6E, &H63, &H74, &H79, &H5A, &H57, &H40, &H4D, _
              &HDA, &HD7, &HC0, &HCD, &HEE, &HE3, &HF4, &HF9, &HB2, &HBF, &HA8, &HA5, &H86, &H8B, &H9C, &H91, _
              &HA, &H7, &H10, &H1D, &H3E, &H33, &H24, &H29, &H62, &H6F, &H78, &H75, &H56, &H5B, &H4C, &H41, _
              &H61, &H6C, &H7B, &H76, &H55, &H58, &H4F, &H42, &H9, &H4, &H13, &H1E, &H3D, &H30, &H27, &H2A, _
              &HB1, &HBC, &HAB, &HA6, &H85, &H88, &H9F, &H92, &HD9, &HD4, &HC3, &HCE, &HED, &HE0, &HF7, &HFA, _
              &HB7, &HBA, &HAD, &HA0, &H83, &H8E, &H99, &H94, &HDF, &HD2, &HC5, &HC8, &HEB, &HE6, &HF1, &HFC, _
              &H67, &H6A, &H7D, &H70, &H53, &H5E, &H49, &H44, &HF, &H2, &H15, &H18, &H3B, &H36, &H21, &H2C, _
              &HC, &H1, &H16, &H1B, &H38, &H35, &H22, &H2F, &H64, &H69, &H7E, &H73, &H50, &H5D, &H4A, &H47, _
              &HDC, &HD1, &HC6, &HCB, &HE8, &HE5, &HF2, &HFF, &HB4, &HB9, &HAE, &HA3, &H80, &H8D, &H9A, &H97)
        
          g14 = Array( _
              &H0, &HE, &H1C, &H12, &H38, &H36, &H24, &H2A, &H70, &H7E, &H6C, &H62, &H48, &H46, &H54, &H5A, _
              &HE0, &HEE, &HFC, &HF2, &HD8, &HD6, &HC4, &HCA, &H90, &H9E, &H8C, &H82, &HA8, &HA6, &HB4, &HBA, _
              &HDB, &HD5, &HC7, &HC9, &HE3, &HED, &HFF, &HF1, &HAB, &HA5, &HB7, &HB9, &H93, &H9D, &H8F, &H81, _
              &H3B, &H35, &H27, &H29, &H3, &HD, &H1F, &H11, &H4B, &H45, &H57, &H59, &H73, &H7D, &H6F, &H61, _
              &HAD, &HA3, &HB1, &HBF, &H95, &H9B, &H89, &H87, &HDD, &HD3, &HC1, &HCF, &HE5, &HEB, &HF9, &HF7, _
              &H4D, &H43, &H51, &H5F, &H75, &H7B, &H69, &H67, &H3D, &H33, &H21, &H2F, &H5, &HB, &H19, &H17, _
              &H76, &H78, &H6A, &H64, &H4E, &H40, &H52, &H5C, &H6, &H8, &H1A, &H14, &H3E, &H30, &H22, &H2C, _
              &H96, &H98, &H8A, &H84, &HAE, &HA0, &HB2, &HBC, &HE6, &HE8, &HFA, &HF4, &HDE, &HD0, &HC2, &HCC, _
              &H41, &H4F, &H5D, &H53, &H79, &H77, &H65, &H6B, &H31, &H3F, &H2D, &H23, &H9, &H7, &H15, &H1B, _
              &HA1, &HAF, &HBD, &HB3, &H99, &H97, &H85, &H8B, &HD1, &HDF, &HCD, &HC3, &HE9, &HE7, &HF5, &HFB, _
              &H9A, &H94, &H86, &H88, &HA2, &HAC, &HBE, &HB0, &HEA, &HE4, &HF6, &HF8, &HD2, &HDC, &HCE, &HC0, _
              &H7A, &H74, &H66, &H68, &H42, &H4C, &H5E, &H50, &HA, &H4, &H16, &H18, &H32, &H3C, &H2E, &H20, _
              &HEC, &HE2, &HF0, &HFE, &HD4, &HDA, &HC8, &HC6, &H9C, &H92, &H80, &H8E, &HA4, &HAA, &HB8, &HB6, _
              &HC, &H2, &H10, &H1E, &H34, &H3A, &H28, &H26, &H7C, &H72, &H60, &H6E, &H44, &H4A, &H58, &H56, _
              &H37, &H39, &H2B, &H25, &HF, &H1, &H13, &H1D, &H47, &H49, &H5B, &H55, &H7F, &H71, &H63, &H6D, _
              &HD7, &HD9, &HCB, &HC5, &HEF, &HE1, &HF3, &HFD, &HA7, &HA9, &HBB, &HB5, &H9F, &H91, &H83, &H8D)
        
         sbox = Array(&H63, &H7C, &H77, &H7B, &HF2, &H6B, &H6F, &HC5, &H30, &H1, &H67, &H2B, &HFE, &HD7, &HAB, &H76, _
              &HCA, &H82, &HC9, &H7D, &HFA, &H59, &H47, &HF0, &HAD, &HD4, &HA2, &HAF, &H9C, &HA4, &H72, &HC0, _
              &HB7, &HFD, &H93, &H26, &H36, &H3F, &HF7, &HCC, &H34, &HA5, &HE5, &HF1, &H71, &HD8, &H31, &H15, _
              &H4, &HC7, &H23, &HC3, &H18, &H96, &H5, &H9A, &H7, &H12, &H80, &HE2, &HEB, &H27, &HB2, &H75, _
              &H9, &H83, &H2C, &H1A, &H1B, &H6E, &H5A, &HA0, &H52, &H3B, &HD6, &HB3, &H29, &HE3, &H2F, &H84, _
              &H53, &HD1, &H0, &HED, &H20, &HFC, &HB1, &H5B, &H6A, &HCB, &HBE, &H39, &H4A, &H4C, &H58, &HCF, _
              &HD0, &HEF, &HAA, &HFB, &H43, &H4D, &H33, &H85, &H45, &HF9, &H2, &H7F, &H50, &H3C, &H9F, &HA8, _
              &H51, &HA3, &H40, &H8F, &H92, &H9D, &H38, &HF5, &HBC, &HB6, &HDA, &H21, &H10, &HFF, &HF3, &HD2, _
              &HCD, &HC, &H13, &HEC, &H5F, &H97, &H44, &H17, &HC4, &HA7, &H7E, &H3D, &H64, &H5D, &H19, &H73, _
              &H60, &H81, &H4F, &HDC, &H22, &H2A, &H90, &H88, &H46, &HEE, &HB8, &H14, &HDE, &H5E, &HB, &HDB, _
              &HE0, &H32, &H3A, &HA, &H49, &H6, &H24, &H5C, &HC2, &HD3, &HAC, &H62, &H91, &H95, &HE4, &H79, _
              &HE7, &HC8, &H37, &H6D, &H8D, &HD5, &H4E, &HA9, &H6C, &H56, &HF4, &HEA, &H65, &H7A, &HAE, &H8, _
              &HBA, &H78, &H25, &H2E, &H1C, &HA6, &HB4, &HC6, &HE8, &HDD, &H74, &H1F, &H4B, &HBD, &H8B, &H8A, _
              &H70, &H3E, &HB5, &H66, &H48, &H3, &HF6, &HE, &H61, &H35, &H57, &HB9, &H86, &HC1, &H1D, &H9E, _
              &HE1, &HF8, &H98, &H11, &H69, &HD9, &H8E, &H94, &H9B, &H1E, &H87, &HE9, &HCE, &H55, &H28, &HDF, _
              &H8C, &HA1, &H89, &HD, &HBF, &HE6, &H42, &H68, &H41, &H99, &H2D, &HF, &HB0, &H54, &HBB, &H16)
        
          sboxinv = Array( _
              &H52, &H9, &H6A, &HD5, &H30, &H36, &HA5, &H38, &HBF, &H40, &HA3, &H9E, &H81, &HF3, &HD7, &HFB, _
              &H7C, &HE3, &H39, &H82, &H9B, &H2F, &HFF, &H87, &H34, &H8E, &H43, &H44, &HC4, &HDE, &HE9, &HCB, _
              &H54, &H7B, &H94, &H32, &HA6, &HC2, &H23, &H3D, &HEE, &H4C, &H95, &HB, &H42, &HFA, &HC3, &H4E, _
              &H8, &H2E, &HA1, &H66, &H28, &HD9, &H24, &HB2, &H76, &H5B, &HA2, &H49, &H6D, &H8B, &HD1, &H25, _
              &H72, &HF8, &HF6, &H64, &H86, &H68, &H98, &H16, &HD4, &HA4, &H5C, &HCC, &H5D, &H65, &HB6, &H92, _
              &H6C, &H70, &H48, &H50, &HFD, &HED, &HB9, &HDA, &H5E, &H15, &H46, &H57, &HA7, &H8D, &H9D, &H84, _
              &H90, &HD8, &HAB, &H0, &H8C, &HBC, &HD3, &HA, &HF7, &HE4, &H58, &H5, &HB8, &HB3, &H45, &H6, _
              &HD0, &H2C, &H1E, &H8F, &HCA, &H3F, &HF, &H2, &HC1, &HAF, &HBD, &H3, &H1, &H13, &H8A, &H6B, _
              &H3A, &H91, &H11, &H41, &H4F, &H67, &HDC, &HEA, &H97, &HF2, &HCF, &HCE, &HF0, &HB4, &HE6, &H73, _
              &H96, &HAC, &H74, &H22, &HE7, &HAD, &H35, &H85, &HE2, &HF9, &H37, &HE8, &H1C, &H75, &HDF, &H6E, _
              &H47, &HF1, &H1A, &H71, &H1D, &H29, &HC5, &H89, &H6F, &HB7, &H62, &HE, &HAA, &H18, &HBE, &H1B, _
              &HFC, &H56, &H3E, &H4B, &HC6, &HD2, &H79, &H20, &H9A, &HDB, &HC0, &HFE, &H78, &HCD, &H5A, &HF4, _
              &H1F, &HDD, &HA8, &H33, &H88, &H7, &HC7, &H31, &HB1, &H12, &H10, &H59, &H27, &H80, &HEC, &H5F, _
              &H60, &H51, &H7F, &HA9, &H19, &HB5, &H4A, &HD, &H2D, &HE5, &H7A, &H9F, &H93, &HC9, &H9C, &HEF, _
              &HA0, &HE0, &H3B, &H4D, &HAE, &H2A, &HF5, &HB0, &HC8, &HEB, &HBB, &H3C, &H83, &H53, &H99, &H61, _
              &H17, &H2B, &H4, &H7E, &HBA, &H77, &HD6, &H26, &HE1, &H69, &H14, &H63, &H55, &H21, &HC, &H7D)
        
          rcon = Array( _
              &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, _
              &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, _
              &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, _
              &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, _
              &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, _
              &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, _
              &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, &H40, &H80, &H1B, _
              &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, &H6A, &HD4, &HB3, _
              &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, &H25, &H4A, &H94, _
              &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, &H8, &H10, &H20, _
              &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, &HC6, &H97, &H35, _
              &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, &H61, &HC2, &H9F, _
              &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB, &H8D, &H1, &H2, &H4, _
              &H8, &H10, &H20, &H40, &H80, &H1B, &H36, &H6C, &HD8, &HAB, &H4D, &H9A, &H2F, &H5E, &HBC, &H63, _
              &HC6, &H97, &H35, &H6A, &HD4, &HB3, &H7D, &HFA, &HEF, &HC5, &H91, &H39, &H72, &HE4, &HD3, &HBD, _
              &H61, &HC2, &H9F, &H25, &H4A, &H94, &H33, &H66, &HCC, &H83, &H1D, &H3A, &H74, &HE8, &HCB)
        
          Dim expandedKey, block(16), aesKey(32), i, isDone, j, isEncode
          Dim sPlain, sPass, sCipher, sTemp
          Dim oFile1, oFS, oFile2
          Dim x, r, y, temp(4), intTemp
          '<<<MOD = Added the following constants
          Const forreading = 1, forwriting = 2, forappend = 8
          '>>>
        
          Set oFS = CreateObject("Scripting.FileSystemObject")
          Set oFile1 = oFS.OpenTextFile(sFile, forreading)
        
          If Right(sFile, 4) <> ".enc" Then
              sFile = sFile & ".enc"
              oFS.CreateTextFile sFile, 2, True
              isEncode = True
          Else
              sFile = Left(sFile, Len(sFile) - 4) & ".unenc"
              oFS.CreateTextFile sFile, 2, True
              isEncode = False
          End If
        
          Set oFile2 = oFS.OpenTextFile(sFile, forwriting)
          Set oFS = Nothing
          '<<MOD
          sPass = sPassIn
          '>>
          '<<Mod changed the following line
          'For i = 0 To (Len(oPW.value) - 1)
          '
          For i = 0 To (Len(sPass) - 1)
          '>>
          '<<Mod changed the following line
              'aesKey(i) = Asc(Mid(oPW.value, i + 1, 1))
              aesKey(i) = Asc(Mid(sPass, i + 1, 1))
          '>>>
          Next
          '<<Mod changed the following line
          'For i = Len(oPW.value) To 31
          For i = Len(sPass) To 31
          '>>
              aesKey(i) = 0
          Next
          'missing sbox
          expandedKey = expandKey(aesKey, sbox, rcon)
        
          Do Until oFile1.AtEndOfStream
              sPlain = oFile1.Read(1024)
              sCipher = ""
              j = 0
              isDone = False
        
              Do Until isDone
                  sTemp = Mid(sPlain, j * 16 + 1, 16)
        
                  If Len(sTemp) < 16 Then
                      For i = Len(sTemp) To 15
                          sTemp = sTemp & Chr(0)
                      Next
                  End If
        
                  For i = 0 To 15
                      block(i) = Asc(Mid(sTemp, (i Mod 4) * 4 + (i \ 4) + 1, 1))
                  Next
        
                  If (j + 1) * 16 >= Len(sPlain) Then
                      isDone = True
                  End If
        
                  j = j + 1
        
                  If isEncode Then
                      r = 0
                      For i = 0 To 15
                          block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
                      Next
        
                      For x = 1 To 13
                          block(0) = sbox(block(0))
                          block(1) = sbox(block(1))
                          block(2) = sbox(block(2))
                          block(3) = sbox(block(3))
        
                          intTemp = sbox(block(4))
                          block(4) = sbox(block(5))
                          block(5) = sbox(block(6))
                          block(6) = sbox(block(7))
                          block(7) = intTemp
        
                          intTemp = sbox(block(8))
                          block(8) = sbox(block(10))
                          block(10) = intTemp
                          intTemp = sbox(block(9))
                          block(9) = sbox(block(11))
                          block(11) = intTemp
        
                          intTemp = sbox(block(12))
                          block(12) = sbox(block(15))
                          block(15) = sbox(block(14))
                          block(14) = sbox(block(13))
                          block(13) = intTemp
        
                          r = x * 16
                          For i = 0 To 3
                              temp(0) = block(i)
                              temp(1) = block(i + 4)
                              temp(2) = block(i + 8)
                              temp(3) = block(i + 12)
        
                              block(i) = g2(temp(0)) Xor temp(3) Xor temp(2) Xor g3(temp(1)) Xor expandedKey(r + i * 4)
                              block(i + 4) = g2(temp(1)) Xor temp(0) Xor temp(3) Xor g3(temp(2)) Xor expandedKey(r + i * 4 + 1)
                              block(i + 8) = g2(temp(2)) Xor temp(1) Xor temp(0) Xor g3(temp(3)) Xor expandedKey(r + i * 4 + 2)
                              block(i + 12) = g2(temp(3)) Xor temp(2) Xor temp(1) Xor g3(temp(0)) Xor expandedKey(r + i * 4 + 3)
                          Next
                      Next
        
                      block(0) = sbox(block(0)) Xor expandedKey(224)
                      block(1) = sbox(block(1)) Xor expandedKey(228)
                      block(2) = sbox(block(2)) Xor expandedKey(232)
                      block(3) = sbox(block(3)) Xor expandedKey(236)
        
                      intTemp = sbox(block(4)) Xor expandedKey(237)
                      block(4) = sbox(block(5)) Xor expandedKey(225)
                      block(5) = sbox(block(6)) Xor expandedKey(229)
                      block(6) = sbox(block(7)) Xor expandedKey(233)
                      block(7) = intTemp
        
                      intTemp = sbox(block(8)) Xor expandedKey(234)
                      block(8) = sbox(block(10)) Xor expandedKey(226)
                      block(10) = intTemp
                      intTemp = sbox(block(9)) Xor expandedKey(238)
                      block(9) = sbox(block(11)) Xor expandedKey(230)
                      block(11) = intTemp
        
                      intTemp = sbox(block(12)) Xor expandedKey(231)
                      block(12) = sbox(block(15)) Xor expandedKey(227)
                      block(15) = sbox(block(14)) Xor expandedKey(239)
                      block(14) = sbox(block(13)) Xor expandedKey(235)
                      block(13) = intTemp
                  Else
                      block(0) = sboxinv(block(0) Xor expandedKey(224))
                      block(1) = sboxinv(block(1) Xor expandedKey(228))
                      block(2) = sboxinv(block(2) Xor expandedKey(232))
                      block(3) = sboxinv(block(3) Xor expandedKey(236))
        
                      intTemp = sboxinv(block(4) Xor expandedKey(225))
                      block(4) = sboxinv(block(7) Xor expandedKey(237))
                      block(7) = sboxinv(block(6) Xor expandedKey(233))
                      block(6) = sboxinv(block(5) Xor expandedKey(229))
                      block(5) = intTemp
        
                      intTemp = sboxinv(block(8) Xor expandedKey(226))
                      block(8) = sboxinv(block(10) Xor expandedKey(234))
                      block(10) = intTemp
                      intTemp = sboxinv(block(9) Xor expandedKey(230))
                      block(9) = sboxinv(block(11) Xor expandedKey(238))
                      block(11) = intTemp
        
                      intTemp = sboxinv(block(12) Xor expandedKey(227))
                      block(12) = sboxinv(block(13) Xor expandedKey(231))
                      block(13) = sboxinv(block(14) Xor expandedKey(235))
                      block(14) = sboxinv(block(15) Xor expandedKey(239))
                      block(15) = intTemp
        
                      For x = 13 To 1 Step -1
                          r = x * 16
        
                          For i = 0 To 3
                              temp(0) = block(i) Xor expandedKey(r + i * 4)
                              temp(1) = block(i + 4) Xor expandedKey(r + i * 4 + 1)
                              temp(2) = block(i + 8) Xor expandedKey(r + i * 4 + 2)
                              temp(3) = block(i + 12) Xor expandedKey(r + i * 4 + 3)
        
                              block(i) = g14(temp(0)) Xor g9(temp(3)) Xor g13(temp(2)) Xor g11(temp(1))
                              block(i + 4) = g14(temp(1)) Xor g9(temp(0)) Xor g13(temp(3)) Xor g11(temp(2))
                              block(i + 8) = g14(temp(2)) Xor g9(temp(1)) Xor g13(temp(0)) Xor g11(temp(3))
                              block(i + 12) = g14(temp(3)) Xor g9(temp(2)) Xor g13(temp(1)) Xor g11(temp(0))
                          Next
        
                          block(0) = sboxinv(block(0))
                          block(1) = sboxinv(block(1))
                          block(2) = sboxinv(block(2))
                          block(3) = sboxinv(block(3))
        
                          intTemp = sboxinv(block(4))
                          block(4) = sboxinv(block(7))
                          block(7) = sboxinv(block(6))
                          block(6) = sboxinv(block(5))
                          block(5) = intTemp
        
                          intTemp = sboxinv(block(8))
                          block(8) = sboxinv(block(10))
                          block(10) = intTemp
                          intTemp = sboxinv(block(9))
                          block(9) = sboxinv(block(11))
                          block(11) = intTemp
        
                          intTemp = sboxinv(block(12))
                          block(12) = sboxinv(block(13))
                          block(13) = sboxinv(block(14))
                          block(14) = sboxinv(block(15))
                          block(15) = intTemp
                      Next
        
                      r = 0
                      For i = 0 To 15
                          block(i) = block(i) Xor expandedKey((i Mod 4) * 4 + (i \ 4))
                      Next
                  End If
        
                  For i = 0 To 15
                      sCipher = sCipher & Chr(block((i Mod 4) * 4 + (i \ 4)))
                  Next
              Loop
        
              oFile2.Write sCipher
          Loop
        
          oFile1.Close
          Set oFile1 = Nothing
          oFile2.Close
          Set oFile2 = Nothing
      End Sub
        
      Function keyScheduleCore(ByRef row(), ByVal a, ByRef box(), ByRef rcon())
          Dim result(4), i
        
          For i = 0 To 3
              result(i) = box(row((i + 5) Mod 4))
          Next
        
          result(0) = result(0) Xor rcon(a)
          keyScheduleCore = result
      End Function
        
      Function expandKey(ByRef key(), ByRef box(), ByRef rcon())
          'MOD added () to array variables
          Dim rConIter, temp(), i, result(240)
        
          ReDim temp(4)
          rConIter = 1
        
          For i = 0 To 31
              result(i) = key(i)
          Next
        
          For i = 32 To 239 Step 4
              temp(0) = result(i - 4)
              temp(1) = result(i - 3)
              temp(2) = result(i - 2)
              temp(3) = result(i - 1)
        
              If i Mod 32 = 0 Then
                  temp = keyScheduleCore(temp, rConIter, box, rcon)
                  rConIter = rConIter + 1
              End If
        
              If i Mod 32 = 16 Then
                  temp(0) = box(temp(0))
                  temp(1) = box(temp(1))
                  temp(2) = box(temp(2))
                  temp(3) = box(temp(3))
              End If
        
              result(i) = result(i - 32) Xor temp(0)
              result(i + 1) = result(i - 31) Xor temp(1)
              result(i + 2) = result(i - 30) Xor temp(2)
              result(i + 3) = result(i - 29) Xor temp(3)
          Next
        
          expandKey = result
      End Function
      Last edited by zmbd; Nov 9 '15, 04:32 AM.

      Comment

      • VBarion
        New Member
        • Jan 2016
        • 1

        #4
        Thank your for yourCode!
        I was looking for something like that!
        I will try to modify Sub RunAES(sFile, sPassIn) to :
        Function strEncryptAES(s trInputString, 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?

        Comment

        • Rabbit
          Recognized Expert MVP
          • Jan 2007
          • 12517

          #5
          Yes you can use it to encode strings

          Comment

          • zmbd
            Recognized Expert Moderator Expert
            • Mar 2012
            • 5501

            #6
            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 )
            Last edited by zmbd; Jan 16 '16, 04:51 PM.

            Comment

            • merlinkiraly
              New Member
              • Apr 2018
              • 1

              #7
              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.

              Comment

              • Rabbit
                Recognized Expert MVP
                • Jan 2007
                • 12517

                #8
                I don't have a vesion of the code with those characteristics

                Comment

                • lvitya
                  New Member
                  • Jun 2018
                  • 1

                  #9
                  Hi Rabbit,

                  How can I modify your code to be able to decrypt aes128 ecb coded content?

                  Comment

                  • Rabbit
                    Recognized Expert MVP
                    • Jan 2007
                    • 12517

                    #10
                    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.

                    Comment

                    Working...