source: trunk/NativeCryptography/NativeCryptography.h @ 1174

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

better AES implementation for bruteforcing

File size: 1.7 KB
Line 
1#pragma once
2#include "aes_core.h"
3#include <stdlib.h>
4
5using namespace System;
6
7namespace NativeCryptography {
8
9        public ref class Crypto
10        {
11        private:
12                static void arrayToCArray(array<unsigned char>^ a, unsigned char *ca, int length)
13                {
14                        int counter;                   
15                        for (counter = 0; counter < Math::Min(a->Length, length); counter++)
16                                ca[counter] = a[counter];
17                        for (; counter < length; counter++)
18                                ca[counter] = 0;
19                }
20
21                static void carrayToArray(array<unsigned char>^ a, unsigned char *ca, int length)
22                {
23                        int counter;
24                        for (counter = 0; counter < length; counter++)
25                                a[counter] = ca[counter];
26                }
27
28                static void xorBlock(int *t1, int *t2)
29                {
30                        t1[0] ^= t2[0];
31                        t1[1] ^= t2[1];
32                        t1[2] ^= t2[2];
33                        t1[3] ^= t2[3];
34                }
35
36        public:
37                static array<unsigned char>^ decryptAES(array<unsigned char>^ input, array<unsigned char>^ key, const int bits, const int length)
38                {
39                        const int blockSize = 16;
40                        int numBlocks = length / blockSize;
41                        if (length % blockSize != 0)
42                                numBlocks++;
43
44                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
45                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
46                        unsigned char* ckey = (unsigned char*)malloc(bits/8);
47
48                        arrayToCArray(input, inp, numBlocks*blockSize);                 
49                        arrayToCArray(key, ckey, bits/8);                       
50
51                        AES_KEY aeskey;
52                        AES_set_decrypt_key(ckey, bits, &aeskey);
53                        AES_decrypt(inp, outp, &aeskey);
54                        for (int c = 1; c < numBlocks; c++)
55                        {
56                                AES_decrypt((inp+c*blockSize), outp+c*blockSize, &aeskey);
57                                xorBlock((int*)(outp+c*blockSize), (int*)(inp+(c-1)*blockSize));
58                        }
59
60                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
61                        carrayToArray(output, outp, length);
62                        return output;
63                }
64        };
65}
Note: See TracBrowser for help on using the repository browser.