AES算法出问题,跪求大神们帮助啊

wanglu343280746 2013-07-08 05:43:14
unsigned char* AES::Cipher(unsigned char* input)
{
unsigned char state[4][4];
int i,r,c;

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
state[r][c] = input[c*4+r];
}
}

AddRoundKey(state,w[0]);

for(i=1; i<=10; i++)
{
SubBytes(state);
ShiftRows(state);
if(i!=10)MixColumns(state);
AddRoundKey(state,w[i]);
}

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
input[c*4+r] = state[r][c];
}
}

return input;
}

unsigned char* AES::InvCipher(unsigned char* input)
{
unsigned char state[4][4];
int i,r,c;

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
state[r][c] = input[c*4+r];
}
}

AddRoundKey(state, w[10]);
for(i=9; i>=0; i--)
{
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(state, w[i]);
if(i)
{
InvMixColumns(state);
}
}

for(r=0; r<4; r++)
{
for(c=0; c<4 ;c++)
{
input[c*4+r] = state[r][c];
}
}

return input;
}

void* AES::Cipher(void* input, int length)
{
unsigned char* in = (unsigned char*) input;
int i;
if(!length)
{
while(*(in+length++));
in = (unsigned char*) input;
}
for(i=0; i<length; i+=16)
{
Cipher(in+i);
}
return input;
}

void* AES::InvCipher(void* input, int length)
{
unsigned char* in = (unsigned char*) input;
int i;
for(i=0; i<length; i+=16)
{
InvCipher(in+i);
}
return input;
}

这是我用到的加密解密函数,
m_pAes->Cipher(pBuffer, strlen(pBuffer));
m_pAes->InvCipher(pBuffer, strlen(pBuffer));
这个算法是我在网上找的,不太明白其中的原理。
问题来了,我现在pBuffer的长度为463,但是加密后长度为406;而且解密的时候最后一部分乱码没解出来。
当我把pBuffer的内容减少了一点,加密后的strlen(pBuffer)448,再减少一点为432,但是解密出来都正常。而且448和432都是16的倍数。这个问题怎么解决啊,现在我的Pbuffer内容不能改,求大家帮助啊;
和Key有关系吗?
...全文
105 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglu343280746 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 fetag 的回复:
AES是block cipher,每次处理128 bits的数据。如果要加密的数据不是128的整数倍,那就需要在后面加padding。这些padding非常重要,因为它们要实际参与加\解密过程的运算。所以你可以考虑在末尾填充空格。
好像我那个pBuffer长度超过464后就出问题,小于464都是可以的,你帮看看代码里面哪里设置住了是不是
独孤过儿 2013-07-08
  • 打赏
  • 举报
回复
AES是block cipher,每次处理128 bits的数据。如果要加密的数据不是128的整数倍,那就需要在后面加padding。这些padding非常重要,因为它们要实际参与加\解密过程的运算。所以你可以考虑在末尾填充空格。
qzf362269994 2013-07-08
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
把你的 buffer 填成 16 的倍数那么大呗.
www_adintr_com 2013-07-08
  • 打赏
  • 举报
回复
把你的 buffer 填成 16 的倍数那么大呗.

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧