source: trunk/NativeCryptography/NativeCryptography.h @ 1191

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

faster bruteforce implementation for des

File size: 2.8 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 xorBlock(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        public:
39                static array<unsigned char>^ decryptAES(array<unsigned char>^ input, array<unsigned char>^ key, const int bits, const int length)
40                {
41                        const int blockSize = 16;
42                        int numBlocks = length / blockSize;
43                        if (length % blockSize != 0)
44                                numBlocks++;
45
46                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
47                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
48                        unsigned char* ckey = (unsigned char*)malloc(bits/8);
49
50                        arrayToCArray(input, inp, numBlocks*blockSize);                 
51                        arrayToCArray(key, ckey, bits/8);                       
52
53                        AES_KEY aeskey;
54                        AES_set_decrypt_key(ckey, bits, &aeskey);
55                        AES_decrypt(inp, outp, &aeskey);
56                        for (int c = 1; c < numBlocks; c++)
57                        {
58                                AES_decrypt((inp+c*blockSize), outp+c*blockSize, &aeskey);
59                                xorBlock((int*)(outp+c*blockSize), (int*)(inp+(c-1)*blockSize));
60                        }
61
62                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
63                        carrayToArray(output, outp, length);
64                        free(inp);
65                        free(outp);
66                        free(ckey);
67                        return output;
68                }
69
70                static array<unsigned char>^ decryptDES(array<unsigned char>^ input, array<unsigned char>^ key, const int length)
71                {
72                        const int blockSize = 8;
73                        int numBlocks = length / blockSize;
74                        if (length % blockSize != 0)
75                                numBlocks++;
76
77                        unsigned char* inp = (unsigned char*)malloc(numBlocks*blockSize);
78                        unsigned char* outp = (unsigned char*)malloc(numBlocks*blockSize);
79                        unsigned char ckey[8];
80
81                        arrayToCArray(input, inp, numBlocks*blockSize);                 
82                        arrayToCArray(key, ckey, 8);                   
83
84                        DES_key_schedule deskey;
85                        DES_set_key_unchecked(&ckey, &deskey);
86                        DES_ecb_encrypt((const_DES_cblock*)inp, (const_DES_cblock*)outp, &deskey, DES_DECRYPT);
87                        for (int c = 1; c < numBlocks; c++)
88                        {
89                                DES_ecb_encrypt((const_DES_cblock*)(inp+c*blockSize), (const_DES_cblock*)(outp+c*blockSize), &deskey, DES_DECRYPT);                                                     
90                        }
91
92                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
93                        carrayToArray(output, outp, length);
94                        free(inp);
95                        free(outp);                     
96                        return output;
97                }
98        };
99}
Note: See TracBrowser for help on using the repository browser.