source: trunk/NativeCryptography/NativeCryptography.h @ 1193

Last change on this file since 1193 was 1193, checked in by Sven Rech, 12 years ago

more speed for bruteforcing by using unsafe code in AES and DES (just temporary)

File size: 3.2 KB
Line 
1#pragma once
2#include "aes_core.h"
3#include "DES/des.h"
4#include <stdlib.h>
5
6using namespace System;
7
8namespace NativeCryptography {
9
10        public ref class Crypto
11        {
12        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                }
26
27        public:
28                static array<unsigned char>^ decryptAES(unsigned char* input, unsigned char* key, const int bits, const int length, const int mode)
29                {
30                        const int blockSize = 16;
31                        int numBlocks = length / blockSize;
32                        if (length % blockSize != 0)
33                                numBlocks++;
34
35                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
36
37                        AES_KEY aeskey;                 
38                        if (mode == 2)  //CFB
39                        {
40                                AES_set_encrypt_key(key, bits, &aeskey);
41                                unsigned char iv[blockSize];
42                                for (int i = 0; i < blockSize; i++)
43                                {
44                                        iv[i] = 0;
45                                }
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                                for (int c = 1; c < numBlocks; c++)
61                                {
62                                        AES_decrypt((input+c*blockSize), outp+c*blockSize, &aeskey);
63                                        if (mode == 1)          //CBC
64                                                xorBlockAES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));                           
65                                }
66                        }
67
68                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
69                        for (int c = 0; c < length; c++)
70                                output[c] = outp[c];
71
72                        return output;
73                }
74
75                static array<unsigned char>^ decryptDES(unsigned char* input, unsigned char* key, const int length, const int mode)
76                {
77                        const int blockSize = 8;
78                        int numBlocks = length / blockSize;
79                        if (length % blockSize != 0)
80                                numBlocks++;
81
82                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
83
84                        DES_key_schedule deskey;
85                        DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
86
87                        if (mode == 2)  //CFB
88                        {                               
89                                unsigned char iv[blockSize];
90                                for (int i = 0; i < blockSize; i++)
91                                {
92                                        iv[i] = 0;
93                                }
94
95                                DES_ecb_encrypt((const_DES_cblock*)iv, (const_DES_cblock*)outp, &deskey, DES_ENCRYPT);
96                                xorBlockAES((int*)(outp), (int*)(input));
97
98                                for (int c = 0; c < numBlocks-1; c++)
99                                {
100                                        DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+(c+1)*blockSize), &deskey, DES_ENCRYPT);
101                                        xorBlockDES((int*)(outp+(c+1)*blockSize), (int*)(input+(c+1)*blockSize));
102                                }
103                        }
104                        else
105                        {
106                                DES_ecb_encrypt((const_DES_cblock*)input, (const_DES_cblock*)outp, &deskey, DES_DECRYPT);
107                                for (int c = 1; c < numBlocks; c++)
108                                {
109                                        DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+c*blockSize), &deskey, DES_DECRYPT);
110                                        if (mode == 1)          //CBC
111                                                xorBlockDES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));
112                                }
113                        }
114
115                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
116                        for (int c = 0; c < length; c++)
117                                output[c] = outp[c];
118
119                        return output;
120                }
121        };
122}
Note: See TracBrowser for help on using the repository browser.