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

原创 2013年12月02日 22:09:35

就在做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;
}


AES算法256位密钥

最近,负责公司的数据加密模块。采用的算法是AES的CBC模式,密钥长度为256位。想来,也没啥难的。Java的接口那么多,AES的算法接口也肯定有!想来没啥难的,但是却耗费了我两天时间才解决这个问题。...
  • gardonkoo
  • gardonkoo
  • 2015年03月12日 22:13
  • 4071

AES是分组密钥,算法输入128位数据,密钥长度也是128位

  • 2009年05月29日 14:07
  • 16KB
  • 下载

AES加密算法的详细介绍与实现

AES简介高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具...
  • qq_28205153
  • qq_28205153
  • 2017年02月19日 08:53
  • 25670

java AES 密钥长度限制问题解决方案

默认JDK中的加密库对密钥长度限制在128位以下,所以无法使用128位以上的密钥. 如果需要在AES中使用128位以上密钥加密时,必须下载扩展的加密库包。 贴个地址:http://blog.csdn....
  • nuccch
  • nuccch
  • 2013年11月24日 23:11
  • 3259

高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)

最近在重构之前写的HTTP代理,这个代理是由代理客户端和代理服务端组成的,二者之前使用SSL保证通信内容不会受到中间人(MITM)攻击。而新的实现打算移除SSL,因为SSL握手的开销过大,尤其是客户端...
  • charleslei
  • charleslei
  • 2015年09月24日 13:44
  • 31464

RSA加密传输AES的key和iv (补2016年11月)

项目包含敏感数据,传输过程要求加密,我们研究了两种算法:AES和RSA     传输过程,也就是指前台到后台     AES,对称加密;只有一把密钥,获得密钥,即可解开加密内容     RSA,非...
  • u012407484
  • u012407484
  • 2017年02月01日 17:37
  • 818

破解AES秘钥长度限制

破解AES秘钥长度限制 高级加密标准 AES:在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES。 密码说明 因为Rij...
  • z199172177
  • z199172177
  • 2018年01月02日 18:33
  • 52

AES 加密算法的 C 语言实现

      这个AES 的C 语言实现,是从linux 中port 而来,放在这里方便自己日后使用。 很容易把这个code 转为为C++ 的封装。      aes.ha#ifndef __AES_H...
  • free2o
  • free2o
  • 2008年05月25日 15:22
  • 21272

OPENSSL库的使用-AES篇

一、AES算法简介         密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个...
  • duanxingheng
  • duanxingheng
  • 2013年09月16日 14:15
  • 13768

AES加密解密代码,key是16位

import javax.crypto.*; import javax.crypto.spec.*; public class MyAES { public static void main...
  • Nil88
  • Nil88
  • 2012年12月10日 10:05
  • 2080
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在测试aes加密的时候,出现一个关于密钥的长度问题
举报原因:
原因补充:

(最多只允许输入30个字)