summaryrefslogtreecommitdiff
path: root/CryptClass/AESCrypt.cpp
blob: 0add26034efbe8294d71875052e23d5746f20f5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
 * @file AESCrypt.cpp
 * @brief AESCrypt class definitions
 * @author manzerbredes
 * @date 8 Mars 2015
 *
 * Contain all definitions of AESCrypt class.
 *
 */

//----- class -----
#include "AESCrypt.hpp"




//Constructor
AESCrypt::AESCrypt(){
    this->hash=HASHCrypt(); //Init hash attribute
}

//Destructor
AESCrypt::~AESCrypt(){
}




//Encrypt string
std::string AESCrypt::encrypt(std::string key, std::string data){

    //Generate SHA-256
    byte digest[32];
    hash.getSHA_256(key, digest, (int)sizeof(digest));

    return encryptRoutine(data, digest, sizeof(digest));

}
//Encrypt string
std::string AESCrypt::encrypt(byte* key, std::string data){

    return encryptRoutine(data, key, 32);

}


std::string AESCrypt::encryptRoutine(std::string data, byte* digest, int size){
    //Contain data encrypted
    std::string cipher;


    //Use try, catch to be ensure no problems happening
    try{
        //Create encoder to encrypt data
        CryptoPP::ECB_Mode<CryptoPP::AES>::Encryption encoder;
        encoder.SetKey( digest, size );

        //Encrypt data with StreamTransformationFilter with NO PADDING
        CryptoPP::StringSource ss1(data, true,
            new CryptoPP::StreamTransformationFilter( encoder,
                new CryptoPP::StringSink( cipher ),
                    CryptoPP::StreamTransformationFilter::ZEROS_PADDING

            )
        );
    }
    catch( CryptoPP::Exception& e )
    {
        std::cerr << e.what() << std::endl;
        exit(EXIT_FAILURE);
    }

    //return encrypted data
    return cipher;


}












//Decrypt string
std::string AESCrypt::decrypt(std::string key, std::string data){


    byte digest[32];
    hash.getSHA_256(key, digest, (int)sizeof(digest));


    //Contain data decrypted
    std::string cipher;

    //Use try, catch to be ensure no problems happening
    try {

        //Create decoder to encrypt data
        CryptoPP::ECB_Mode< CryptoPP::AES >::Decryption decoder;
        decoder.SetKey( digest, sizeof(digest) );

        //Decrypt data with StreamTransformationFilter with NO PADDING
        CryptoPP::StringSource ss3( data, true,
                new CryptoPP::StreamTransformationFilter( decoder,
                    new CryptoPP::StringSink( cipher ),
                    CryptoPP::StreamTransformationFilter::NO_PADDING
                )
        );
    }
    catch( CryptoPP::Exception& e )
    {
        std::cerr << e.what() << std::endl;
        exit(1);
    }


    int i=0;
    for(i=0;i<cipher.length();i++){
        if(cipher[i]=='\0')
            break;
    }
    cipher.erase(i,cipher.length()-1);
    //return decrypted data
    return cipher;
}