Advanced Secure Deletion Algorithm (ASDA)
Die nächste Generation sicherer Datenlöschung.

ASDA ermöglicht eine hochwirksame, prüfbare Datenlöschung bei minimalem Ressourcenverbrauch. Die vier Pässe sind auf Effizienz und Transparenz ausgelegt: Read‑after‑Write‑Verifikation und Löschprotokolle belegen jeden Schritt. AES‑256 und kryptografisch starke Zufallszahlen erschweren die forensische Rekonstruktion nachhaltig. Die Implementierung lässt sich nahtlos in bestehende Prozesse integrieren.
ASDA übertrifft auch die Anforderungen aus NIST SP 800‑88 Rev. 1 ab (Clear / Purge / Destroy). Je nach Medium (HDD/SSD/Flash) können zusätzliche Purge‑Mechanismen sinnvoll sein – etwa Block Erase oder Cryptographic Erase.
Die vier Löschrunden im Überblick
Der Datenbereich wird vollständig mit 0xFF überschrieben – ursprüngliche Inhalte werden unkenntlich.
Der im Puffer befindliche Originalinhalt wird mit AES‑256 verschlüsselt und zurückgeschrieben – als kryptografische Barriere gegen forensische Rekonstruktion. (Schlüssel nur temporär im RAM; anschließend sicher gelöscht.)
Ein definiertes Bitmuster (z. B.
10010010 01001001 00100100
) wird geschrieben; anschließend erfolgt eine Read‑after‑Write‑Prüfung. Abweichungen werden erneut überschrieben und im Löschbericht dokumentiert. Zum Abschluss überschreibt ASDA den Bereich mit kryptografisch starken Zufallszahlen (CSPRNG gemäß NIST SP 800‑90A).
Dokumentation zum Quellcode:
Die Funktion ASDAErase in der Klasse DataShredder wird verwendet, um Daten sicher aus einer Datei zu löschen. Dieser Prozess umfasst vier Schritte, die nacheinander ausgeführt werden.
Der erste Schritt besteht darin, alle Daten in der Datei mit einem bestimmten Muster zu überschreiben. Dies geschieht mit der Funktion memset
, die einen Speicherblock auf einen bestimmten Wert setzt.
Im zweiten Schritt werden die Originaldaten in der Datei mit dem 256-Bit-AES-Algorithmus (Advanced Encryption Standard) verschlüsselt. Dies geschieht mit der Klasse AES
, die eine Methode StartEncryption
besitzt, welche ein Array von unsigned char
als Eingabe erwartet. Die zu verschlüsselnden Daten werden dieser Methode als Argument übergeben.
Der dritte Schritt besteht darin, die im zweiten Schritt geschriebenen Daten zu verifizieren. Dazu werden die Daten aus der Datei gelesen und mit den Originaldaten mithilfe der Funktion memcmp
verglichen. Wenn die gelesenen Daten nicht mit den Originaldaten übereinstimmen, wird der Statuswert 0xC0000719L
(STATUS_CONTEXT_MISMATCH) zurückgegeben.
Im letzten Schritt werden die Daten in der Datei mit einem zufälligen Muster überschrieben. Dies geschieht mit der Funktion DoRandomErase
, die drei Argumente erwartet: die Größe der zu löschenden Daten, einen Puffer zum Speichern der Daten und einen Byte-Wert, der die Iteration darstellt.
Wenn alle vier Schritte erfolgreich abgeschlossen werden, gibt die Funktion ASDAErase
den Statuswert 0
zurück. Falls ein Schritt fehlschlägt, wird ein entsprechender Fehlercode zurückgegeben.
Quellcode:
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; }
Erklärung des Quellcodes:
Dieser Quellcode definiert eine Funktion namens ASDAErase, die drei Parameter übernimmt: eine Ganzzahl size
, einen Zeiger buf
auf ein Byte-Array und eine Ganzzahl iteration
. Die Funktion gibt einen Ganzzahlwert status
zurück.
Die Funktion beginnt mit der Deklaration und Initialisierung einiger Variablen. Anschließend liest sie den aktuellen Dateizeiger mit der Funktion GetFilePointer
eines Objekts der Klasse LowLevelIO
aus. Dann wird Speicher für einen Arbeits-Puffer buf1
reserviert und der Dateiinhalt mit der Funktion Read
gelesen.
Die Funktion überschreibt dann die Daten in der Datei mit dem Wert 0xFF
, indem sie diesen mit der Funktion Write
in die Datei schreibt. Danach verschlüsselt sie den ursprünglichen Dateiinhalt mit dem AES-Algorithmus. Dazu wird ein zufälliger Schlüssel generiert, die AES-Parameter gesetzt und der Inhalt blockweise mit der Methode StartEncryption
verschlüsselt.
Anschließend wird der verschlüsselte Inhalt zurück in die Datei geschrieben und die Datei mit einem sich wiederholenden Muster aus 0x92
, 0x49
und 0x24
überschrieben. Danach wird überprüft, ob die Daten korrekt geschrieben wurden, indem sie erneut mit der Funktion Read
gelesen und mithilfe von memcmp
mit dem Muster verglichen werden.
Wenn all diese Operationen erfolgreich sind, wird abschließend die Funktion DoRandomErase
aufgerufen, um die Datei mit zufälligen Daten zu überschreiben. Schließlich wird der reservierte Speicher für buf1
freigegeben und der Statuswert zurückgegeben.