AES算法出问题,跪求大神们帮助啊
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有关系吗?
...全文
相关推荐
AES加解密算法以及五种工作模式的实现
提供的资源包含详细文档和源代码,可以帮助读者深入理解AES加解密算法以及各种工作模式的实现细节。这不仅有助于学习加密理论,也对实际应用开发有指导价值。
Gmssl库的aes算法效率问题
但它并不是 OpenSSL 的完整克隆,而是有以下几个特点,正是这些导致了它。
AES算法详细介绍
AES(Advanced Encryption Standard),即高级加密标准,是目前应用最为广泛的对称加密算法之一。它被设计用于保护敏感信息的保密性和完整性,在众多领域如网络安全、金融交易、数据存储等方面发挥着重要作用。
PHP aes (ecb)解密后乱码问题
这可以帮助遇到相同问题的开发者快速定位并解决问题。具体解决方法如下:1.
AES RSA加密
**学习资源与Demo:**压缩包中的文档和Demo提供了AES与RSA加密的实践案例,可以帮助新手深入理解这两种加密算法的使用方法和实现细节。通过阅读文档,你可以了解到如何在实际编程中应用这些算法。


