せっかく暗号化しても、いったん復号化してディスクに保存してしまうと、削除してもファイル復活ツールで戻せてしまいます。
ツールを使って実験してみると、なるほど別なファイルにクラスタを使われてさえいなければ、簡単に戻せてしまいます。
#そういえばMS-DOSの時代にUNDELETEなんてツールがありましたね
とある打合せでこの点をズバリ指摘されてしまったのですが、調べてみると色々な方法があるようです。
単に0データで埋めればデータは消せるんじゃないかと思っていましたが、どうやら以前にディスクがどのような状態だったか調べる事も出来るらしく、
安全を期すなら複数回データを上書きする必要があるようです。
1. ランダムなデータを上書き
2. 0データを上書き
3. ファイルの削除
これくらいで十分かな?と思い以下の実験用コードを書いて実験しました。
void FileErase(CString filename)
{
try
{
const int BUF_SIZE = 2048;
CFile writeFile(filename,
CFile::modeWrite |
CFile::typeBinary);
// ファイル長の取得
int file_len = writeFile.GetLength();
// NULL埋め用
unsigned char buf_null[BUF_SIZE];
memset(buf_null, 0, BUF_SIZE);
// RANDOM埋め用
unsigned char buf_rand[BUF_SIZE];
// 乱数初期化
srand((unsigned int)time(NULL));
int writeSize = 0;
while (writeSize < file_len)
{
// 乱数作成
for (int i = 0; i < BUF_SIZE; i++)
{
buf_rand[i] = (unsigned char)(rand() * 256 / (1.0 + RAND_MAX));
}
// 乱数書込
writeFile.Write(buf_rand, BUF_SIZE);
writeFile.Flush();
// さらにNULLで上書きするために巻き戻す
writeFile.Seek(-1 * BUF_SIZE, CFile::current);
// NULL書込
writeFile.Write(buf_null, BUF_SIZE);
writeFile.Flush();
writeSize += BUF_SIZE;
}
// ファイルを閉じます
writeFile.Close();
// ファイルを削除します
CFile::Remove(filename);
}
catch (...)
{
throw;
}
}
実験してみると、復元されたファイルは0埋めされていたので、どうやら成功だったようです。
一時ファイルを作成するプログラムもありますが、そこまで追いかけていくことは難しそうです。