Split the PHP file and perform Base64 encoding/decoding
-
- $ OrgFile = 'd: \ GdiPlus. dll ';
- $ CacheFileName = 'gdiplus. dll ';
- Function splitFile ($ fileName, $ block ){
- Global $ cacheFileName;
- If (! File_exists ($ fileName) return false;
- $ Num = 1;
- $ File = fopen ($ fileName, 'RB ');
- While ($ content = fread ($ file, $ block )){
- $ CacheFile = $ cacheFileName. '. part'. $ num ++;
- $ Cfile = fopen ($ cacheFile, 'wb ');
- Fwrite ($ cfile, base64_encode ($ content ));
- Fflush ($ cfile );
- Fclose ($ cfile );
- }
- Fclose ($ file );
- }
- Function mergeFile ($ targetFile ){
- Global $ cacheFileName;
- $ Num = 1;
- $ File = fopen ($ targetFile, 'WB ');
- While ($ num> 0 ){
- $ CacheFile = $ cacheFileName. '. part'. $ num ++;
- If (file_exists ($ cacheFile )){
- $ Cfile = fopen ($ cacheFile, 'RB ');
- $ Content = fread ($ cfile, filesize ($ cacheFile ));
- Fclose ($ cfile );
- Fwrite ($ file, base64_decode ($ content ));
- Fflush ($ file );
- } Else {
- $ Num =-1;
- }
- }
- Fclose ($ file );
- }
- SplitFile ($ orgFile, pow (2, 19 ));
- MergeFile ('gdiplus. dll ');
- ?>
- Class Aes {
-
- /**
- * AES Cipher function: encrypt 'input' with Rijndael algorithm
- *
- * @ Param input message as byte-array (16 bytes)
- * @ Param w key schedule as 2D byte-array (Nr + 1 x Nb bytes )-
- * Generated from the cipher key by keyExpansion ()
- * @ Return ciphertext as byte-array (16 bytes)
- */
- Public static function cipher ($ input, $ w ){
- // Main cipher function [§ 5. 1]
- $ Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
- $ Nr = count ($ w)/$ Nb-1; // no of rounds: 10/12/14 for 128/192/256-bit keys
-
- $ State = array (); // initialise 4xNb byte-array 'state' with input [§ 3. 4]
- For ($ I = 0; $ I <4 * $ Nb; $ I ++) $ state [$ I % 4] [floor ($ I/4)] = $ input [$ I];
-
- $ State = self: addRoundKey ($ state, $ w, 0, $ Nb );
-
- For ($ round = 1; $ round <$ Nr; $ round ++) {// apply Nr rounds
- $ State = self: subBytes ($ state, $ Nb );
- $ State = self: shiftRows ($ state, $ Nb );
- $ State = self: mixColumns ($ state, $ Nb );
- $ State = self: addRoundKey ($ state, $ w, $ round, $ Nb );
- }
-
- $ State = self: subBytes ($ state, $ Nb );
- $ State = self: shiftRows ($ state, $ Nb );
- $ State = self: addRoundKey ($ state, $ w, $ Nr, $ Nb );
-
- $ Output = array (4 * $ Nb); // convert state to 1-d array before returning [§ 3. 4]
- For ($ I = 0; $ I <4 * $ Nb; $ I ++) $ output [$ I] = $ state [$ I % 4] [floor ($ I/4)];
- Return $ output;
- }
-
-
- Private static function addRoundKey ($ state, $ w, $ rnd, $ Nb) {// xor Round Key into state S [§ 5. 1.4]
- For ($ r = 0; $ r <4; $ r ++ ){
- For ($ c = 0; $ c <$ Nb; $ c ++) $ state [$ r] [$ c] ^ = $ w [$ rnd * 4 + $ c] [$ r];
- }
- Return $ state;
- }
-
- Private static function subBytes ($ s, $ Nb) {// apply SBox to state S [§ 5. 1.1]
- For ($ r = 0; $ r <4; $ r ++ ){
- For ($ c = 0; $ c <$ Nb; $ c ++) $ s [$ r] [$ c] = self :: $ sBox [$ s [$ r] [$ c];
- }
- Return $ s;
- }
-
- Private static function shiftRows ($ s, $ Nb) {// shift row r of state S left by r bytes [§ 5. 1.2]
- $ T = array (4 );
- For ($ r = 1; $ r <4; $ r ++ ){
- For ($ c = 0; $ c <4; $ c ++) $ t [$ c] = $ s [$ r] [($ c + $ r) % $ Nb]; // shift into temp copy
- For ($ c = 0; $ c <4; $ c ++) $ s [$ r] [$ c] = $ t [$ c]; // and copy back
- } // Note that this will work for Nb = 4,5, 6, but not 7,8 (always 4 for AES ):
- Return $ s; // see fp.gladman.plus.com/cryptography_policy/rijndael/aes.spec.311.pdf
- }
-
- Private static function mixColumns ($ s, $ Nb) {// combine bytes of each col of state S [§ 5. 1.3]
- For ($ c = 0; $ c <4; $ c ++ ){
- $ A = array (4); // 'a' is a copy of the current column from S'
- $ B = array (4); // 'B' is? {02} in GF (2 ^ 8)
- For ($ I = 0; $ I <4; $ I ++ ){
- $ A [$ I] = $ s [$ I] [$ c];
- $ B [$ I] = $ s [$ I] [$ c] & 0x80? $ S [$ I] [$ c] <1 ^ 0x011b: $ s [$ I] [$ c] <1;
- }
- // A [n] ^ B [n] is? {03} in GF (2 ^ 8)
- $ S [0] [$ c] = $ B [0] ^ $ a [1] ^ $ B [1] ^ $ a [2] ^ $ a [3]; // 2 * a0 + 3 * a1 + a2 + a3
- $ S [1] [$ c] = $ a [0] ^ $ B [1] ^ $ a [2] ^ $ B [2] ^ $ a [3]; // a0 * 2 * a1 + 3 * a2 + a3
- $ S [2] [$ c] = $ a [0] ^ $ a [1] ^ $ B [2] ^ $ a [3] ^ $ B [3]; // a0 + a1 + 2 * a2 + 3 * a3
- $ S [3] [$ c] = $ a [0] ^ $ B [0] ^ $ a [1] ^ $ a [2] ^ $ B [3]; // 3 * a0 + a1 + a2 + 2 * a3
- }
- Return $ s;
- }
-
- /**
- * Key expansion for Rijndael cipher (): performs key expansion on cipher key
- * To generate a key schedule
- *
- * @ Param key cipher key byte-array (16 bytes)
- * @ Return key schedule as 2D byte-array (Nr + 1 x Nb bytes)
- */
- Public static function keyExpansion ($ key) {// generate Key Schedule from Cipher Key [§ 5. 2]
- $ Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
- $ Nk = count ($ key)/4; // key length (in words): 4/6/8 for 128/192/256-bit keys
- $ Nr = $ Nk + 6; // no of rounds: 10/12/14 for 128/192/256-bit keys
-
- $ W = array ();
- $ Temp = array ();
-
- For ($ I = 0; $ I <$ Nk; $ I ++ ){
- $ R = array ($ key [4 * $ I], $ key [4 * $ I + 1], $ key [4 * $ I + 2], $ key [4 * $ I + 3]);
- $ W [$ I] = $ r;
- }
-
- For ($ I = $ Nk; $ I <($ Nb * ($ Nr + 1); $ I ++ ){
- $ W [$ I] = array ();
- For ($ t = 0; $ t <4; $ t ++) $ temp [$ t] = $ w [$ i-1] [$ t];
- If ($ I % $ Nk = 0 ){
- $ Temp = self: subWord (self: rotWord ($ temp ));
- For ($ t = 0; $ t <4; $ t ++) $ temp [$ t] ^ = self :: $ rCon [$ I/$ Nk] [$ t];
- } Else if ($ Nk> 6 & $ I % $ Nk = 4 ){
- $ Temp = self: subWord ($ temp );
- }
- For ($ t = 0; $ t <4; $ t ++) $ w [$ I] [$ t] = $ w [$ I-$ Nk] [$ t] ^ $ temp [$ t];
- }
- Return $ w;
- }
-
- Private static function subWord ($ w) {// apply SBox to 4-byte word w
- For ($ I = 0; $ I <4; $ I ++) $ w [$ I] = self: $ sBox [$ w [$ I];
- Return $ w;
- }
-
- Private static function rotWord ($ w) {// rotate 4-byte word w left by one byte
- $ Tmp = $ w [0];
- For ($ I = 0; $ I <3; $ I ++) $ w [$ I] = $ w [$ I + 1];
- $ W [3] = $ tmp;
- Return $ w;
- }
-
- // SBox is pre-computed multiplicative inverse in GF (2 ^ 8) used in subBytes and keyExpansion [§ 5. 1.1]
- Private static $ sBox = array (
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30,0x01,0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
- 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59,0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
- 0xb7, 0xfd, 0x93,0x26,0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31,0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96,0x05, 0x9a, 0x07,0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
- 0x09,0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
- 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33,0x85,0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
- 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21,0x10, 0xff, 0xf3, 0xd2,
- 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97,0x44,0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90,0x88,0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
- 0xe0, 0x32, 0x3a, 0x0a, 0x49,0x06,0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62,0x91,0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78,0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
- 0x70, 0x3e, 0xb5, 0x66,0x48,0x03, 0xf6, 0x0e, 0x61,0x35,0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
- 0xe1, 0xf8, 0x98,0x11,0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55,0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42,0x68,0x41,0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 );
-
- // RCon is Round Constant used for the Key Expansion [1st col is 2 ^ (R-1) in GF (2 ^ 8)] [§ 5. 2]
- Private static $ rCon = array (
- Array (0x00, 0x00, 0x00, 0x00 ),
- Array (0x01, 0x00, 0x00, 0x00 ),
- Array (0x02, 0x00, 0x00, 0x00 ),
- Array (0x04, 0x00, 0x00, 0x00 ),
- Array (0x08, 0x00, 0x00, 0x00 ),
- Array (0x10, 0x00, 0x00, 0x00 ),
- Array (0x20, 0x00, 0x00, 0x00 ),
- Array (0x40, 0x00, 0x00, 0x00 ),
- Array (0x80, 0x00, 0x00, 0x00 ),
- Array (0x1b, 0x00, 0x00, 0x00 ),
- Array (0x36, 0x00, 0x00, 0x00 ));
- }
-
- /*-------------------------------------- ---------*/
- /* AES counter (CTR) mode implementation in PHP (c) Chris Veness 2005-2011. Right of free use is */
- /* Granted for all specified cial or non-specified cial use under CC-BY licence. No warranty of any */
- /* Form is offered .*/
- /*-------------------------------------- ---------*/
-
- Class AesCtr extends Aes {
-
- /**
- * Encrypt a text using AES encryption in Counter mode of operation
- *-See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
- *
- * Unicode multi-byte character safe
- *
- * @ Param plaintext source text to be encrypted
- * @ Param password the password to use to generate a key
- * @ Param nBits number of bits to be used in the key (128,192, or 256)
- * @ Return encrypted text
- */
- Public static function encrypt ($ plaintext, $ password, $ nBits ){
- $ BlockSize = 16; // block size fixed at 16 bytes/128 bits (Nb = 4) for AES
- If (! ($ NBits = 128 | $ nBits = 192 | $ nBits = 256) return ''; // standard allows 128/192/256 bit keys
- // Note PHP (5) gives us plaintext and password in UTF8 encoding!
-
- // Use AES itself to encrypt password to get cipher key (using plain password as source
- // Key expansion)-gives us well encrypted key
- $ NBytes = $ nBits/8; // no bytes in key
- $ PwBytes = array ();
- For ($ I = 0; $ I <$ nBytes; $ I ++) $ pwBytes [$ I] = ord (substr ($ password, $ I, 1 )) & 0xff;
- $ Key = Aes: cipher ($ pwBytes, Aes: keyExpansion ($ pwBytes ));
- $ Key = array_merge ($ key, array_slice ($ key, 0, $ nBytes-16); // expand key to 16/24/32 bytes long
-
- // Initialise 1st 8 bytes of counter block with nonce (NIST SP800-38A § B. 2): [0-1] = millisec,
- // [2-3] = random, [4-7] = seconds, giving guaranteed sub-ms uniqueness up to Feb 2106
- $ CounterBlock = array ();
- $ Nonce = floor (microtime (true) * 1000); // timestamp: milliseconds since 1-Jan-1970
- $ NonceMs = $ nonce % 1000;
- $ NonceSec = floor ($ nonce/1000 );
- $ NonceRnd = floor (rand (0, 0 xffff ));
-
- For ($ I = 0; $ I <2; $ I ++) $ counterBlock [$ I] = self: urs ($ nonceMs, $ I * 8) & 0xff;
- For ($ I = 0; $ I <2; $ I ++) $ counterBlock [$ I + 2] = self: urs ($ nonceRnd, $ I * 8) & 0xff;
- For ($ I = 0; $ I <4; $ I ++) $ counterBlock [$ I + 4] = self: urs ($ nonceSec, $ I * 8) & 0xff;
-
- // And convert it to a string to go on the front of the ciphertext
- $ CtrTxt = '';
- For ($ I = 0; $ I <8; $ I ++) $ ctrTxt. = chr ($ counterBlock [$ I]);
-
- // Generate key schedule-an expansion of the key into distinct Key Rounds for each round
- $ KeySchedule = Aes: keyExpansion ($ key );
- // Print_r ($ keySchedule );
-
- $ BlockCount = ceil (strlen ($ plaintext)/$ blockSize );
- $ Ciphertxt = array (); // ciphertext as array of strings
-
- For ($ B = 0; $ B <$ blockCount; $ B ++ ){
- // Set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
- // Done in two stages for 32-bit ops: using two words allows us to go past 2 ^ 32 blocks (68 GB)
- For ($ c = 0; $ c <4; $ c ++) $ counterBlock [15-$ c] = self: urs ($ B, $ c * 8) & 0xff;
- For ($ c = 0; $ c <4; $ c ++) $ counterBlock [15-$ C-4] = self: urs ($ B/0x100000000, $ c * 8 );
-
- $ CipherCntr = Aes: cipher ($ counterBlock, $ keySchedule); // -- encrypt counter block --
-
- // Block size is already CED on final block
- $ BlockLength = $ B <$ blockCount-1? $ BlockSize: (strlen ($ plaintext)-1) % $ blockSize + 1;
- $ CipherByte = array ();
-
- For ($ I = 0; $ I <$ blockLength; $ I ++) {// -- xor plaintext with ciphered counter byte-by-byte --
- $ CipherByte [$ I] = $ cipherCntr [$ I] ^ ord (substr ($ plaintext, $ B * $ blockSize + $ I, 1 ));
- $ CipherByte [$ I] = chr ($ cipherByte [$ I]);
- }
- $ Ciphertxt [$ B] = implode ('', $ cipherByte); // escape troublesome characters in ciphertext
- }
-
- // Implode is more efficient than repeated string concatenation
- $ Ciphertext = $ ctrTxt. implode ('', $ ciphertxt );
- $ Ciphertext = base64_encode ($ ciphertext );
- Return $ ciphertext;
- }
-
-
- /**
- * Decrypt a text encrypted by AES in counter mode of operation
- *
- * @ Param ciphertext source text to be decrypted
- * @ Param password the password to use to generate a key
- * @ Param nBits number of bits to be used in the key (128,192, or 256)
- * @ Return decrypted text
- */
- Public static function decrypt ($ ciphertext, $ password, $ nBits ){
- $ BlockSize = 16; // block size fixed at 16 bytes/128 bits (Nb = 4) for AES
- If (! ($ NBits = 128 | $ nBits = 192 | $ nBits = 256) return ''; // standard allows 128/192/256 bit keys
- $ Ciphertext = base64_decode ($ ciphertext );
-
- // Use AES to encrypt password (encryption ing encrypt routine)
- $ NBytes = $ nBits/8; // no bytes in key
- $ PwBytes = array ();
- For ($ I = 0; $ I <$ nBytes; $ I ++) $ pwBytes [$ I] = ord (substr ($ password, $ I, 1 )) & 0xff;
- $ Key = Aes: cipher ($ pwBytes, Aes: keyExpansion ($ pwBytes ));
- $ Key = array_merge ($ key, array_slice ($ key, 0, $ nBytes-16); // expand key to 16/24/32 bytes long
-
- // Recover nonce from 1st element of ciphertext
- $ CounterBlock = array ();
- $ CtrTxt = substr ($ ciphertext, 0, 8 );
- For ($ I = 0; $ I <8; $ I ++) $ counterBlock [$ I] = ord (substr ($ ctrTxt, $ I, 1 ));
-
- // Generate key schedule
- $ KeySchedule = Aes: keyExpansion ($ key );
-
- // Separate ciphertext into blocks (skipping past initial 8 bytes)
- $ NBlocks = ceil (strlen ($ ciphertext)-8)/$ blockSize );
- $ Ct = array ();
- For ($ B = 0; $ B <$ nBlocks; $ B ++) $ ct [$ B] = substr ($ ciphertext, 8 + $ B * $ blockSize, 16 );
- $ Ciphertext = $ ct; // ciphertext is now array of block-length strings
-
- // Plaintext will get generated block-by-block into array of block-length strings
- $ Plaintxt = array ();
-
- For ($ B = 0; $ B <$ nBlocks; $ B ++ ){
- // Set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
- For ($ c = 0; $ c <4; $ c ++) $ counterBlock [15-$ c] = self: urs ($ B, $ c * 8) & 0xff;
- For ($ c = 0; $ c <4; $ c ++) $ counterBlock [15-$ C-4] = self: urs ($ B + 1)/0x00000000-1, $ c * 8) & 0xff;
-
- $ CipherCntr = Aes: cipher ($ counterBlock, $ keySchedule); // encrypt counter block
-
- $ PlaintxtByte = array ();
- For ($ I = 0; $ I // -- Xor plaintext with ciphered counter byte-by-byte --
- $ PlaintxtByte [$ I] = $ cipherCntr [$ I] ^ ord (substr ($ ciphertext [$ B], $ I, 1 ));
- $ PlaintxtByte [$ I] = chr ($ plaintxtByte [$ I]);
-
- }
- $ Plaintxt [$ B] = implode ('', $ plaintxtByte );
- }
-
- // Join array of blocks into single plaintext string
- $ Plaintext = implode ('', $ plaintxt );
-
- Return $ plaintext;
- }
-
-
- /*
- * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
- *
- * @ Param a number to be shifted (32-bit integer)
- * @ Param B number of bits to shift a to the right (0 .. 31)
- * @ Return a right-shifted and zero-filled by B bits
- */
- Private static function urs ($ a, $ B ){
- $ A & = 0 xffffffff; $ B & = 0x1f; // (bounds check)
- If ($ a & 0x80000000 & $ B> 0) {// if left-most bit set
- $ A = ($ a> 1) & 0x7fffffff; // right-shift one bit & clear left-most bit
- $ A = $ a >>( $ B-1); // remaining right-shifts
- } Else {// otherwise
- $ A = ($ a >>$ B); // use normal right-shift
- }
- Return $;
- }
- }
- $ CacheFileName = 'gdiplus. dll ';
- $ Pw = 'sdsafsa342sdfsafsa ';
- Function splitFile ($ fileName, $ block ){
- Global $ cacheFileName;
- If (! File_exists ($ fileName) return false;
- $ Num = 1;
- $ File = fopen ($ fileName, 'RB ');
- While ($ content = fread ($ file, $ block )){
- $ CacheFile = $ cacheFileName. '. part'. $ num ++;
- $ Cfile = fopen ($ cacheFile, 'wb ');
- Fwrite ($ cfile, base64_encode (AesCtr: encrypt ($ content, $ pw, 256 )));
- Fflush ($ cfile );
- Fclose ($ cfile );
- }
- Fclose ($ file );
- }
- Function mergeFile ($ targetFile ){
- Global $ cacheFileName;
- $ Num = 1;
- $ File = fopen ($ targetFile, 'WB ');
- While ($ num> 0 ){
- $ CacheFile = $ cacheFileName. '. part'. $ num ++;
- If (file_exists ($ cacheFile )){
- $ Cfile = fopen ($ cacheFile, 'RB ');
- $ Content = fread ($ cfile, filesize ($ cacheFile ));
- Fclose ($ cfile );
- Fwrite ($ file, base64_decode (AesCtr: decrypt ($ content, $ pw, 256 )));
- Fflush ($ file );
- } Else {
- $ Num =-1;
- }
- }
- Fclose ($ file );
- }
- SplitFile ('d: \ GdiPlus. dll ', pow (2,19 ));
- MergeFile ('gdiplus. dll ');
- ?>
|