如何使用AES(openssl)加密数据?
问题描述:
我需要加密我的数据,所以我使用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得到这个错误 “终止叫做抛出 '的std :: length_error' 的实例以后有什么():basic_string的:: _ S_create ”。但我不认为这个字符串比最大长度长,而且我也不会出错。
答
你有什么错在你的加密/解密除了填充问题以及处理二进制打交道时strncpy()函数和(的char *)构造函数的用法。如果数据不适合全部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是否有PO未来算法变化的可能性
答
AES通常通过将数据拆分为16字节块来加密数据。如果最后一个块不是16个字节长,则它被填充到16个字节。维基文章:
我加密了96个字节的数据,然后我解密它,我弄乱了代码,所以我说它不能工作。 – Nicholas
其实,我没有分割我的字节,我第一次使用这种模式,所以我不知道该怎么做。 – Nicholas
这对你有帮助吗? http://stackoverflow.com/questions/5132939/how-to-do-aes-decryption-using-openssl?rq=1 – Madness