Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有随机密钥生成的双重AES加密_C++_Linux_Random_Openssl_Aes - Fatal编程技术网

C++ 具有随机密钥生成的双重AES加密

C++ 具有随机密钥生成的双重AES加密,c++,linux,random,openssl,aes,C++,Linux,Random,Openssl,Aes,我使用2个嵌入式GSM设备。需要在设备之间发送数据。假设我需要将字符串“ring”从一个设备发送到另一个设备。这是一个命令,需要发送多次。我要做的第一件事是在两个设备中保持aes_密钥相同。然后加密输入数据(即“boom”)并获取enc_缓冲区。通过套接字将此enc_缓冲区发送到其他设备。另一个设备具有相同的aes_密钥。使用它,我将接收到的缓冲区解密为dec_缓冲区。我的疑问是,每次我发送“boom”的加密文本时,加密消息enc_缓冲区是否会相同。如果是相同的,那么我需要遵循另一种方法。我有一

我使用2个嵌入式GSM设备。需要在设备之间发送数据。假设我需要将字符串“ring”从一个设备发送到另一个设备。这是一个命令,需要发送多次。我要做的第一件事是在两个设备中保持aes_密钥相同。然后加密输入数据(即“boom”)并获取enc_缓冲区。通过套接字将此enc_缓冲区发送到其他设备。另一个设备具有相同的aes_密钥。使用它,我将接收到的缓冲区解密为dec_缓冲区。我的疑问是,每次我发送“boom”的加密文本时,加密消息enc_缓冲区是否会相同。如果是相同的,那么我需要遵循另一种方法。我有一个1级aes_键,它是常量。然后我需要生成一个二级aes_密钥。加密第二级aes_密钥并通过套接字发送。在接收设备中,使用第一级aes_密钥对其进行解密,以获得第二级aes_密钥。保存它。在第一台设备中,再次使用第二级aes_密钥加密字符串“boom”,并通过套接字发送。在第二台设备中,使用第二级aes_密钥解密加密消息,以获取文本“boom”。但另一个问题是如何在第一个设备中生成第二级aes_密钥。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;
}
unsigned char aes_key[]=“asytfuhcilejnco”;
无符号字符输入_数据[]=“Sandeep”;
int data_size=strlen((char*)输入_数据);
int buffer_size=((int)(数据_size/AES_BLOCK_size)+1)*AES_BLOCK_size;
AES_键enc_键,dec_键;
无符号字符iv[AES_块大小];
int main()
{
无符号字符加密缓冲区[缓冲区大小+1];
无符号字符dec_缓冲区[缓冲区大小+1];
内存集(iv,0x00,AES_块大小);
AES_设置_加密_密钥(AES_密钥、sizeof(AES_密钥)*8和enc_密钥);
AES_cbc_加密(输入_数据、加密缓冲区、sizeof(输入_数据)和加密密钥、iv、AES_加密);
加密缓冲区[缓冲区大小+1]='\0';
内存集(iv,0x00,AES_块大小);
AES_设置_解密_密钥(AES_密钥、sizeof(AES_密钥)*8和dec_密钥);
AES_cbc_加密(enc_缓冲区、dec_缓冲区、sizeof(输入数据)和dec_密钥、iv、AES_解密);
dec_buffer[buffer_size+1]='\0';
库特
对于相同的输入数据和aes密钥,加密数据是否始终相同

否。对于相同的iv,&数据也是一样的

是否有任何随机密钥生成器API

是的,例如OpenSSL有一个

< Linux C++中随机数的系统调用是什么?< /P> 一个“好”的随机数生成器是/dev/urandom。可以说更好,如果可用,是/dev/hwrng,但是它不同,不一定更好。/dev/random与/dev/urandom类似,可能更好,但在没有足够的熵可用时会阻塞


在所有情况下,您读取这些设备就像从文件中读取数据一样。

enc\u buffer[buffer\u size+1]='\0'

不要这样做,这是缓冲区溢出。两个缓冲区上的最大索引为[buffer\u size]

memset(iv,0x00,AES_块大小);


不要这样做,使用相同的iv(初始化向量)可以保证您的密文也相同。对于加密,使用Claris提到的随机位初始化iv。对于解密,您可以忽略iv输出。

“然后加密输入数据(即“boom”)”您的数据听起来可疑它不是“boom”但有些东西是对的,“引爆”或者加密的目的是什么?涉及到三种设备吗?两个GSM嵌入式设备和Linux机器?或者嵌入式设备运行Linux?为什么要推出自己的解决方案,而不是使用像TLS这样众所周知的东西?对不起,不必怀疑我没有做类似的事情