Estou procurando uma funcionalidade ofuscação muito simples (como criptografar e descriptografar, mas não necessariamente segura) para alguns dados. Não é missão crítica. Preciso de algo para manter as pessoas honestas, mas algo um pouco mais forte que o ROT13 ou o Base64 .
Prefiro algo que já esteja incluído no .NET framework 2.0, para que não precise me preocupar com nenhuma dependência externa.
Eu realmente não quero ter que mexer com chaves públicas / privadas etc. Não sei muito sobre criptografia, mas sei o suficiente para saber que qualquer coisa que escrevi seria menos que inútil ... Na verdade, Eu provavelmente estragaria a matemática e tornaria trivial quebrar.
c#
obfuscation
Matt Dawdy
fonte
fonte
Respostas:
Outras respostas aqui funcionam bem, mas o AES é um algoritmo de criptografia mais seguro e atualizado. Esta é uma classe que eu obtive há alguns anos para executar a criptografia AES que modifiquei ao longo do tempo para ser mais amigável para aplicativos da Web (por exemplo, eu criei métodos de Criptografia / Descriptografia que funcionam com cadeias de caracteres amigáveis à URL). Ele também possui os métodos que funcionam com matrizes de bytes.
NOTA: você deve usar valores diferentes nas matrizes Chave (32 bytes) e Vetor (16 bytes)! Você não gostaria que alguém descobrisse suas chaves apenas assumindo que você usou esse código como está! Tudo o que você precisa fazer é alterar alguns dos números (deve ser <= 255) nas matrizes Chave e Vetor (deixei um valor inválido na matriz Vetor para garantir que você faça isso ...). Você pode usar https://www.random.org/bytes/ para gerar um novo conjunto facilmente:
Key
Vector
É fácil usá-lo: instancie a classe e chame (geralmente) EncryptToString (string StringToEncrypt) e DecryptString (string StringToDecrypt) como métodos. Não poderia ser mais fácil (ou mais seguro) depois que você tiver essa classe.
fonte
Limpei o SimpleAES (acima) para o meu uso. Corrigidos métodos complicados de criptografia / descriptografia; métodos separados para codificação de buffers de bytes, seqüências de caracteres e seqüências de caracteres compatíveis com URL; fez uso de bibliotecas existentes para codificação de URL.
O código é pequeno, mais simples, mais rápido e a saída é mais concisa. Por exemplo,
[email protected]
produz:Código:
fonte
Sim, adicione o
System.Security
assembly, importe oSystem.Security.Cryptography
espaço para nome. Aqui está um exemplo simples de criptografia de algoritmo simétrico (DES):fonte
Apenas pensei em acrescentar que melhorei o SimplerAES do Mud adicionando um IV aleatório que é passado de volta para dentro da cadeia criptografada. Isso melhora a criptografia, pois criptografar a mesma sequência resultará em uma saída diferente a cada vez.
E teste de unidade de bônus
fonte
System.Random
como RNG. 2) Isto é completamente quebrado contra ataques de texto cifrado escolhido (em particular padding-oráculos)Uma variante da resposta de Marcas (excelente)
Espero que isto ajude
fonte
[EDIT] Anos depois, voltei a dizer: não faça isso! Consulte O que há de errado com a criptografia XOR? para detalhes.
Uma criptografia bidirecional muito simples e fácil é a criptografia XOR.
mypass
.mypassmypassmypass...
)mypassmypassmypass...
).fonte
Combinei o que achei melhor em várias respostas e comentários.
Código:
Atualização 18/07/2015: Corrigido erro no método Encrypt () privado pelos comentários de @bpsilver e @Evereq. O IV foi acidentalmente criptografado, agora é anexado em texto não criptografado, conforme esperado por Decrypt ().
fonte
return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
Se você deseja apenas uma criptografia simples (ou seja, possível que um cracker determinado quebre, mas bloqueie a maioria dos usuários casuais), basta escolher duas frases secretas de igual comprimento, digamos:
e xou seus dados com os dois (repetindo as senhas, se necessário) (a) . Por exemplo:
Alguém pesquisando seu binário pode muito bem achar que a cadeia de DNA é uma chave, mas é improvável que ache que o código C seja outra coisa senão a memória não inicializada salva com seu binário.
(a) Lembre-se de que é uma criptografia muito simples e, de acordo com algumas definições, pode não ser considerada nenhuma criptografia (uma vez que a intenção da criptografia é impedir o acesso não autorizado e não apenas torná-lo mais difícil). Embora, é claro, até a criptografia mais forte seja insegura quando alguém está de pé sobre os porta-chaves com um cano de aço.
Conforme declarado na primeira frase, esse é um meio de dificultar o suficiente para o atacante casual continuar com ele. É semelhante à prevenção de roubos em sua casa - você não precisa torná-lo inexpugnável, você só precisa torná-lo menos impregnável do que a casa ao lado :-)
fonte
A criptografia é fácil: como outras pessoas apontaram, existem classes no espaço para nome System.Security.Cryptography que fazem todo o trabalho para você. Use-os em vez de qualquer solução caseira.
Mas a descriptografia também é fácil. O problema que você tem não é o algoritmo de criptografia, mas a proteção do acesso à chave usada para descriptografia.
Eu usaria uma das seguintes soluções:
DPAPI usando a classe ProtectedData com escopo CurrentUser. Isso é fácil, pois você não precisa se preocupar com uma chave. Os dados só podem ser descriptografados pelo mesmo usuário; portanto, não é bom compartilhar dados entre usuários ou máquinas.
DPAPI usando a classe ProtectedData com escopo LocalMachine. É bom, por exemplo, para proteger dados de configuração em um único servidor seguro. Mas qualquer pessoa que possa fazer login na máquina pode criptografá-la, portanto não adianta, a menos que o servidor esteja seguro.
Qualquer algoritmo simétrico. Normalmente, uso o método SymmetricAlgorithm.Create () estático se não me importo com o algoritmo usado (na verdade, é Rijndael por padrão). Nesse caso, você precisa proteger sua chave de alguma forma. Por exemplo, você pode ofuscá-lo de alguma forma e ocultá-lo no seu código. Mas lembre-se de que qualquer pessoa inteligente o suficiente para descompilar seu código provavelmente poderá encontrar a chave.
fonte
Eu queria postar minha solução, pois nenhuma das opções acima é tão simples quanto a minha. Diz-me o que pensas:
Opcional
Isso pressupõe que a MachineKey do servidor usado para criptografar o valor seja a mesma usada para descriptografar o valor. Se desejar, você pode especificar uma MachineKey estática no Web.config para que seu aplicativo possa descriptografar / criptografar dados, independentemente de onde eles são executados (por exemplo, servidor de desenvolvimento vs. produção). Você pode gerar uma chave estática da máquina seguindo estas instruções .
fonte
O espaço para nome
System.Security.Cryptography
contém as classesTripleDESCryptoServiceProvider
eRijndaelManaged
Não se esqueça de adicionar uma referência à
System.Security
montagem.fonte
Usando TripleDESCryptoServiceProvider no System.Security.Cryptography :
fonte
Eu mudei isso :
para isso:
fonte
Usando a biblioteca interna de criptografia .Net, este exemplo mostra como usar o Advanced Encryption Standard (AES).
fonte
Sei que você disse que não se importa com a segurança, mas se você escolher o DES, também poderá usar o AES, pois é o método de criptografia mais atualizado.
fonte
Eu tenho usado a resposta aceita por Mark Brittingham e isso me ajudou muito. Recentemente, tive que enviar texto criptografado para uma organização diferente e foi aí que surgiram alguns problemas. O OP não exige essas opções, mas como essa é uma pergunta popular, estou postando minha modificação (
Encrypt
eDecrypt
funções emprestadas daqui ):RijndaelManaged
valores padrão e outro para valores de propriedade (com base em acordo mútuo entre as partes criptografadas e descriptografadas)Aqui está a classe (amostra de teste no final):
e..
Aqui está a amostra de teste:
fonte
Eu acho que este é o mais simples do mundo!
Teste
fonte