我正在使用2个嵌入式GSM设备。需要在设备之间发送数据。假设我需要发送字符串" ring"从一个设备到另一个设备。这是一个命令,需要多次发送。我做的第一件事是在两个设备中保持aes_key相同。然后加密input_data(即" boom")并获取enc_buffer。将此enc_buffer通过套接字发送到其他设备。另一台设备具有相同的aes_key。使用它我解密收到的缓冲区到dec_buffer。我怀疑的是,每次我发送加密文本时,加密的消息enc_buffer都是相同的#boom;"。如果它是相同的,那么我需要采用另一种方法。我有一级aes_key,这是不变的。然后我需要生成第二级aes_key。加密第二级aes_key并通过套接字发送。在接收设备中,使用第一级aes_key解密它以获得第二级aes_key。存放它。在第一个设备中再次加密字符串" boom"使用第二级aes_key,通过套接字发送。在第二个设备中使用第二级aes_key解密加密的消息以获得文本" boom"。但另一个问题是如何在第一个设备中生成第二级aes_key。 Linux中是否存在一些随机密钥生成器API。或者我可以使用随机数生成器API。我需要一个10个字符长度的密钥。为此,我将随机数生成器调用10次以生成0-26之间的数字并将其转换为字符。然后聚集在一起以获得所需的密钥。我正在使用如下的AES代码示例。粘贴以供参考以上文字。
unsigned char aes_key[]= "asytfuhcilejnco";
unsigned char input_data[]= "Sandeep";
int data_size= strlen((char*)input_data);
int buffer_size = ((int)(data_size/AES_BLOCK_SIZE) + 1)*AES_BLOCK_SIZE;
AES_KEY enc_key,dec_key;
unsigned char iv[AES_BLOCK_SIZE];
int main()
{
unsigned char enc_buffer[buffer_size+1];
unsigned char dec_buffer[buffer_size+1];
memset(iv,0x00,AES_BLOCK_SIZE);
AES_set_encrypt_key(aes_key,sizeof(aes_key)*8,&enc_key);
AES_cbc_encrypt(input_data,enc_buffer,sizeof(input_data),&enc_key,iv,AES_ENCRYPT);
enc_buffer[buffer_size+1]='\0';
memset(iv,0x00,AES_BLOCK_SIZE);
AES_set_decrypt_key(aes_key,sizeof(aes_key)*8,&dec_key);
AES_cbc_encrypt(enc_buffer,dec_buffer,sizeof(input_data),&dec_key,iv,AES_DECRYPT);
dec_buffer[buffer_size+1]='\0';
cout<<"input_data="<<input_data<<endl;
cout<<"enc_buffer="<<enc_buffer<<endl;
cout<<"dec_buffer="<<dec_buffer<<endl;
}
所以,我有3个问题
答案 0 :(得分:1)
enc_buffer[buffer_size+1]='\0'
不要这样做,这是缓冲区溢出。缓冲区的最大索引是[buffer_size]。
memset(iv,0x00,AES_BLOCK_SIZE);
不要这样做,使用相同的iv(初始化向量)保证您的密文也是相同的。对于加密,请使用Claris提到的随机位初始化iv。对于解密,您可以忽略iv输出。