Pergunta

Durante anos, talvez 10, fui fascinado por criptografia.Eu li um livro sobre criptografia baseada em bits XOR e fiquei viciado desde então.

Acho que é mais justo dizer que sou fascinado por aqueles que conseguem quebrar vários métodos de criptografia, mas discordo.

Direto ao ponto: quais métodos você usa ao escrever criptografia?A ofuscação é boa em criptografia?

Eu uso criptografia XOR baseada em duas chaves, várias técnicas de hash (SHA1) nas chaves e coisas simples, como reverter strings aqui e ali, etc.

Estou interessado em ver o que os outros pensam e tentam ao escrever um método de criptografia não tão pronto para uso.Além disso - qualquer informação sobre como os profissionais "quebram" várias técnicas de criptografia também seria interessante.

Para esclarecer - não desejo usar isso em nenhum código de produção ou em qualquer código meu.Tenho interesse em aprender como isso funciona brincando, não reinventando a roda.:)

Ian

Foi útil?

Solução

Contradizer o que todo mundo disse até agora, Vá em frente! Sim, seu código pode ter vulnerabilidades de transbordamento de buffer nele, e pode ser lento, buggy etc., mas você está fazendo isso por DIVERSÃO! Eu entendo completamente o prazer recreativo encontrado em brincar com Crypto.

Dito isto, a criptografia não é baseada na ofuscação (ou pelo menos não deveria ser). Boa criptografia continuará trabalhando, mesmo uma vez Véspera passou pelo seu código ofuscado e entende completamente o que está acontecendo. IE: Muitos jornais têm Código de substituição Quebra -cabeças que os leitores tentam quebrar no café da manhã. Se eles começaram a fazer coisas como reverter a corda inteira, sim, seria mais difícil, mas Joe Reader ainda seria capaz de quebrá -la, neve tuohtiw gnieb dlot.

A boa criptografia é baseada em problemas que se supõem (nenhum comprovado ainda, Afaik) realmente difícil. Exemplos disso incluem Factorizando os primos, encontrando o log, ou realmente qualquer outro Np-complete problema.

Editar: Snap, nenhum desses é comprovado Np-complete. Eles são todos não comprovados, mas diferentes. Espero que você ainda veja meu ponto: a criptografia é baseada em funções unidirecionais. Essas são operações fáceis de fazer, mas difíceis de desfazer. ou seja, multiplique dois números vs encontrar os principais fatores do produto. Boa pegada tduehr]

Mais poder para você brincar com um ramo muito legal da matemática, lembre -se de que a criptografia é baseada em coisas difíceis, não complicadas. Muitos algoritmos de criptografia, uma vez que você realmente os entendem, são impressionantes, mas ainda funcionam porque são baseados em algo difícil, não apenas trocando de letras.

Nota: Com isso dito, alguns algoritmos adicionam peculiaridades extras (como seversal de cordas) para tornar o bruto forçando -os muito mais difíceis. Uma parte de mim parece que eu leu isso em algum lugar de referência Des, mas eu não acredito ... [Editar: eu estava certo, veja 5º parágrafo deste artigo Para uma referência às permutações como inúteis.

BTW: Se você nunca o encontrou antes, eu acho que o CHÁ/XTEA/Xxtea Série de algoritmos seria de interesse.

Outras dicas

O melhor conselho que posso dar é: Resista à tentação de reinventar a roda. A criptografia é mais difícil do que você pensa.

Pegue o livro de Bruce Schneier Criptografia aplicada e leia com cuidado.

A resposta correta é não fazer algo assim. O melhor método é escolher uma das muitas bibliotecas de criptografia por esse fim e usá -las em seu aplicativo. A segurança através da obscuridade nunca funciona.

Escolha os principais padrões atuais para algoritmos de criptografia também. Aes para criptografia, SHA256 para hash. Elgamal para chave pública.

A leitura de criptografia aplicada também é uma boa ideia. Mas uma grande maioria do livro são detalhes das implementações que você não precisará para a maioria dos aplicativos.

EDIT: Para expandir as novas informações fornecidas na edição. A grande maioria da criptografia atual envolve muita matemática complicada. Até as cifras de bloco que parecem todos os tipos de muitos bits são iguais.

Nesse caso, leia a criptografia aplicada e depois pegue o livro Manual de criptografia aplicada que você pode baixar gratuitamente.

Ambos têm muitas informações sobre o que entra em um algoritmo de criptografia. Alguma explicação de coisas como diferencial e linear criptanálise. Outro recurso é Citeseer que possui vários trabalhos acadêmicos mencionados por ambos os livros para download.

A criptografia é um campo difícil, com uma enorme história acadêmica para ir a qualquer lugar. Mas se você tem as habilidades, é bastante gratificante como eu achei.

Faça os exercícios aqui:

http://www.schneier.com/crypto gram-9910.html#soyouwanttobeacryptographing

Para iniciantes, olhe para o papel de ataque do cubo (http://eprint.iacr.org/2008/385) e tente quebrar alguns algoritmos com ele. Depois de estar familiarizado com a quebra de esquemas criptográficos, você se tornará melhor em criá -los.

No que diz respeito ao código de produção, repetirei o que já foi dito: basta usar o que está disponível no mercado, já que todos os esquemas principais já passaram por várias rodadas de criptonálise.

Todo o conselho acima é bom. OBFUSCATION BAB. Não coloque sua própria criptografia em produção sem primeiro deixar o público bater nela por um tempo.

Algumas coisas a acrescentar:

  • Codificação é não criptografia. Recentemente, ignorei o sistema de autenticação de um site devido ao entendimento mal -entendido aqui.

  • Aprenda a quebrar até os sistemas mais básicos. Você ficaria surpreso com a frequência do conhecimento de cifras de rotação simples é realmente útil.

  • A^b = C. Você declarou que trabalha com duas chaves de criptografia XOR. Ao construir um sistema de criptografia, verifique se suas etapas estão realmente realizando algo. No caso de dois key xor, você está realmente apenas usando uma chave diferente.

  • A^a = 0. xor a enrição é muito fraca contra ataques de texto simples conhecido ou escolhido. Se você conhece todo ou parte do texto simples, poderá obter toda ou parte da chave. PlainText ^ cypherText = chave

  • Outro bom livro para ler é o livro de código de Simon Singh. Ele passa por parte da história da criptografia e métodos para quebrar a maioria dos sistemas de criptografia que ele cobre.

  • Dois algoritmos para aprender (aprenda -os e a história por trás deles):

    • 3DES: Sim, é obsoleto, mas é um bom ponto de partida para aprender Fiestel e Block Cyphers e há algumas boas lições na criação de des. Além disso, o raciocínio para a metodologia criptografada, descriptografada e criptografar é uma coisa boa a aprender.
    • RSA: Vou exibir meu nerd de matemática interno aqui. Provavelmente o algoritmo de criptografia mais simples hoje em uso. Os métodos de quebra são conhecidos (apenas fator a chave), mas computacionalmente extremamente difíceis. m^d mod n onde n = p*q (p e q prime) e gcd (d, n) = 1. Um pouco de teoria do grupo/número explica por que isso não é facilmente revertido sem conhecer p e q. No meu curso de teoria numérica, provamos a teoria por trás disso pelo menos meia dúzia de maneiras.

Uma nota para Phirephly:

A fatorização primordial e o log discreto não são premiados NP, ou NP-HARD para esse assunto. Ambos são desconhecidos em complexidade. Eu imagino que você receberia uma quantidade decente de fama ao descobrir essa parte. Dito isto, o restante da sua afirmação está correto. Boa criptografia é baseada em coisas que são fáceis de fazer, mas difíceis de desfazer sem a chave.

A menos que você esteja (se tornando) um especialista no campo, não use criptografia caseira em produtos de produção. O suficiente disse.

NÃO!

Até os especialistas têm um muito É difícil saber se eles acertaram. Fora de uma classe CS CS, basta usar o código de outras pessoas. Código da porta somente se você absolutamente você deve e depois teste o ranho com o código bom conhecido.

A maioria dos especialistas concorda que a abertura é mais valiosa que a ofuscação no desenvolvimento de métodos e algoritmos criptográficos.

Em outras palavras, todos parecem ser capazes de projetar um novo código que todos possam quebrar, exceto eles. A melhor criptografia sobrevive ao teste de ter o algoritmo e algumas mensagens criptografadas divulgadas e ter os melhores hackers de criptografia tentando quebrá -lo.

Em geral, a maioria dos métodos de ofuscação e hash simples (e eu mesmo fiz alguns deles) são facilmente quebrados. Isso não significa que eles não são divertidos de experimentar e aprender.

Lista de livros de criptografia (da Wikipedia)

Esta pergunta chamou minha atenção porque estou relendo atualmente Cryptonomicon Por Neal Stephenson, que não é uma visão geral ruim, mesmo que seja um romance ...

Para ecoar todos os outros (por posteridade), nunca implemente sua própria criptografia. Use uma biblioteca.

Dito isto, aqui está um artigo sobre como implementar Des:

http://scienceblogs.com/goodmath/2008/09/des_encryption_part_1_encrypti.php

Permutação e ruído são cruciais para muitos algoritmos de criptografia. O ponto não é tanto para obscurecer as coisas, mas adicionar etapas ao processo que tornam impraticável a força bruta.

Além disso, pegue e leia Criptografia aplicada. É um ótimo livro.

Tem que concordar com outros pôsteres. A menos que você esteja escrevendo um artigo sobre ele e precise fazer alguma pesquisa ou algo assim.

Se você acha que sabe muito sobre isso, leia o Criptografia aplicada livro. Eu conheço muita matemática e esse livro ainda chutou minha bunda. Você pode ler e analisar o pseudo-código. O livro também tem uma tonelada de referências nas costas para se aprofundar, se você quiser.

Crypto é uma daquelas coisas que muitas pessoas acham muito legal, mas a matemática real por trás dos conceitos está além do seu alcance. Decidi há muito tempo que não valeu o esforço mental para eu chegar a esse nível.

Se você quiser apenas ver como é feito (estude as implementações existentes em código), sugiro dar uma olhada no Biblioteca Crypto ++ Mesmo se você normalmente não codifica em C ++, é uma boa visão dos tópicos e partes da implementação da criptografia.

Bruce também tem um bom Lista de recursos Você pode obter do site dele.

Eu participei de uma sessão de segurança de código neste ano Aus Teched. Ao falar sobre o algoritmo AES no .NET e como foi selecionado, o apresentador (Rocky Heckman) nos contou uma das técnicas usadas para quebrar a criptografia anterior. Alguém conseguiu usar uma câmera de imagem térmica para gravar a assinatura de calor de uma CPU enquanto estava criptografando dados. Eles foram capazes de usar essa gravação para determinar quais tipos de cálculos o chip estava fazendo e depois engenharia reversa do algoritmo. Eles tiveram muito tempo em suas mãos, e estou bastante confiante de que nunca será inteligente o suficiente para vencer pessoas assim! :(

  • Nota: Espero sinceramente ter transmitido a história corretamente, se não - o erro provavelmente é meu, não o do apresentador mencionado.

Já foi espancado até a morte que você não deve usar criptografia cultivada em casa em um produto. Mas eu li sua pergunta e você claramente afirma que está apenas fazendo isso por diversão. Parece o verdadeiro espírito nerd/hacker/acadêmico para mim. Você sabe que funciona, você quer saber por que funciona e tente ver se você pode fazê -lo funcionar.

Eu encorajo completamente isso e faço o mesmo com muitos programas que escrevi apenas por diversão. Eu sugiro ler este post (http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/) em um blog chamado "rootlabs". No post estão uma série de links que você deve achar muito interessante. Um cara interessado em matemática/criptografia com doutorado em ciência da computação e que trabalha para o Google decidiu escrever uma série de artigos sobre programação de criptografia. Ele cometeu vários erros não óbvios que foram apontados pelo especialista do setor Nate Lawson.

Eu sugiro que você leia. Se isso não o incentivar a continuar tentando, sem dúvida ainda ensinará algo.

Boa sorte!

Eu concordo em não reinventar a roda.

E lembre -se, a segurança através da obscuridade não é segurança. Se alguma parte de seus mecanismos de segurança usar a frase "ninguém jamais descobrirá isso!", Não é seguro. Pense no AES - o algoritmo está disponível ao público, então todo o mundo sabe exatamente Como funciona, e ainda assim ninguém pode quebrá -lo.

De acordo com outras respostas - inventar um esquema de criptografia é definitivamente uma coisa para os especialistas e qualquer novo esquema de criptografia proposto realmente precisa ser colocado em escrutínio público por qualquer esperança razoável de validação e confiança em sua robustez. No entanto, a implementação de algoritmos e sistemas existentes é um empreendimento muito mais prático "para diversão" e todos os principais padrões têm bons vetores de teste para ajudar a provar a correção da sua implementação.

Com isso dito, para soluções de produção, as implementações existentes são abundantes e normalmente não deve haver razão precisar Para implementar um sistema você mesmo.

Eu concordo com todas as respostas, ambas "Não escreva seu próprio algoritmo criptográfico Para uso da produção "e"Inferno, sim, vá em frente para sua própria edificação", mas me lembro de algo que acredito que o venerável Bruce Schneier costuma escrever:"É fácil para alguém criar algo que eles mesmos não podem quebrar ".

A única criptografia que um não especialista deve esperar acertar é o osso simples uma vez cifras.

CipherTextArray = PlainTextArray ^ KeyArray;

Além disso, qualquer coisa que valha a pena analisar (mesmo para recreação) precisará de um grau de alto nível em matemática.

Eu não quero aprofundar as respostas corretas que já foram dadas (não faça isso para produção; reversão simples não o suficiente; ofusco ruim; etc).

Eu só quero adicionar o princípio de Kerckoff: "Um sistema de criptografia deve estar seguro, mesmo que tudo sobre o sistema, exceto a chave, seja o conhecimento público".

Enquanto eu estou nisso, também mencionarei o princípio de Bergofsky (citado por Dan Brown em Fortaleza Digital): "Se um computador tentava chaves suficientes, era matematicamente garantido encontrar o certo. A segurança de um código não era que seu passe -Senda era inútil, mas sim que a maioria das pessoas não tinha tempo ou equipamento para experimentar ".
Só que isso não é verdadeiro; Dan Brown inventou.

Respondendo a PhirePhly e tduehr, sobre a complexidade do factoring:

Pode-se ver facilmente que a fatoração está em NP e coNP.O que precisamos ver é que os problemas "dados n e k, encontrar um fator primo p de n com 1 < p <= k" e "mostrar que tal p não existe" estão ambos em NP (sendo o primeiro a variante de decisão do problema de fatoração, sendo a segunda a variante de decisão do complemento).

Primeiro problema:dada uma solução candidata p, podemos facilmente (ou seja,em tempo polinomial) verifique se 1 < p <= k e se p divide n.Uma solução p é sempre mais curta (no número de bits usados ​​para representá-la) que n, então a fatoração é em NP.

Segundo problema:dada uma fatoração primária completa (p_1, ..., p_m), podemos verificar rapidamente que seu produto é n e que nenhum está entre 1 e k.Sabemos que PRIMES está em P, então podemos verificar a primalidade de cada p_i em tempo polinomial.Como o menor primo é 2, há no máximo log_2(n) fatores primos em qualquer fatoração válida.Cada fator é menor que n, então eles usam no máximo O(n log(n)) bits.Portanto, se n não tiver um fator primo entre 1 e k, existe uma prova curta (tamanho polinomial) que pode ser verificada rapidamente (em tempo polinomial).

Portanto, a fatoração está em NP e coNP.Se fosse NP-completo, então NP seria igual a coNP, algo que muitas vezes é considerado falso.Pode-se tomar isso como evidência de que a fatoração não é de fato NP-completa;Prefiro esperar por uma prova ;-)

Geralmente, começo obtendo um doutorado na teoria dos números. Depois, faço uma década ou mais de pesquisas e sigo isso com muita publicação e revisão por pares. Quanto às técnicas que eu uso, elas são várias de minha pesquisa e de meus colegas. Ocasionalmente, quando acordo no meio da noite, desenvolvo uma nova técnica, implementarei, encontro buracos nela (com a ajuda da minha teoria de números e colegas de ciência da computação) e depois refinamos a partir daí.

Se você der um algoritmo a um mouse ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top