Segurança e Criptografia

A capacidade de compartilhar mensagens de forma segura, guardar segredos e identificar pessoas sempre foram importantes para a humanidade. Existem registros de que criptografia já era usada na Mesopotâmia para proteger informações há mais de 3500 anos.

Em períodos de guerra, tais habilidades se mostram ainda mais importantes. Alguns séculos antes de Cristo, espartanos já usavam cifras de transposição e militares romanos já possuíam um sistema de senhas. Os alemães fizeram uso pesado de criptografia durante a Segunda Guerra, o que também impulsionou muitos avanços na área de criptoanálise.

Segurança e privacidade estão entre os assuntos que mais despertam o meu interesse, especialmente as partes ligadas a diversas áreas relacionadas a criptografia como, por exemplo:

  • Computação: algoritmos de chave simétrica, algoritmos de chave pública, funções de hash, técnicas de criptoanálise, deniable encryption esteganografia
  • Matemática: matemática discreta, álgebra linear, teoria dos grupos
  • História: cifras antigas, uso militar de criptografia em guerras
  • Sociologia: discussões sociais, políticas e filosóficas que vez ou outra geram muita polêmica, leis como a RIPA do Reino Unido.

Como é fácil de perceber, criptografia é uma área bastante abrangente, o que não me permite entrar em muitos detalhes aqui. Detalhes sobre o funcionamento dos algoritmos, benchmarks e outras análises mais aprofundadas podem ser encontrados em livros e em outros sites. O objetivo deste post é falar apenas sobre alguns métodos de criptografia de mensagens e arquivos utilizando programas e algoritmos que eu uso e recomendo.

Criptografia de arquivos

Vim

Não é uma criptografia segura! (veja: https://dgl.cx/2014/10/vim-blowfish)

Encriptar arquivos

É possível encriptar arquivos (textos, imagens, etc) diretamente pelo Vim das seguintes maneiras:

  1. ROT13

    Um segredo pouco conhecido do Vim é o comando g?[movimento], que aplica o ROT13 no trecho entre o início e o fim do movimento.

    O ROT13 é uma cifra de César com passo 13, o que faz com que o processo de codificação seja igual ao de decodificação.

    Este tipo de criptografia é muito fraca para proteger um documento, mas tem algumas utilidades divertidas.

    Exemplo: Digamos que você tenha aplicado o ROT13 apenas à segunda linha de um texto, que contém a resposta para a charada (em Português):

    P: Por que tem uma cama elástica no polo norte?
    E: Cnen b hefb CBYNE!
    

    Para ler a resposta é só aplicar o ROT13 novamente (2Gg?$ ou :2 norm! g?$):

    P: Por que tem uma cama elástica no polo norte?
    R: Para o urso POLAR!
    

    Se você quiser encriptar um arquivo inteiro ou encontrou alguma mensagem obfuscada na internet, provavelmente o tr seja uma alternativa melhor que o Vim, pois não é necessário abrir o arquivo, basta redirecionar o stdin para tr a-zA-Z n-za-mN-ZA-M.

    Como exemplo deixo você testar o seguinte comando, uma homenagem a Bruce Schneier, criador do Blowfish e um dos mais importantes criptógrafos atuais. Retirada de schneierfacts.com

    julio@acer ~> echo "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, \
    ur'q pehfu lbhe fxhyy jvgu uvf ynhtu." | tr a-zA-Z n-za-mN-ZA-M
    
  2. Utilizando o parâmetro -x pelo terminal

    julio@acer ~> vim -x segredo.txt
    

    O Vim pedirá uma senha para usar como chave de encriptação do arquivo.

    Isso é válido tanto para novos arquivos quanto para arquivos já existentes.

    Agora você terá que fornecer a senha todas as vezes que for editar o arquivo.

    Ao digitar uma senha inválida você verá algo como q,§Â²îu]2©^D!¸¡á^?%°ç]^[.

    julio@acer ~> file segredo.txt
    segredo.txt: Vim encrypted file data
    
    julio@acer ~> cat segredo.txt
    VimCrypt~01!xOî4QLÉ
    ©è¢i¶@h@$[¾M%
    
  3. :X

    Tem o mesmo efeito da opção anterior, o Vim pedirá para você digitar uma senha duas vezes e irá encriptar o arquivo usando a chave digitada.

Alterar a senha

Para mudar a senha basta usar o parâmetro +X no terminal, digitar senha antiga e depois a senha nova nas duas vezes que o Vim pedir.

julio@acer ~> vim +X segredo.txt

Remover a senha

Para remover a senha basta abrir o arquivo com o vim e apagar a opção key.

:set key=

Mudar o algoritmo de encriptação

O Vim possui dois algoritmos de chave simétrica:

  • pkzip

    Não use, algoritmo fraco e fácil de crackear.

    :setlocal cryptmethod=zip
    
  • Blowfish

    Algoritmo forte. Recomendado.

    :setlocal cm=blowfish
    

Perceba que cm é apenas uma abreviação para cryptmethod.

Gnu Privacy Guard (GPG)

Uma desvantagem do Vim é que ele só permite utilizar dois algoritmos (Pkzip e Blowfish), que são relativamente fracos em algumas situações e ambos são apenas de chave simétrica, ou seja, o remetente (Alice) deve compartilhar a chave previamente com o destinatário (Bob).

Se Alice não possui nenhum meio de comunicação seguro com Bob, como fazer para passar a senha do arquivo encriptado de forma segura? Para isso existem algoritmos assimétricos. Alice pode simplesmente enviar a senha encriptada usando a chave pública de Bob.

O GPG é ideal para casos como esse, pois ele possui 3 algoritmos assimétricos e vários outros simétricos, inclusive o Blowfish e outros ainda mais fortes. Além de algoritmos de encriptação o GPG também possui alguns para hash e compressão.

Uma lista dos algoritmos disponíveis pode ser encontrada com o seguinte comando:

julio@acer ~> gpg --version
  Supported algorithms:
  Pubkey: RSA, ELG, DSA
  Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
  CAMELLIA192, CAMELLIA256
  Hash: <del>MD5</del>, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
  Compression: Uncompressed, ZIP, ZLIB, BZIP2

Criptografia assimétrica

Gere seu par de chaves privada e pública

Um par de chaves é necessário para encriptação, descriptografia, assinatura e verificação.

As pessoas usarão sua chave pública para encriptar mensagens destinadas a você e você usará sua chave privada correspondente para decriptar essa mensagem. Portanto a chave pública pode ser distribuída publicamente, mas a chave privada deve ser mantida em segredo em algum lugar seguro.

  1. Gere sua chave privada

    julio@acer ~> gpg --gen-key
    

    RSA 2048 deve ser suficiente (pode ir até 4096), desde que você use uma passphrase segura e não senhas suscetíveis a ataques de dicionário ou bruteforces simples.

    Ou seja, nada de senhas curtas, senhas numéricas, nome do seu chihuahua ou palavras comuns.

    A passphrase _EsseÉ1SiteMuitoLegal!_ é muito melhor que _banana1_, e tão forte quanto a senha _$%Sh4x0rq56lohap[3é-!_, porém bem mais fácil de lembrar.

    Tirinha obrigatória nesse tipo de post: https://xkcd.com/936/

  2. Gere uma versão ASCII da sua chave pública

    julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com
    

    O --armor garante que a saída será ASCII (Base64)

Compartilhamento de chaves públicas

Depois de gerar um arquivo ASCII com sua chave pública, você pode compartilhá-lo com outras pessoas. Elas terão que importar sua public key usando gpg --import e você terá que fazer o mesmo para mandar uma resposta:

julio@acer ~> gpg --import < alice.asc

Uma forma de verificar a autenticidade da chave pública da Alice é comparando o fingerprint informado por ela com a saída de gpg --fingerprint.

Importando uma chave privada

Importar chaves privadas pode ser útil em 3 casos:

  1. Você usa mais de um computador e quer poder decriptar mensagem em todos eles
  2. Você reformatou o disco e quer importar a chave privada que você fez backup
  3. Você faz parte de um grupo de pessoas que compartilha uma mesma chave

Para todos esses casos o comando é:

julio@acer ~> gpg --allow-secret-key-import --import private_key.asc

Encripte um arquivo

julio@acer ~> gpg --encrypt --recipient julio@juliobs.com segredo.txt
julio@acer ~> gpg --encrypt --armor --recipient julio@juliobs.com segredo.txt

O primeiro comando gera um arquivo binário chamado segredo.txt.gpg e o segundo um arquivo de texto chamado segredo.txt.asc. Se você precisar colar a mensagem encriptada em um email use o segundo (com --armor), caso contrário o primeiro é preferível por gerar um arquivo menor:

julio@acer ~> file segredo.txt*; ls -lh segredo.txt*
  segredo.txt:     UTF-8 Unicode text
  segredo.txt.asc: PGP message
  segredo.txt.gpg: GPG encrypted data

  -rw-r--r-- 1 julio users  163 Jun 10 20:58 segredo.txt
  -rw-r--r-- 1 julio users 1.1K Jun 10 21:01 segredo.txt.asc
  -rw-r--r-- 1 julio users  740 Jun 10 20:59 segredo.txt.gpg

Criptografia simétrica

  1. Usando o algoritmo padrão AES128 (Antes era CAST-128)

    julio@acer ~> gpg --symmetric lol.tt
    
  2. Usando AES-256 (Rijndael)

    AES-256 é um dos algoritmos mais fortes, sendo utilizado atualmente pelo governo americano para criptografar arquivos Top Secret

    julio@acer ~> gpg --cipher-algo AES256 --symmetric segredo.txt
    

Criptografia Híbrida

Decripte um arquivo

julio@acer ~> gpg --output arquivo_decriptado.txt --decrypt segredo.txt.gpg

Digite sua senha quando ela for solicitada e o arquivo secreto será decriptado e salvo como arquivo_decriptado.txt.

Interface gráfica

Seahorse

Seahorse é um programa que facilita o gerenciamento de suas chaves. Ele também pode ser usado para criar chaves PGP, Secure Shell e armazenar senhas.

Ele pode ser instalado pelo seguinte comando:

julio@acer ~> sudo pacman -S seahorse

Kgpg

O Kgpg é uma interface gráfica sobre o GPG.

Instale plugin gnupg para Vim

Para instalar é só copiar o plugin para ~/.vim/plugin ou, se você usa Vundle para gerenciar seus plugins, basta adicionar Bundle 'git://gitorious.org/vim-gnupg/vim-gnupg.git' ao .vimrc e executar :BundleInstall!

Agora você pode abrir arquivos .gpg em precisar digitar gpg --decrypt, o Vim pedirá sua senha.

Minha chave pública (gerada na etapa 1.2)

OpenSSL

Também podemos usar o OpenSSL para encriptar arquivos.

julio@acer ~> openssl aes-256-cbc -salt -in segredo.txt -out segredo.aes
  enter aes-256-cbc encryption password:
  Verifying - enter aes-256-cbc encryption password:
julio@acer ~> cat segredo.aes
  Salted_Ø$5ÝGa$´³1äÄõýÓË
julio@acer ~> openssl aes-256-cbc -d -salt -in segredo.aes -out segredo.txt
  enter aes-256-cbc decryption password:
julio@acer ~> cat segredo.txt
  Este arquivo é secreto!

Mcrypt

  1. Instale o Mcrypt

    julio@acer ~> sudo pacman -S mcrypt
    
  2. Encripte um arquivo

    julio@acer ~> mcrypt -a rijndael-128 segredo.txt
     Enter the passphrase (maximum of 512 characters)
     Please use a combination of upper and lower case letters and numbers.
     Enter passphrase:
     Enter passphrase:
    
     File segredo.txt was encrypted.
    
  3. Decripte um arquivo

    julio@acer ~> mcrypt -d segredo.txt.nc
      Enter passphrase:
      File segredo.txt.nc was decrypted.
    

7zip

O 7zip também permite encriptar arquivos com AES-256

julio@acer ~> 7z a -p -mem=AES256 -tzip segredo.7z segredo.txt

  7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
  p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
  Scanning

  Creating archive segredo.7z

  Enter password (will not be echoed) :
  Verify password (will not be echoed) :
  Compressing  segredo.txt

  Everything is Ok
julio@acer ~> 7z l -slt segredo.7z | grep Method
  Method = AES-256 Deflate

Repare que apesar dos algoritmos serem os mesmos, existem diferenças nas implementações, o que faz com que um arquivo encriptado usando o OpenSSL não será decriptado usando o GPG, por exemplo.

Quebra de senhas

Existem alguns programas para descobrir a senha de arquivos usando ataques de dicionário, força bruta.

Posso recomendar o John the Ripper e o Ophcrack.

Já esqueci (mais de uma vez) a senha de arquivos criptografados, mas por sorte sabia mais ou menos qual era o padrão das senhas e fui capaz de criar dicionários para tentar quebrá-las.

Um desses casos foi uma imagem de disco sparsebundle do macOS.

Primeiro eu precisei extrair o hash de forma que o John the Ripper conseguisse atacar:

$ dmg2john segredo.sparseimage > segredo.txt

Depois precisava criar um dicionário. Eu saiba que:

  • Se a senha começar com um número, ele é 5, 7, 123 ou 321
  • Palavra1, Palavra2 ou Palavra3 aparecem na senha
  • O final é sempre -A, -B ou -C

Um jeito simples de criar um dicionário com todas as possibilidades de senhas que obedecem esses critérios é usando Perl:

perl -lwe "print for glob '{5,7,123,321,}{Palavra1,Palavra2,Palavra3}-{A,B,C}'" > wordlist.txt

Depois basta deixar o JTR fazer o ataque de dicionário:

john --fork=4 --wordlist=wordlist.txt segredo.txt

E verificar se ele conseguiu descobrir a senha:

$ john --show segredo.txt
  segredo.sparseimage:123Palavra2-C::::segredo.sparseimage

  1 password hash cracked, 0 left

VeraCrypt

(Trecho adicionado em 26 de janeiro de 2019)

O VeraCrypt é um fork do descontinuado TrueCrypt e é minha ferramenta favorita para encriptar discos que preciso acessar a partir do Linux, Windows e macOS.

Ele pode criptografar uma partição inteira ou criar, em um único arquivo, um container criptografado contendo um sistema de arquivos.

É possível escolher entre AES, Serpent, Twofish, Camellia, Kuznyechik ou uma combinação desses algoritmos. Ele também conta com várias funções hash como SHA-256, SHA-512, Streebog e Whirlpool.

Outro recurso interessante do VeraCrypt são os hidden volumes, ou seja, volumes escondidos no final de outros volumes.
Todo volume possui espaço para dois cabeçalhos. Se a senha inserida for do primeiro, então o volume externo é descriptografado; se a senha for do segundo, então o volume escondido que será descriptografado.
Isso permite a chamada negação plausível, pois é impossível provar a existência de um volume escondido.

Criar um novo volume é bastante intuitivo.
Minha recomendação é utilizar NTFS se o disco for utilizado no Windows, pois NTFS é o único sistema de arquivos suportado que possui journaling. Se journaling não for necessário, recomendo o exFAT.

Para montar um volume criptografado no macOS:

/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --keyfiles="" --pim="0" --protect-hidden="no" /dev/disk3s5 /Volumes/Dev

Para desmontar:

$ /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --dismount /dev/disk3s5

Julio Batista Silva
Julio Batista Silva
Engenheiro de Dados

Eu sou um engenheiro de computação apaixonado por ciência, tecnologia, fotografia e idiomas. Atualmente trabalhando como Engenheiro de Dados na Alemanha.

comments powered by Disqus