CRIPTOGRAFIA EM PYTHON
Adicionado em 11/05/2023
Apresento uma aplicação simples de criptografia que escrevi em Python. A aplicação está dividida em quatro arquivos. É importante lembrar que o código foi criado com intenção meramente didática, não recomendo usá-lo para criptografar conteúdos sensíveis e importantes.
Você pode fazer o download do executável criado através do exemplo abaixo clicando aqui (executável contém ads):
No arquivo main.py temos:
Esse código Python é um exemplo de um programa de criptografia simples. Vou explicar a implementação a seguir.
A primeira linha importa o módulo sys, que fornece acesso a algumas variáveis e funções utilizadas ou mantidas pelo interpretador Python.
A segunda linha importa o módulo core, que contém as funções principais do programa de criptografia.
A terceira linha importa o módulo getpass, que é usado para ocultar a entrada da senha do usuário.
A quarta linha importa a função print do módulo rich e renomeia-a como rprint. O módulo rich é uma biblioteca de formatação de texto para melhorar a aparência da saída no console.
Em seguida, definimos a função main(), que será a função principal do programa.
A função main() exibe uma mensagem de boas-vindas ao usuário e pergunta se ele já tem uma chave e senha.
Se o usuário responder "n" (ou seja, não tem uma chave e senha), o programa chama a função core.criar_chave() para criar uma nova chave. Se a criação for bem-sucedida, a chave é exibida em verde usando a função rprint(), caso contrário, a mensagem de erro é exibida em vermelho e o programa é encerrado.
Se o usuário responder "s" (ou seja, tem uma chave e senha), o programa pergunta se ele deseja criar um texto criptografado ou ler um texto criptografado.
Se o usuário escolher criar um texto criptografado, o programa solicita ao usuário que insira o texto a ser criptografado, o nome do arquivo para salvar o texto criptografado, o nome da chave e a senha. Em seguida, o programa chama a função core.cria_cripto() para criptografar o texto usando a chave e a senha fornecidas. O texto criptografado é exibido em verde usando a função rprint().
Se o usuário escolher ler um texto criptografado, o programa solicita ao usuário que insira o nome do arquivo contendo o texto criptografado, o nome da chave e a senha. Em seguida, o programa chama a função core.le_cripto() para descriptografar o texto usando a chave e a senha fornecidas. O texto descriptografado é exibido em azul usando a função rprint().
Se o usuário fornecer um comando inválido, uma mensagem de erro é exibida em vermelho.
Se o usuário responder "q" (ou seja, deseja sair), o programa é encerrado usando sys.exit().
No final do código, a estrutura if __name__ == '__main__': garante que o bloco de código dentro dele seja executado apenas quando o arquivo main.py for executado diretamente (não quando for importado como um módulo). Dentro dessa estrutura, temos um loop while True: que chama repetidamente a função main().
Arquivo core.py:
O arquivo core.py contém as principais funções de criptografia utilizadas pelo programa.
A função criar_chave() solicita ao usuário o nome da chave a ser criada, uma nova senha e a confirmação da senha. Se a confirmação corresponder à senha fornecida, a função gera um valor aleatório de sal, armazena-o juntamente com o hash da senha em um arquivo de chave ({nome}.key), e retorna uma mensagem de sucesso indicando que a chave e a senha foram criadas com sucesso. Caso contrário, retorna uma mensagem de erro indicando que a senha não confere.
A função get_salt(file_name, pswd) recebe o nome de um arquivo de chave e a senha do usuário. Ela lê o arquivo de chave, verifica se o hash da senha fornecida corresponde ao armazenado no arquivo, e retorna o valor do sal como bytes se a verificação for bem-sucedida.
A função get_key(salt, pswd) recebe o sal como bytes e a senha do usuário. Ela utiliza o algoritmo de derivação de chave PBKDF2HMAC com SHA256 para derivar uma chave de 32 bytes a partir da senha e do sal. A chave resultante é retornada como uma string codificada em base64.
A função cria_cripto(text, file_name, key) recebe um texto, o nome do arquivo de saída e a chave. Ela utiliza a classe Fernet do módulo cryptography para criar um objeto de criptografia com a chave fornecida. O texto é convertido para bytes, criptografado e salvo no arquivo de saída como dados binários. Em seguida, retorna uma mensagem de sucesso indicando que o arquivo foi criado com sucesso.
A função le_cripto(file_name, key) recebe o nome do arquivo contendo dados criptografados e a chave. Ela lê o arquivo binário, cria um objeto de criptografia Fernet com a chave fornecida, descriptografa os dados e retorna o texto descriptografado como uma string.
Além disso, o código importa outros módulos e arquivos auxiliares:
O módulo base64 é importado para realizar a codificação em base64 da chave.
O módulo os é importado para gerar valores aleatórios de sal usando a função os.urandom().
O módulo cryptography.fernet é importado para utilizar a classe Fernet que implementa a criptografia simétrica.
O módulo cryptography.hazmat.primitives é importado para utilizar funções criptográficas, como o algoritmo de hash SHA256.
O módulo cryptography.hazmat.primitives.kdf.pbkdf2 é importado para realizar a derivação de chave usando PBKDF2HMAC.
O módulo converter é importado para converter entre diferentes formatos de dados, como converter o sal entre string e bytes.
O módulo hash é importado para realizar operações de hash, como a criação e verificação de hashes de senhas.
Arquivo hash.py:
O arquivo hash.py contém duas funções relacionadas à operação de hash.
A função create_hash(string) recebe uma string como entrada e retorna o hash SHA256 dessa string. Ela utiliza a biblioteca hashlib para criar um objeto sha256 que representa o algoritmo SHA256 de hashing. Em seguida, a função atualiza o objeto sha256 com a string codificada em UTF-8 e obtém o valor do hash em formato hexadecimal através do método hexdigest(). Esse valor do hash é retornado pela função.
A função check_hash(pswd, hash) recebe uma senha em formato de string (pswd) e um hash em formato de string (hash). Ela chama a função create_hash(pswd) para calcular o hash da senha fornecida e, em seguida, verifica se o hash calculado é igual ao hash fornecido. Se forem iguais, a função retorna True, indicando que a verificação de hash é bem-sucedida. Caso contrário, retorna False, indicando que a verificação falhou.
Essas funções são utilizadas no arquivo core.py para criar e verificar hashes de senha ao criar uma nova chave e ao acessar a chave existente.
Arquivo converter.py:
O arquivo converter.py contém duas funções que são responsáveis por converter o valor do sal entre diferentes formatos. Aqui está a explicação de cada função:
A função salt_to_bytes(salt_string) recebe uma string representando o valor do sal em formato hexadecimal e retorna o valor do sal como bytes. Ela utiliza o módulo codecs para decodificar a string hexadecimal em bytes usando o método decode(). O valor do sal em bytes é retornado pela função.
A função salt_to_string(salt_bytes) recebe o valor do sal como bytes e retorna a representação hexadecimal do sal como uma string. Ela utiliza o módulo codecs para codificar os bytes do sal em uma string hexadecimal usando o método encode(). A string hexadecimal do sal é retornada pela função.
Essas funções são utilizadas no arquivo core.py para converter o valor do sal entre string e bytes, pois a biblioteca cryptography que é usada para a criptografia e derivação de chave geralmente requer o valor do sal como bytes.
Usuário: Qual é a sua opinião geral sobre esta aplicação?
Como modelo de linguagem AI, não tenho opiniões pessoais. No entanto, posso fornecer uma avaliação geral sobre a aplicação com base nas informações fornecidas.
A aplicação parece ser um programa de criptografia simples, onde os usuários podem criar uma chave de criptografia, criptografar e descriptografar textos usando essa chave. A implementação faz uso das bibliotecas cryptography e hashlib para realizar as operações de criptografia e hashing.
Algumas observações sobre a implementação:
O uso da biblioteca cryptography é uma boa escolha, pois ela fornece recursos robustos para a criptografia simétrica e derivação de chave.
A implementação utiliza o algoritmo de hashing SHA256 para criar e verificar hashes de senha. É uma escolha comum e amplamente aceita em termos de segurança.
A utilização de um valor de sal aleatório para a derivação de chave é uma prática recomendada, pois aumenta a segurança dos dados criptografados.
O código parece estar estruturado de forma modular, com funções separadas para diferentes tarefas, o que facilita a manutenção e compreensão do código.
No entanto, como esta é apenas uma análise superficial com base no código fornecido, é importante realizar uma análise de segurança mais abrangente para garantir que a aplicação atenda aos requisitos de segurança adequados. Além disso, é sempre recomendável realizar testes e validações adicionais para garantir o correto funcionamento da aplicação em diferentes cenários.
Lembre-se de que a segurança é um assunto crítico e complexo, e é importante seguir as melhores práticas e padrões estabelecidos ao lidar com dados sensíveis e informações criptografadas.
Como havíamos mostrado no exemplo anterior (Advinhar números em python ), você pode executar o código abrindo o promp de comando e digitando python main.py (ou python seguido do endereço do diretório do arquivo seguido de main.py). Veja figura abaixo:
Após adicionar o texto, informar sua chave e senha, o arquivo com sua chave (e.g. chave.key) e o arquivo com o texto encriptado (texto.enc) serão criados.
Ao abrir o seu texto encriptado, você verá o seu texto em formato de hash.
Para descriptograr seu arquivo, você deve rodar novamente o seu arquivo main.py, e utilizar a opção de ler o arquivo. Após fornecer sua chave e senha você poderá ler o texto que estava criptografado.
Nota do criador:
Lembre-se sempre que, para criptografar ou descriptografar um arquivo de texto, você terá que informar o nome da chave (que é o arquivo .key originado quando você escolhe criar uma chave para usos posteriores; este arquivo deve estar na pasta de trabalho escolhida para a aplicação) e a senha escolhida para aquela chave.
Além disso, não esqueça de instalar as bibliotecas cryptography e rich.
Para isso, você pode utilizar os comandos pip install cryptography e pip install rich.