2012-07-28 108 views
0

好吧,我下载从这里的Rijndael来源:http://www.codeproject.com/Articles/1380/A-C-Implementation-of-the-Rijndael-Encryption-Decr块长度 - Rijndael算法

我有以下代码:

int AutoUpdater::GetVersion() 
{ 
std::ifstream file("ver.dat", std::ios::out); 
if(file.fail()) 
    return 0; 
file.seekg(0,std::ios::end); 
int len = (int)file.tellg(); 
file.seekg(0,std::ios::beg); 

char* line = new char[len]; 

file.read(line,len); 
file.close(); 

CRijndael crypt; 
crypt.MakeKey("MIUJkHyHnjHyGtqO", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16, 16); 

char * decrypted = new char[len]; 
crypt.Decrypt(line,decrypted,len); 


delete[] line; 
delete [] decrypted; 

return atoi(line); 
} 

但它给这个错误:“数据不可多块大小”

我的文件加密必须有一个固定的长度?

回答

1

填充尾部零填充块的大小。您还可以考虑在字节长度前加上字母,以恢复原始的精确长度。

0

是的。 Rijndael是分组密码。您应该使用前面的长度字段对数据进行编码。解码器可以安全地忽略超出长度字段的位。

1

Rijndael是分组密码。你的输入不需要固定长度,但它需要是块大小的倍数(Rijndael为16字节)。有很多padding methods你可以用来确保。我喜欢PKCS7,很好,很简单。

我很困惑的是为什么你的输入文件不是块大小的倍数。使用给你这样的文件的Rijndael你无法正确加密数据。