source: trunk/NativeCryptography/NativeCryptography.h @ 1192

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

aes and des bruteforce supports CBC and ECB now (CBF still missing)

File size: 3.0 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 arrayToCArray(array<unsigned char>^ a, unsigned char *ca, int length)
14                {
15                        int counter;
16                        int l = (a->Length < length) ? a->Length : length;
17                        for (counter = 0; counter < l; counter++)
18                                ca[counter] = a[counter];
19                        for (; counter < length; counter++)
20                                ca[counter] = 0;
21                }
22
23                static void carrayToArray(array<unsigned char>^ a, unsigned char *ca, int length)
24                {
25                        int counter;
26                        for (counter = 0; counter < length; counter++)
27                                a[counter] = ca[counter];
28                }
29
30                static void xorBlockAES(int *t1, int *t2)
31                {
32                        t1[0] ^= t2[0];
33                        t1[1] ^= t2[1];
34                        t1[2] ^= t2[2];
35                        t1[3] ^= t2[3];
36                }
37
38                static void xorBlockDES(int *t1, int *t2)
39                {
40                        t1[0] ^= t2[0];
41                        t1[1] ^= t2[1];
42                }
43
44        public:
45                static array<unsigned char>^ decryptAES(array<unsigned char>^ input, array<unsigned char>^ key, const int bits, const int length, const int mode)
46                {
47                        const int blockSize = 16;
48                        int numBlocks = length / blockSize;
49                        if (length % blockSize != 0)
50                                numBlocks++;
51
52                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
53                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
54                        unsigned char ckey[32];
55
56                        arrayToCArray(input, inp, numBlocks*blockSize);                 
57                        arrayToCArray(key, ckey, bits/8);
58
59                        AES_KEY aeskey;
60                        AES_set_decrypt_key(ckey, bits, &aeskey);
61                        AES_decrypt(inp, outp, &aeskey);
62                        for (int c = 1; c < numBlocks; c++)
63                        {
64                                AES_decrypt((inp+c*blockSize), outp+c*blockSize, &aeskey);
65                                if (mode == 1)          //CBC
66                                        xorBlockAES((int*)(outp+c*blockSize), (int*)(inp+(c-1)*blockSize));
67                        }
68
69                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
70                        carrayToArray(output, outp, length);
71                        free(inp);
72                        free(outp);                     
73                        return output;
74                }
75
76                static array<unsigned char>^ decryptDES(array<unsigned char>^ input, array<unsigned char>^ key, const int length, const int mode)
77                {
78                        const int blockSize = 8;
79                        int numBlocks = length / blockSize;
80                        if (length % blockSize != 0)
81                                numBlocks++;
82
83                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
84                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
85                        unsigned char ckey[8];
86
87                        arrayToCArray(input, inp, numBlocks*blockSize);                 
88                        arrayToCArray(key, ckey, 8);                   
89
90                        DES_key_schedule deskey;
91                        DES_set_key_unchecked(&ckey, &deskey);
92                        DES_ecb_encrypt((const_DES_cblock*)inp, (const_DES_cblock*)outp, &deskey, DES_DECRYPT);
93                        for (int c = 1; c < numBlocks; c++)
94                        {
95                                DES_ecb_encrypt((const_DES_cblock*)(inp+c*blockSize), (const_DES_cblock*)(outp+c*blockSize), &deskey, DES_DECRYPT);
96                                if (mode == 1)          //CBC
97                                        xorBlockDES((int*)(outp+c*blockSize), (int*)(inp+(c-1)*blockSize));
98                        }
99
100                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
101                        carrayToArray(output, outp, length);
102                        free(inp);
103                        free(outp);                     
104                        return output;
105                }
106        };
107}
Note: See TracBrowser for help on using the repository browser.