Changeset 1196


Ignore:
Timestamp:
Feb 26, 2010, 2:46:36 AM (12 years ago)
Author:
Sven Rech
Message:

some cleanups and fixes

Location:
trunk/NativeCryptography
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/NativeCryptography/NativeCryptography.cpp

    r1174 r1196  
    33#include "NativeCryptography.h"
    44
    5 // This is the main DLL file.
     5namespace NativeCryptography {
    66
    7 #include "NativeCryptography.h"
     7        /* Fast way to xor an AES block */
     8        void Crypto::xorBlockAES(int *t1, int *t2)
     9        {
     10                t1[0] ^= t2[0];
     11                t1[1] ^= t2[1];
     12                t1[2] ^= t2[2];
     13                t1[3] ^= t2[3];
     14        }
    815
     16        /* Fast way to xor an DES block */
     17        void Crypto::xorBlockDES(int *t1, int *t2)
     18        {
     19                t1[0] ^= t2[0];
     20                t1[1] ^= t2[1];
     21        }
     22
     23        void Crypto::encrypt(unsigned char* in, unsigned char* out, const cryptMethod method, AES_KEY* aeskey, DES_key_schedule* deskey)
     24        {
     25                if (method == cryptMethod::methodAES)
     26                        AES_encrypt(in, out, aeskey);
     27                else
     28                        DES_ecb_encrypt((const_DES_cblock*)in, (const_DES_cblock*)out, deskey, DES_ENCRYPT);
     29        }
     30
     31        void Crypto::decrypt(unsigned char* in, unsigned char* out, const cryptMethod method, AES_KEY* aeskey, DES_key_schedule* deskey)
     32        {
     33                if (method == cryptMethod::methodAES)
     34                        AES_decrypt(in, out, aeskey);
     35                else
     36                        DES_ecb_encrypt((const_DES_cblock*)in, (const_DES_cblock*)out, deskey, DES_DECRYPT);
     37        }
     38
     39
     40        void Crypto::xorblock(unsigned char* t1, unsigned char* t2, const cryptMethod method) {
     41                if (method == cryptMethod::methodAES)
     42                        xorBlockAES((int*)t1, (int*)t2);
     43                else
     44                        xorBlockDES((int*)t1, (int*)t2);
     45        }
     46
     47        array<unsigned char>^ Crypto::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)
     48        {
     49                int numBlocks = length / blockSize;
     50                if (length % blockSize != 0)
     51                        numBlocks++;
     52
     53                if (IV == nullptr)
     54                        IV = gcnew array<unsigned char>(blockSize);
     55
     56                pin_ptr<unsigned char> input = &Input[0];
     57                pin_ptr<unsigned char> key = &Key[0];
     58                pin_ptr<unsigned char> iv = &IV[0];
     59
     60                array<unsigned char>^ output = gcnew array<unsigned char>(length);
     61                pin_ptr<unsigned char> outp = &output[0];       
     62
     63                AES_KEY aeskey;
     64                DES_key_schedule deskey;
     65                if (mode == 2)  //CFB
     66                {
     67                        if (method == cryptMethod::methodAES)
     68                                AES_set_encrypt_key(key, bits, &aeskey);
     69                        else
     70                                DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
     71
     72                        encrypt(iv, outp, method, &aeskey, &deskey);
     73                        xorblock(outp, input, method);
     74
     75                        for (int c = 0; c < numBlocks-1; c++)
     76                        {
     77                                encrypt(input+c*blockSize, outp+(c+1)*blockSize, method, &aeskey, &deskey);                                     
     78                                xorblock(outp+(c+1)*blockSize, input+(c+1)*blockSize, method);
     79                        }
     80                }
     81                else    //CBC or ECB
     82                {
     83                        if (method == cryptMethod::methodAES)
     84                                AES_set_decrypt_key(key, bits, &aeskey);
     85                        else
     86                                DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
     87
     88                        decrypt(input, outp, method, &aeskey, &deskey);                         
     89                        if (mode == 1)          //CBC
     90                                xorblock(outp, iv, method);     
     91                        for (int c = 1; c < numBlocks; c++)
     92                        {
     93                                decrypt(input+c*blockSize, outp+c*blockSize, method, &aeskey, &deskey);
     94                                if (mode == 1)          //CBC
     95                                        xorblock(outp+c*blockSize, input+(c-1)*blockSize, method);                             
     96                        }
     97                }
     98
     99                return output;
     100        }
     101
     102}
  • trunk/NativeCryptography/NativeCryptography.h

    r1195 r1196  
    1111        {
    1212        private:
    13                 static void xorBlockAES(int *t1, int *t2)
    14                 {
    15                         t1[0] ^= t2[0];
    16                         t1[1] ^= t2[1];
    17                         t1[2] ^= t2[2];
    18                         t1[3] ^= t2[3];
    19                 }
    20 
    21                 static void xorBlockDES(int *t1, int *t2)
    22                 {
    23                         t1[0] ^= t2[0];
    24                         t1[1] ^= t2[1];
    25                 }
     13                enum class cryptMethod {methodAES, methodDES};
     14               
     15                static void xorBlockAES(int *t1, int *t2);
     16                static void xorBlockDES(int *t1, int *t2);
     17                static void encrypt(unsigned char* in, unsigned char* out, const cryptMethod method, AES_KEY* aeskey, DES_key_schedule* deskey);
     18                static void decrypt(unsigned char* in, unsigned char* out, const cryptMethod method, AES_KEY* aeskey, DES_key_schedule* deskey);
     19                static void xorblock(unsigned char* t1, unsigned char* t2, const cryptMethod method);
     20                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);
    2621
    2722        public:
     
    2924                {
    3025                        const int blockSize = 16;
    31                         int numBlocks = length / blockSize;
    32                         if (length % blockSize != 0)
    33                                 numBlocks++;
    34 
    35                         pin_ptr<unsigned char> input = &Input[0];
    36                         pin_ptr<unsigned char> key = &Key[0];
    37                         pin_ptr<unsigned char> iv = &IV[0];
    38 
    39                         array<unsigned char>^ output = gcnew array<unsigned char>(length);
    40                         pin_ptr<unsigned char> outp = &output[0];       
    41 
    42                         AES_KEY aeskey;                 
    43                         if (mode == 2)  //CFB
    44                         {
    45                                 AES_set_encrypt_key(key, bits, &aeskey);
    46 
    47                                 AES_encrypt(iv, outp, &aeskey);
    48                                 xorBlockAES((int*)(outp), (int*)(input));
    49 
    50                                 for (int c = 0; c < numBlocks-1; c++)
    51                                 {
    52                                         AES_encrypt((input+c*blockSize), outp+(c+1)*blockSize, &aeskey);                                       
    53                                         xorBlockAES((int*)(outp+(c+1)*blockSize), (int*)(input+(c+1)*blockSize));
    54                                 }
    55                         }
    56                         else
    57                         {
    58                                 AES_set_decrypt_key(key, bits, &aeskey);
    59                                 AES_decrypt(input, outp, &aeskey);
    60                                 if (mode == 1)          //CBC
    61                                         xorBlockAES((int*)(outp), (int*)iv);   
    62                                 for (int c = 1; c < numBlocks; c++)
    63                                 {
    64                                         AES_decrypt((input+c*blockSize), outp+c*blockSize, &aeskey);
    65                                         if (mode == 1)          //CBC
    66                                                 xorBlockAES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));                           
    67                                 }
    68                         }
    69 
    70                         return output;
     26                        return decryptAESorDES(Input, Key, IV, bits, length, mode, blockSize, cryptMethod::methodAES);
    7127                }
    7228
     
    7430                {
    7531                        const int blockSize = 8;
    76                         int numBlocks = length / blockSize;
    77                         if (length % blockSize != 0)
    78                                 numBlocks++;
    79 
    80                         pin_ptr<unsigned char> input = &Input[0];
    81                         pin_ptr<unsigned char> key = &Key[0];
    82                         pin_ptr<unsigned char> iv = &IV[0];
    83 
    84                         array<unsigned char>^ output = gcnew array<unsigned char>(length);
    85                         pin_ptr<unsigned char> outp = &output[0];                       
    86 
    87                         DES_key_schedule deskey;
    88                         DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
    89 
    90                         if (mode == 2)  //CFB
    91                         {                               
    92                                 DES_ecb_encrypt((const_DES_cblock*)iv, (const_DES_cblock*)outp, &deskey, DES_ENCRYPT);
    93                                 xorBlockAES((int*)(outp), (int*)(input));
    94 
    95                                 for (int c = 0; c < numBlocks-1; c++)
    96                                 {
    97                                         DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+(c+1)*blockSize), &deskey, DES_ENCRYPT);
    98                                         xorBlockDES((int*)(outp+(c+1)*blockSize), (int*)(input+(c+1)*blockSize));
    99                                 }
    100                         }
    101                         else
    102                         {
    103                                 DES_ecb_encrypt((const_DES_cblock*)input, (const_DES_cblock*)outp, &deskey, DES_DECRYPT);
    104                                 if (mode == 1)          //CBC
    105                                         xorBlockDES((int*)(outp), (int*)iv);   
    106                                 for (int c = 1; c < numBlocks; c++)
    107                                 {
    108                                         DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+c*blockSize), &deskey, DES_DECRYPT);
    109                                         if (mode == 1)          //CBC
    110                                                 xorBlockDES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));
    111                                 }
    112                         }
    113 
    114                         return output;
     32                        return decryptAESorDES(Input, Key, IV, 0, length, mode, blockSize, cryptMethod::methodDES);
    11533                }
    11634        };
Note: See TracChangeset for help on using the changeset viewer.