2015-08-28 2 views
0

Мне нужно зашифровать мои данные, поэтому я шифрую их с помощью AES. И я могу зашифровать короткие данные. Но мне нужно зашифровать длинные данные, они не могут работать. Что я могу сделать, чтобы исправить эту проблему. Это мой код.Как шифровать данные с помощью AES (openssl)?

#include "cooloi_aes.h" 
CooloiAES::CooloiAES() 
    : MSG_LEN(0) 
{ 
    for(int i = 0; i < AES_BLOCK_SIZE; i++) 
    { 
    key[i] = 32 + i; 
    } 
} 

CooloiAES::~CooloiAES() 
{ 

} 

std::string CooloiAES::aes_encrypt(std::string msg) 
{ 
    int i = msg.size()/1024; 
    MSG_LEN = (i + 1) * 1024; 

char in[MSG_LEN]; 
char out[MSG_LEN]; 
memset((char*)in,0,MSG_LEN); 
memset((char*)out,0,MSG_LEN); 

strncpy((char*)in,msg.c_str(),msg.size()); 

unsigned char iv[AES_BLOCK_SIZE]; 
for(int j = 0; j < AES_BLOCK_SIZE; ++j) 
{ 
    iv[j] = 0; 
} 

AES_KEY aes; 
if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) 
{ 
    return NULL; 
} 
int len = msg.size(); 

AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_ENCRYPT); 

std::string encrypt_msg(&out[0],&out[MSG_LEN+16]); 
std::cout << std::endl; 
return encrypt_msg; 
} 

std::string CooloiAES::aes_decrypt(std::string msg) 
{ 
    MSG_LEN = msg.size(); 

    char in[MSG_LEN]; 
char out[MSG_LEN+16]; 
memset((char*)in,0,MSG_LEN); 
memset((char*)out,0,MSG_LEN+16); 

strncpy((char*)in,msg.c_str(),msg.size()); 

std::cout << std::endl; 

unsigned char iv[AES_BLOCK_SIZE]; 
for(int j = 0; j < AES_BLOCK_SIZE; ++j) 
{ 
    iv[j] = 0; 
} 

AES_KEY aes; 
if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) 
{ 
    return NULL; 
} 
int len = msg.size(); 
AES_cbc_encrypt((unsigned char*)in,(unsigned char*)out,len,&aes,iv,AES_DECRYPT); 
std::string decrypt_msg = out; 
return decrypt_msg; 
} 

Когда я шифрования данных, который имеет 96 байт, он будет failed.I получить эту ошибку "Terminate вызывается после метания экземпляра 'станд :: length_error' , что(): basic_string :: _ S_create ". Но я не думаю, что эта строка длиннее максимальной длины. И я не знаю, где это неправильно.

+0

Я шифрую данные из 96 байтов, а затем я их расшифровываю, я получаю грязный код, поэтому я сказал, что он не может работать. – Nicholas

+0

На самом деле, я не разбивал свои байты, я использую этот режим в первый раз, поэтому не знаю, что мне делать. – Nicholas

+0

Вам это поможет? http://stackoverflow.com/questions/5132939/how-to-do-aes-decryption-using-openssl?rq=1 – Madness

ответ

0

Вы не имеете ничего плохого в вашем шифрования/дешифрования для вопросов заполнения и использования strncpy и (символ *) конструктора при работе с бинарными исключением. Вы не должны шифровать последний блок данных, если он не соответствует всем 16 байтам. Таким образом, вы должны реализовать свой собственный отступы или не шифруют последний небольшой блок на всех, ваш код будет упрощено к этому:

string aes_encrypt/decrypt(string msg) 
{ 
     unsigned char out[msg.size()]; 
     memcpy((char*)out,msg.data(),msg.size()); 
     AES_cbc_encrypt((unsigned char *)msg.data(),out,msg.size()/16*16,&aes,iv,AES_ENCRYPT **or** AES_DECRYPT); 
     return string((char *)out, msg.size()); 
} 

Резюмируя:

  • не использовать strncpy() с двоичный
  • не использует string s = binary_char_massive; конструктора
  • не шифрует последнюю порцию данных, если она не подходит к размеру блока или колодок самого
  • Использование EVP_ * OpenSSL API, если есть ро изменение будущих алгоритмов
+0

Спасибо, но у меня все еще есть проблема, размер простых текстов имеет ограничение? – Nicholas

+0

Да, строка :: max_size() –

+0

Я шифрую строку, все «a» имеют 103 байта, но я шифрую и получаю только 87 байтов, поэтому я хочу знать, где было неправильно. – Nicholas

Смежные вопросы