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 に答える