RegEx para analisar ou validar dados Base64

É possível usar um RegEx para validar ou higienizar dados Base64? Essa é a pergunta simples, mas os fatores que determinam essa questão são o que dificulta.

Eu tenho um decodificador Base64 que não pode confiar totalmente nos dados de entrada para seguir as especificações da RFC. Portanto, os problemas que enfrento são problemas como talvez os dados da Base64 que não podem ser divididos em 78 (acho que são 78, eu precisaria verificar novamente a RFC, para não me enganar se o número exato estiver errado) linhas ou que as linhas não possam terminar em CRLF; na medida em que pode ter apenas um CR, ou LF, ou talvez nenhum.

Por isso, passei muito tempo analisando dados Base64 formatados como tais. Devido a isso, exemplos como os seguintes se tornam impossíveis de decodificar de forma confiável. Eu exibirei apenas cabeçalhos MIME parciais por questões de brevidade.

Content-Transfer-Encoding: base64

VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

Ok, então analisar isso não é problema e é exatamente o resultado que esperaríamos. E em 99% dos casos, usar qualquer código para pelo menos verificar se cada caractere no buffer é um caractere base64 válido, funciona perfeitamente. Mas, o próximo exemplo joga uma chave inglesa na mistura.

Content-Transfer-Encoding: base64

http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

Essa é uma versão da codificação Base64 que eu já vi em alguns vírus e outras coisas que tentam tirar proveito de alguns leitores de e-mail que desejam analisar mímica a todo custo, em comparação com aqueles que seguem estritamente o livro, ou melhor, RFC; Se você for.

Meu decodificador Base64 decodifica o segundo exemplo para o seguinte fluxo de dados. E lembre-se de que aqui, o fluxo original é composto por todos os dados ASCII!

[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8

Alguém tem uma boa maneira de resolver os dois problemas ao mesmo tempo? Não tenho certeza se é possível, além de fazer duas transformações nos dados com regras diferentes aplicadas e comparar os resultados. No entanto, se você adotou essa abordagem, em qual saída você confia? Parece que a heurística ASCII é sobre omelhor solução, mas quanto mais código, tempo de execução e complexidade isso acrescentaria a algo tão complicado quanto um antivírus, no qual esse código está realmente envolvido? Como você treinaria o mecanismo de heurística para aprender o que é aceitável Base64 e o que não é?

ATUALIZAR:

Para o número de visualizações que essa pergunta continua obtendo, decidi publicar o RegEx simples que venho usando em um aplicativo C # há 3 anos, com centenas de milhares de transações. Honestamente, eu gosto da resposta dada porquiabo o melhor, e é por isso que o escolhi como resposta selecionada. Mas para quem usa C # e procura uma maneira muito rápida de, pelo menos, detectar se uma string ou byte [] contém dados válidos Base64 ou não, achei o seguinte para funcionar muito bem para mim.

[^-A-Za-z0-9+/=]|=[^=]|={3,}$

E sim, isso é apenas para umCORDA dados Base64, NÃO um formato formatado corretamenteRFC1341 mensagem. Portanto, se você estiver lidando com dados desse tipo, leve isso em consideração antes de tentar usar o RegEx acima. Se você estiver lidando com Base16, Base32, Radix ou mesmo Base64 para outros fins (URLs, nomes de arquivos, codificação XML, etc.), seráaltamente recomendo que você leiaRFC4648 estequiabo mencionado na resposta dele, pois você precisa estar ciente do conjunto de caracteres e terminadores usados pela implementação antes de tentar usar as sugestões neste conjunto de perguntas / respostas.

questionAnswers(4)

yourAnswerToTheQuestion