Algoritmo Avançado de Eliminação Segura (ASDA)
A próxima geração de eliminação segura de dados.

O ASDA possibilita uma eliminação de dados altamente eficaz e verificável com consumo mínimo de recursos. Os quatro passes foram concebidos para eficiência e transparência: verificação de leitura após gravação (read‑after‑write) e logs de eliminação registram cada etapa. AES‑256 e números aleatórios criptograficamente fortes dificultam de forma duradoura a reconstrução forense. A implementação se integra sem atrito aos processos existentes.
O ASDA também excede os requisitos da NIST SP 800‑88 Rev. 1 (Clear / Purge / Destroy). Dependendo do meio (HDD/SSD/Flash), mecanismos adicionais de purge podem ser apropriados—como Block Erase ou Cryptographic Erase.
Visão geral dos quatro passes
A área de dados é totalmente sobrescrita com 0xFF—o conteúdo original torna‑se irrecuperável.
O conteúdo original do buffer é criptografado com AES‑256 e gravado novamente—criando uma barreira criptográfica contra a reconstrução forense. (Chaves apenas temporariamente na RAM; depois, apagadas com segurança.)
Escreve‑se um padrão de bits definido (ex.:
10010010 01001001 00100100) e, em seguida, realiza‑se a verificação read‑after‑write. Desvios são sobrescritos novamente e registrados no relatório de eliminação. Por fim, o ASDA sobrescreve a área com números aleatórios criptograficamente fortes (CSPRNG conforme a NIST SP 800‑90A).
Documentação sobre o código-fonte:
A função ASDAErase na classe DataShredder é usada para excluir dados de forma segura de um arquivo. Esse processo envolve quatro etapas, que são realizadas em ordem sequencial.
A primeira etapa é sobrescrever todos os dados do arquivo com um padrão específico. Isso é feito usando a função memset, que define um bloco de memória com um valor específico.
A segunda etapa é criptografar os dados originais do arquivo usando o algoritmo AES de 256 bits (Advanced Encryption Algorithm). Isso é feito utilizando a classe AES, que possui o método StartEncryption que recebe um array de unsigned char como entrada. Os dados a serem criptografados são passados como argumento para esse método.
A terceira etapa envolve a verificação dos dados que foram gravados no arquivo na segunda etapa. Isso é feito lendo os dados de volta do arquivo e comparando-os com os dados originais usando a função memcmp. Se os dados lidos do arquivo não corresponderem aos dados originais, um valor de status 0xC0000719L (STATUS_CONTEXT_MISMATCH) é retornado.
Finalmente, a última etapa é sobrescrever os dados do arquivo com um padrão aleatório. Isso é feito usando a função DoRandomErase, que recebe três argumentos: o tamanho dos dados a serem apagados, um buffer para armazenar os dados e um valor byte representando o número da iteração.
Se todas as quatro etapas forem concluídas com sucesso, a função ASDAErase retorna um valor de status igual a 0. Se qualquer uma das etapas falhar, um código de erro apropriado é retornado.
Código-fonte:
long DataShredder::ASDAErase(DWORD size, byte *buf, byte iteration)
{
long status=0;
LARGE_INTEGER nCurrentFilePointer = {0};
this->m_pLowLevelIO->GetFilePointer(&nCurrentFilePointer);
// buffer de trabalho
byte *buf1 = (byte*)malloc(size);
// ler conteúdo do arquivo
if(iteration == 0) {
status=this->m_pLowLevelIO->Read(buf1, size, NULL);
this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer);
}
// sobrescrever com 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);
}
// criptografar conteúdo original do arquivo
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);
// verificação
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;
}
Explicação do código-fonte:
Este código-fonte define uma função chamada ASDAErase, que recebe três parâmetros: um inteiro size, um ponteiro buf para um array de bytes, e um inteiro iteration. A função retorna um valor inteiro status.
A função começa declarando e inicializando algumas variáveis. Em seguida, lê o ponteiro atual do arquivo usando a função GetFilePointer de um objeto da classe LowLevelIO. Depois, aloca memória para um buffer de trabalho buf1 e lê o conteúdo do arquivo nesse buffer usando a função Read do mesmo objeto LowLevelIO.
Em seguida, a função apaga os dados no arquivo com o valor 0xFF, escrevendo esse valor no arquivo com a função Write do objeto LowLevelIO, e então criptografa o conteúdo original do arquivo usando o algoritmo AES (Advanced Encryption Standard). Isso é feito gerando uma chave aleatória, configurando os parâmetros de criptografia AES, e então criptografando o conteúdo do arquivo em blocos de 4 bytes usando a função StartEncryption.
A função então grava os dados criptografados de volta no arquivo e, em seguida, sobrescreve o arquivo com um padrão de 0x92, 0x49 e 0x24 repetidos nessa ordem. Depois, verifica se os dados foram gravados corretamente usando a função Read e a função memcmp para comparar os dados no buffer de trabalho buf1 com os dados do padrão em buf.
Se todas essas operações forem bem-sucedidas, a função então chama outra função chamada DoRandomErase para sobrescrever o arquivo com dados aleatórios. Por fim, a função libera a memória alocada para buf1 e retorna o valor de status.