在测试aes加密的时候,出现一个关于密钥的长度问题

就在做aes加解密的时候,密钥的长度还必须是32位长度的看看下面的代码:

int Test(char *in_data, char *out_data, char *aes_decrypt_key, int encrypt_chunk_size = 16)
{
	if (strlen((char *)aes_decrypt_key) == 0)
	{
		return 1;
	}

	unsigned char aes_keybuf[32];
	memset(aes_keybuf, 0, sizeof(aes_keybuf));
	strcpy((char *)aes_keybuf, aes_decrypt_key);
	AES_KEY aeskey;
	AES_set_decrypt_key(aes_keybuf, 256, &aeskey);

// 	unsigned char *aes_keybuf = new unsigned char[strlen(aes_decrypt_key)];
// 	memset(aes_keybuf, 0, strlen(aes_decrypt_key));
// 	strcpy((char *)aes_keybuf, aes_decrypt_key);
// 	AES_KEY aeskey;
// 	AES_set_decrypt_key(aes_keybuf, 256, &aeskey);

	AES_decrypt((unsigned char *)in_data, (unsigned char *)out_data, &aeskey);

	return 0;
}

在测试的时候,把注释那段打开,你会发现,这是解密不成功的,因为密钥这里才9位+'\0'。所以数据会不对。


即使你在加密部分也是使用非32的密钥,也会导致解密出现问题。所以这里应该是定死32位的一个数据长度,所以最终的字节加解密应该是这样的(当然我这里没做数组的越界处理,如果正式应用应该进行截断的):

// 对所输入的in_data字节大小进行aes加密,不做ou_data的长度检测,确保调用的时候长度合理
int AesEncryptBytes(const unsigned char* in_data, unsigned char* out_data, 
					const char* aes_encrypt_key, int in_data_chunk_size = 16)
{
	if (strlen((char *)aes_encrypt_key) == 0)
	{
		return 1;
	}

	unsigned char aes_keybuf[32];
	memset(aes_keybuf, 0, sizeof(aes_keybuf));
	strcpy((char *)aes_keybuf, aes_encrypt_key);
	AES_KEY aeskey;
	AES_set_encrypt_key(aes_keybuf, 256, &aeskey);

	AES_encrypt(in_data, out_data, &aeskey);

	return 0;
}


// 对所输入的in_data字节大小进行aes解密,不做ou_data的长度检测,确保调用的时候长度合理
int AesDecryptBytes(const unsigned char* in_data, unsigned char* out_data, 
					const char* aes_decrypt_key, int in_data_chunk_size = 16)
{
	if (strlen((char *)aes_decrypt_key) == 0)
	{
		return 1;
	}

	unsigned char aes_keybuf[32];
	memset(aes_keybuf, 0, sizeof(aes_keybuf));
	strcpy((char *)aes_keybuf, aes_decrypt_key);
	AES_KEY aeskey;
	AES_set_decrypt_key(aes_keybuf, 256, &aeskey);

	AES_decrypt(in_data, out_data, &aeskey);

	return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一般情况下,使用RSA来加密对称密钥AES的方式是: 1. 生成RSA公钥和私钥; 2. 使用RSA公钥来加密AES密钥k,得到密文c; 3. 将密文c和使用AES加密的数据一起发送给接收方; 4. 接收方使用RSA私钥来解密密文c,得到AES密钥k; 5. 使用AES密钥k来解密数据。 具体操作流程如下: 1. 生成RSA公钥和私钥 在使用RSA加密前,需要先生成RSA公钥和私钥。一般情况下,可以使用openssl命令来生成RSA公钥和私钥,具体命令如下: ``` openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pem ``` 其中,2048表示生成的RSA密钥长度,private_key.pem表示私钥文件名,public_key.pem表示公钥文件名。 2. 使用RSA公钥来加密AES密钥k 在使用RSA加密AES密钥k前,需要将AES密钥k转换成RSA可加密的格式。一般情况下,可以使用PKCS#1 v1.5标准来进行转换,具体操作如下: ``` openssl rsautl -encrypt -inkey public_key.pem -pubin -in aes_key.txt -out aes_key.enc ``` 其中,public_key.pem表示RSA公钥文件名,aes_key.txt表示AES密钥k所在的文件名,aes_key.enc表示加密后的AES密钥k所在的文件名。 3. 将密文和使用AES加密的数据一起发送给接收方 在将密文和使用AES加密的数据一起发送给接收方前,需要先将密文和使用AES加密的数据进行组合。一般情况下,可以使用tar命令来进行组合,具体命令如下: ``` tar -cvf data.tar aes_data.enc aes_key.enc ``` 其中,aes_data.enc表示使用AES加密后的数据所在的文件名,aes_key.enc表示使用RSA加密后的AES密钥k所在的文件名,data.tar表示组合后的文件名。 4. 接收方使用RSA私钥来解密密文c,得到AES密钥k 在接收方接收到数据后,需要先将密文和使用AES加密的数据进行拆分。一般情况下,可以使用tar命令来进行拆分,具体命令如下: ``` tar -xvf data.tar ``` 其中,data.tar表示组合后的文件名。 接着,使用RSA私钥来解密密文c,得到AES密钥k。具体操作如下: ``` openssl rsautl -decrypt -inkey private_key.pem -in aes_key.enc -out aes_key.txt ``` 其中,private_key.pem表示RSA私钥文件名,aes_key.enc表示加密后的AES密钥k所在的文件名,aes_key.txt表示解密后的AES密钥k所在的文件名。 5. 使用AES密钥k来解密数据 在得到AES密钥k后,就可以使用该密钥来解密数据了。具体操作流程与普通的使用AES解密数据一样,这里不再赘述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值