在测试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;
}


相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

AES算法256位密钥

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

AES256JNCryptor加密后的密文长度

从文档看(http://jncryptor.googlecode.com/svn/trunk/javadoc/index.html),加密后的密文不但包括AES密文,还包括了前后一共66个字节的附加信...

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

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

AES加密算法之轮密钥加操作

以AES算法明文128bit、密钥128bit为例: 轮密钥加操作就是将轮密钥与明文(状态)按比特异或。轮密钥通过密钥扩展得到,初始密钥与初始明文均是用户自己设置。简单来说,密钥加操作就是逐字节相加...

javaAES加密解密32位密钥

import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec....

问题:AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES...
  • newizan
  • newizan
  • 2015年05月03日 21:10
  • 39322

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

import javax.crypto.*; import javax.crypto.spec.*; public class MyAES { public static void main...
  • Nil88
  • Nil88
  • 2012年12月10日 10:05
  • 1879

Java加密算法 AES

package com.stone.security; import java.util.Arrays; import javax.crypto.Cipher; import javax.cryp...

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

AES简介高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在测试aes加密的时候,出现一个关于密钥的长度问题
举报原因:
原因补充:

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