Muito boas suas observações, cyp. Relatam detalhes que sequer lembrei-me da relevância. Valeu por destacá-los bem, de modo claro e objetivo. É verdade, existe o algoritmo criptográfico e o algoritmo gerador de chaves. A segurança por obscuridade, ocultando detalhes do algoritmo além da chave, dificulta um pouco mais o processo de reversão.
Vi o texto que publicou em seu blog a respeito da cifragem XOR. No código que lá apresenta, realça quão simples e seguro pode ser caso tal cifragem seja corretamente implementada.
Consideramos o pseudo-código abaixo: byte[] inputBytes = ... // 1024 bytes byte[] derivedBytes = Rfc2898DeriveBytes.Pbkdf2( key, salt, 10000, HashAlgorithmName.SHA256, inputBytes.Length); byte[] encryptedBytes = XOR(inputBytes, derivedBytes);
No código, a função Rfc2898DeriveBytes.Pbkdf2
é um Pseudo Random Noise Generator. Em vez de guardar toda chave aleatória, armazena-se apenas os parâmetros passados para a Rfc2898DeriveBytes.Pbkdf2
. Lembro-me disto com certa vantagem quando usando OTP. Precisei armazenar toda chave aleatória gerada a partir de ruído atmosférico que, praticamente, não pode ser reproduzida, logo, a necessidade de armazená-la em outro local seguro. O armazenamento é custoso, pois não há algoritmo de compactação eficiente para os conteúdos aleatórios gerados (chave e cifra).