source: trunk/NativeCryptography/NativeCryptography.h @ 1175

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

fixed aes

File size: 1.8 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                        int l = (a->Length < length) ? a->Length : length;
16                        for (counter = 0; counter < l; counter++)
17                                ca[counter] = a[counter];
18                        for (; counter < length; counter++)
19                                ca[counter] = 0;
20                }
21
22                static void carrayToArray(array<unsigned char>^ a, unsigned char *ca, int length)
23                {
24                        int counter;
25                        for (counter = 0; counter < length; counter++)
26                                a[counter] = ca[counter];
27                }
28
29                static void xorBlock(int *t1, int *t2)
30                {
31                        t1[0] ^= t2[0];
32                        t1[1] ^= t2[1];
33                        t1[2] ^= t2[2];
34                        t1[3] ^= t2[3];
35                }
36
37        public:
38                static array<unsigned char>^ decryptAES(array<unsigned char>^ input, array<unsigned char>^ key, const int bits, const int length)
39                {
40                        const int blockSize = 16;
41                        int numBlocks = length / blockSize;
42                        if (length % blockSize != 0)
43                                numBlocks++;
44
45                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
46                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
47                        unsigned char* ckey = (unsigned char*)malloc(bits/8);
48
49                        arrayToCArray(input, inp, numBlocks*blockSize);                 
50                        arrayToCArray(key, ckey, bits/8);                       
51
52                        AES_KEY aeskey;
53                        AES_set_decrypt_key(ckey, bits, &aeskey);
54                        AES_decrypt(inp, outp, &aeskey);
55                        for (int c = 1; c < numBlocks; c++)
56                        {
57                                AES_decrypt((inp+c*blockSize), outp+c*blockSize, &aeskey);
58                                xorBlock((int*)(outp+c*blockSize), (int*)(inp+(c-1)*blockSize));
59                        }
60
61                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
62                        carrayToArray(output, outp, length);
63                        free(inp);
64                        free(outp);
65                        free(ckey);
66                        return output;
67                }
68        };
69}
Note: See TracBrowser for help on using the repository browser.