Changeset 2028


Ignore:
Timestamp:
Oct 29, 2010, 12:15:00 PM (11 years ago)
Author:
Sven Rech
Message:

added encrypt functionality to NativeCryptography

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/NativeCryptography/NativeCryptography.cpp

    r1208 r2028  
    146146        }
    147147
     148        array<unsigned char>^ Crypto::encryptAESorDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode, const int blockSize, const cryptMethod method)
     149        {
     150                int numBlocks = length / blockSize;
     151                if (length % blockSize != 0)
     152                        numBlocks++;
     153
     154                bool noIV = false;
     155
     156                if (IV == nullptr)
     157                {
     158                        noIV = true;
     159                        if (blockSize == 8)
     160                                IV = zeroIV8;
     161                        else if (blockSize == 16)
     162                                IV = zeroIV16;
     163                        else
     164                                return nullptr;
     165                }
     166
     167                pin_ptr<unsigned char> input = &Input[0];
     168                pin_ptr<unsigned char> key = &Key[0];
     169                pin_ptr<unsigned char> iv = &IV[0];
     170
     171                array<unsigned char>^ output = gcnew array<unsigned char>(length);
     172                pin_ptr<unsigned char> outp = &output[0];
     173
     174                AES_KEY aeskey;
     175                DES_key_schedule deskey;
     176                if (mode == 2)  //CFB
     177                {                       
     178                        unsigned char block[16];        //16 is enough for AES and DES
     179                        unsigned char shiftregister[16];
     180                        //works only for little endian architectures:
     181                        if (blockSize == 8)
     182                        {
     183                                *((unsigned int*)shiftregister) = *((unsigned int*)&iv[1]);
     184                                *((unsigned int*)&shiftregister[4]) = (*((unsigned int*)&iv[4]) >> 8) | ((unsigned int)(input[0]) << 24);
     185                        }
     186                        else if (blockSize == 16)
     187                        {
     188                                *((unsigned int*)shiftregister) = *((unsigned int*)&iv[1]);
     189                                *((unsigned int*)&shiftregister[4]) = (*((unsigned int*)&iv[4]) >> 8) | ((unsigned int)iv[8] << 24);
     190                                *((unsigned int*)&shiftregister[8]) = (*((unsigned int*)&iv[8]) >> 8) | ((unsigned int)iv[12] << 24);
     191                                *((unsigned int*)&shiftregister[12]) = (*((unsigned int*)&iv[12]) >> 8) | ((unsigned int)input[0] << 24);
     192                        }
     193                        else
     194                                return nullptr;
     195                       
     196                        if (method == cryptMethod::methodAES)
     197                                AES_set_encrypt_key(key, bits, &aeskey);
     198                        else
     199                                DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
     200
     201                        encrypt(iv, block, method, &aeskey, &deskey);
     202                        unsigned char leftmost = block[0];
     203                        outp[0] = leftmost ^ input[0];
     204
     205                        for (int i = 1; i < length; i++)
     206                        {
     207                                encrypt(shiftregister, block, method, &aeskey, &deskey);
     208                                leftmost = block[0];
     209                                outp[i] = leftmost ^ input[i];
     210                               
     211                                //shift input[i] in register:
     212                                if (blockSize == 8)
     213                                {
     214                                        *((unsigned int*)shiftregister) = *((unsigned int*)&shiftregister[1]);
     215                                        *((unsigned int*)&shiftregister[4]) = (*((unsigned int*)&shiftregister[4]) >> 8) | ((unsigned int)input[i] << 24);
     216                                }
     217                                else if (blockSize == 16)
     218                                {
     219                                        *((unsigned int*)shiftregister) = *((unsigned int*)&shiftregister[1]);
     220                                        *((unsigned int*)&shiftregister[4]) = (*((unsigned int*)&shiftregister[4]) >> 8) | ((unsigned int)shiftregister[8] << 24);
     221                                        *((unsigned int*)&shiftregister[8]) = (*((unsigned int*)&shiftregister[8]) >> 8) | ((unsigned int)shiftregister[12] << 24);
     222                                        *((unsigned int*)&shiftregister[12]) = (*((unsigned int*)&shiftregister[12]) >> 8) | ((unsigned int)input[i] << 24);
     223                                }
     224                        }
     225                }
     226                else    //CBC or ECB
     227                {
     228                        if (method == cryptMethod::methodAES)
     229                                AES_set_encrypt_key(key, bits, &aeskey);
     230                        else
     231                                DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
     232
     233                        encrypt(input, outp, method, &aeskey, &deskey);                         
     234                        if (mode == 1 && !noIV)         //CBC
     235                                xorblock(outp, iv, method);     
     236                        for (int c = 1; c < numBlocks; c++)
     237                        {
     238                                encrypt(input+c*blockSize, outp+c*blockSize, method, &aeskey, &deskey);
     239                                if (mode == 1)          //CBC
     240                                        xorblock(outp+c*blockSize, input+(c-1)*blockSize, method);                             
     241                        }
     242                }
     243
     244                return output;
     245        }
     246
    148247        double *xlogx = 0;
    149248
  • trunk/CrypPlugins/NativeCryptography/NativeCryptography.h

    r1208 r2028  
    2222                static void xorblock(unsigned char* t1, unsigned char* t2, const cryptMethod method);
    2323                static array<unsigned char>^ decryptAESorDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode, const int blockSize, const cryptMethod method);
     24                static array<unsigned char>^ encryptAESorDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode, const int blockSize, const cryptMethod method);
    2425
    2526                static Mutex^ prepareMutex = gcnew Mutex();
     
    4041                        return decryptAESorDES(Input, Key, IV, 0, length, mode, blockSize, cryptMethod::methodDES);
    4142                }
     43
     44                static array<unsigned char>^ encryptAES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode)
     45                {
     46                        const int blockSize = 16;
     47                        return encryptAESorDES(Input, Key, IV, bits, length, mode, blockSize, cryptMethod::methodAES);
     48                }
     49
     50                static array<unsigned char>^ encryptDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int length, const int mode)
     51                {
     52                        const int blockSize = 8;
     53                        return encryptAESorDES(Input, Key, IV, 0, length, mode, blockSize, cryptMethod::methodDES);
     54                }
    4255        };
    4356}
Note: See TracChangeset for help on using the changeset viewer.