高度セキュア消去アルゴリズム(ASDA)
安全なデータ消去の次世代スタンダード。

ASDA は、最小限のリソースで高い効果と検証可能性を両立します。4 つのパスは効率と透明性を重視し、Read‑after‑Write 検証と消去ログが各工程を証跡化します。AES‑256と暗号学的に強度の高い乱数により、フォレンジック復元を長期的に困難にします。実装は既存プロセスにシームレスに統合できます。
ASDA は NIST SP 800‑88 Rev.1(Clear / Purge / Destroy)の要件を満たし、さらに上回ります。媒体(HDD/SSD/フラッシュ)に応じて、Block Eraseや Cryptographic Eraseなどの Purge メカニズムを追加するのが有効な場合があります。
4 つの消去パス(概要)
データ領域全体を 0xFFで上書きし、元の内容を判読不能にします。
バッファ内の元データを AES‑256で暗号化して書き戻し、フォレンジック復元に対する暗号学的バリアを形成します。*鍵は RAM に一時的にのみ存在し、その後安全に消去します。*
所定のビットパターン(例:
10010010 01001001 00100100
)を書き込み、続けて Read‑after‑Write 検証を実施。差異は再度上書きし、消去レポートに記録します。 最後に、最後に 暗号学的に強度の高い乱数で上書きします(CSPRNG/NIST SP 800‑90A 準拠)。
ソースコードに関するドキュメント:
DataShredderクラスのASDAErase関数は、ファイルからデータを安全に削除するために使用されます。このプロセスは順番に実行される4つのステップで構成されています。
最初のステップは、ファイル内のすべてのデータを特定のパターンで上書きすることです。これはmemset関数を使用して、メモリブロックを特定の値に設定することで行われます。
次のステップでは、ファイル内の元のデータを256ビットAES(Advanced Encryption Standard)で暗号化します。AESクラスのStartEncryptionメソッドを使用し、暗号化するデータをunsigned char配列として引数に渡します。
第3ステップでは、第2ステップで書き込まれたデータを検証します。これはファイルからデータを読み戻し、元のデータとmemcmp関数で比較することで行われます。もし読み取ったデータが元データと一致しなければ、ステータス値0xC0000719L(STATUS_CONTEXT_MISMATCH)が返されます。
最後のステップでは、DoRandomErase関数を使ってランダムパターンでファイル内のデータを上書きします。この関数は3つの引数(消去するデータサイズ、データを保持するバッファ、反復回数を表すバイト値)を取ります。
4つすべてのステップが正常に完了すると、ASDAErase関数はステータス値0を返します。いずれかのステップが失敗した場合は、適切なエラーコードが返されます。
ソースコード:
long DataShredder::ASDAErase(DWORD size, byte *buf, byte iteration) { long status=0; LARGE_INTEGER nCurrentFilePointer = {0}; this->m_pLowLevelIO->GetFilePointer(&nCurrentFilePointer); // working buffer byte *buf1 = (byte*)malloc(size); // read file content if(iteration == 0) { status=this->m_pLowLevelIO->Read(buf1, size, NULL); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } // wipe with 0xFF if(status == 0) { memset(buf, 0xFF, size); status=this->m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } // encrypt original file content if(status == 0) { ULONG K[8]; ULONG seed; seed=GetTickCount(); K[0]=LowLevel::IO::Random(&seed); K[1]=LowLevel::IO::Random(&seed); K[2]=LowLevel::IO::Random(&seed); K[3]=LowLevel::IO::Random(&seed); K[4]=LowLevel::IO::Random(&seed); K[5]=LowLevel::IO::Random(&seed); K[6]=LowLevel::IO::Random(&seed); K[7]=LowLevel::IO::Random(&seed); AES aes; aes.SetParameters(256); aes.StartEncryption((const unsigned char *)K); for(ULONG i=0; (i*4)m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } if(status == 0) { byte bData[] = { 0x92,//10010010, 0x49,//01001001, 0x24 //00100100 }; for(DWORD i = 0; i < size; i++) { buf[i] = bData[i%3]; } status=this->m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); // verify if(0==this->m_pLowLevelIO->Read(buf1, size, NULL)) { this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); if(memcmp(buf1, buf, size)) { status=0xC0000719L;//STATUS_CONTEXT_MISMATCH; } } else { status=0xC0000719L;//STATUS_CONTEXT_MISMATCH; } } if(status == 0) { status = this->DoRandomErase(size, buf, 0); } free(buf1); return status; }
ソースコードの説明:
このソースコードはASDAEraseという関数を定義しており、整数size、バイト配列へのポインタbuf、整数iterationの3つのパラメータを取ります。関数は整数値statusを返します。
関数はまずいくつかの変数を宣言および初期化します。その後、LowLevelIOクラスのGetFilePointer関数を使って現在のファイルポインタを取得します。作業用バッファbuf1を確保し、Read関数を使ってファイル内容をこのバッファに読み込みます。
次に、LowLevelIOオブジェクトのWrite関数を使って0xFFの値でファイルのデータを上書きします。その後、AES(Advanced Encryption Standard)アルゴリズムを使って元のファイル内容を暗号化します。ランダムキーを生成し、AES暗号化パラメータを設定し、StartEncryption関数で4バイト単位に分割して暗号化します。
暗号化されたデータをファイルに書き戻した後、0x92、0x49、0x24のパターンをこの順番で繰り返しファイルに上書きします。次に、Read関数とmemcmp関数を使用して、作業用バッファbuf1とパターンデータbufを比較し、データが正しく書き込まれたことを検証します。
これらの操作がすべて成功すると、関数はDoRandomErase関数を呼び出してランダムデータでファイルを上書きします。最後に、確保したbuf1のメモリを解放し、status値を返します。