0

好吧,我从这里下载了 Rijndael 资源:http: //www.codeproject.com/Articles/1380/AC-Implementation-of-the-Rijndael-Encryption-Decr

我有以下代码:

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);
}

但它给出了这个错误:“数据不是块大小的倍数”

我要加密的文件必须具有固定长度?

4

3 回答 3

1

用尾随零填充它以填充块大小。您还可以考虑为字节长度添加前缀,以恢复原始的确切长度。

于 2012-07-28T04:51:26.280 回答
1

Rijndael 是一种分组密码。您的输入不需要固定长度,但它确实需要是块大小的倍数(Rijndael 为 16 个字节)。您可以使用许多填充方法来确保这一点。我喜欢PKCS7,又好又简单。

我感到困惑的是为什么您的输入文件不是块大小的倍数。您无法使用为您提供此类文件的 Rijndael 正确加密数据。

于 2012-07-28T04:55:36.917 回答
0

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

于 2012-07-28T04:53:07.330 回答