source: trunk/NativeCryptography/NativeCryptography.h @ 1195

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

removed unsafe code

File size: 3.3 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(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, 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                        pin_ptr<unsigned char> input = &Input[0];
36                        pin_ptr<unsigned char> key = &Key[0];
37                        pin_ptr<unsigned char> iv = &IV[0];
38
39                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
40                        pin_ptr<unsigned char> outp = &output[0];       
41
42                        AES_KEY aeskey;                 
43                        if (mode == 2)  //CFB
44                        {
45                                AES_set_encrypt_key(key, bits, &aeskey);
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                                if (mode == 1)          //CBC
61                                        xorBlockAES((int*)(outp), (int*)iv);   
62                                for (int c = 1; c < numBlocks; c++)
63                                {
64                                        AES_decrypt((input+c*blockSize), outp+c*blockSize, &aeskey);
65                                        if (mode == 1)          //CBC
66                                                xorBlockAES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));                           
67                                }
68                        }
69
70                        return output;
71                }
72
73                static array<unsigned char>^ decryptDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int length, const int mode)
74                {
75                        const int blockSize = 8;
76                        int numBlocks = length / blockSize;
77                        if (length % blockSize != 0)
78                                numBlocks++;
79
80                        pin_ptr<unsigned char> input = &Input[0];
81                        pin_ptr<unsigned char> key = &Key[0];
82                        pin_ptr<unsigned char> iv = &IV[0];
83
84                        array<unsigned char>^ output = gcnew array<unsigned char>(length);
85                        pin_ptr<unsigned char> outp = &output[0];                       
86
87                        DES_key_schedule deskey;
88                        DES_set_key_unchecked((const_DES_cblock*)key, &deskey);
89
90                        if (mode == 2)  //CFB
91                        {                               
92                                DES_ecb_encrypt((const_DES_cblock*)iv, (const_DES_cblock*)outp, &deskey, DES_ENCRYPT);
93                                xorBlockAES((int*)(outp), (int*)(input));
94
95                                for (int c = 0; c < numBlocks-1; c++)
96                                {
97                                        DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+(c+1)*blockSize), &deskey, DES_ENCRYPT);
98                                        xorBlockDES((int*)(outp+(c+1)*blockSize), (int*)(input+(c+1)*blockSize));
99                                }
100                        }
101                        else
102                        {
103                                DES_ecb_encrypt((const_DES_cblock*)input, (const_DES_cblock*)outp, &deskey, DES_DECRYPT);
104                                if (mode == 1)          //CBC
105                                        xorBlockDES((int*)(outp), (int*)iv);   
106                                for (int c = 1; c < numBlocks; c++)
107                                {
108                                        DES_ecb_encrypt((const_DES_cblock*)(input+c*blockSize), (const_DES_cblock*)(outp+c*blockSize), &deskey, DES_DECRYPT);
109                                        if (mode == 1)          //CBC
110                                                xorBlockDES((int*)(outp+c*blockSize), (int*)(input+(c-1)*blockSize));
111                                }
112                        }
113
114                        return output;
115                }
116        };
117}
Note: See TracBrowser for help on using the repository browser.