Criptografia, assinatura digital, proteção de dados são termos bastante comuns entre os profissionais de TI.
Já escrevi muitas publicações, artigos e livros interessantes sobre esses tópicos. Depois de ler um deles, decidi tentar minha mão no treino. E assim nasceu o projeto, que será discutido abaixo.
Resumo da aplicação
O aplicativo SecureDialogues adiciona um nível de criptografia às mensagens transmitidas por serviços como o Gmail . O próprio aplicativo executa autorização para os serviços configurados usando o protocolo OAuth2 , recebe e envia mensagens. Na sua essência, é um mensageiro regular que fornece proteção criptográfica às mensagens, a menos que um dos vários serviços de terceiros possa ser usado para transferência.
Os dados no disco rígido são criptografados usando o algoritmo AES com uma chave de 256 bits, extraída da senha inserida na inicialização, o RSA é usado para assinatura digital. As mensagens do usuário são codificadas com uma chave de sessão AES de 256 bits.
Os códigos-fonte estão disponíveis no link , wiki do projeto .
O lançamento do aplicativo no contêiner do docker está disponível, mais no link .
Objetivo da criação
O aplicativo foi criado para uma finalidade muito específica - foi interessante para mim trabalhar com criptografia em um projeto prático. E não em algo simples, como "insira o texto aqui, mas aqui leve a mensagem codificada", mas de forma que exista uma assinatura digital , criptografia assimétrica , chaves de sessão e outras coisas interessantes. Portanto, o projeto messenger foi escolhido.
Na ausência de toda a infraestrutura necessária para o envio de mensagens, essa função é delegada a serviços existentes, como o Gmail ou o VKontakte .
Descrição da interface
Quando você inicia, o aplicativo solicita que você digite uma senha:

Essa senha é usada para criptografar dados armazenados no disco rígido, como: chaves RSA , tokens de autorização para OAuth2 , dados sobre serviços e contatos.
Mensagens e informações sobre caixas de diálogo não são salvas , ou seja, no final do aplicativo, os dados sobre mensagens recebidas e caixas de diálogo abertas são perdidos.
Em lançamentos subsequentes, o aplicativo também solicita uma senha para descriptografar e baixar os dados salvos anteriormente.
Vista da janela principal do aplicativo:

Antes de poder enviar a primeira mensagem, você deve concluir duas etapas:
- Configure uma conexão com o serviço para enviar mensagens ( mais no wiki );
- Adicionar pessoa de contato ( mais no wiki );
A coisa mais importante, pela qual o contato é adicionado antes do início da troca, é a chave pública . Cada mensagem enviada entre usuários deve ser assinada pelo remetente. Se o destinatário não conseguir verificar a assinatura digital usando a chave pública, essa mensagem será descartada.
Além disso, a chave pública é usada para criptografar a chave da sessão.
Após a conclusão de todas as etapas preliminares, você pode iniciar o diálogo. Para fazer isso, existe um botão correspondente na janela principal do aplicativo ( mais no wiki ). Ao criar uma conversa, é gerada uma chave de sessão que criptografa todas as mensagens nessa conversa.
Todas as caixas de diálogo são exibidas na janela principal à esquerda. Após o seu interlocutor confirmar a criação de um diálogo, você pode enviar e receber mensagens nele:

Para enviar ou ler mensagens na caixa de diálogo desejada, você precisa selecioná-la clicando no botão esquerdo do mouse.
As mensagens do usuário remoto são exibidas à esquerda e as suas à direita. Se a mensagem ainda não tiver sido entregue, ela será exibida em cinza:

O aplicativo classifica a lista de caixas de diálogo na seguinte ordem - na parte superior, haverá caixas de diálogo ativas para as quais o envio de mensagens é permitido, e na parte inferior haverá caixas fechadas. A ordem também é afetada pelo momento em que a caixa de diálogo é alterada. O diálogo ativo que a última mensagem recebida será acima de tudo, e o primeiro fechado será na parte inferior. Para cada caixa de diálogo, um indicador do número de mensagens não lidas é exibido, se houver:

O status do diálogo é destacado em cores:
- caixas de diálogo fechadas são vermelhas
- diálogos ativos são mostrados em verde , é possível que eles enviem mensagens
- diálogos em cinza estão sendo feitos.
Aqui está um exemplo de como é uma mensagem simples com texto hellow world! :

Troca de sinal
A troca de mensagens entre os interlocutores A e B consiste nas seguintes etapas:
- a parte A gera um comando para criar uma caixa de diálogo (
CREATE_DIALOG
) e a assina com sua chave privada; - a parte B solicita ao usuário o consentimento para criar um diálogo e, se o usuário concorda, são geradas uma chave de sessão T e uma sequência aleatória R , que são criptografadas individualmente com a chave pública A e colocadas no corpo da mensagem (
VERIFY_KEY
). A mensagem inteira é assinada com a chave privada B. - O lado A descriptografa a chave da sessão e a sequência aleatória, criptografa a sequência aleatória com a chave da sessão e adiciona o resultado ao
KEY_VERIFICATION
mensagem KEY_VERIFICATION
. Assina a mensagem inteira com sua chave privada. - o lado B descriptografa a sequência aleatória, verifique se o resultado corresponde à sequência R , se tudo estiver correto, a mensagem assinada
ACCEPT_DIALOG
, o que significa que o diálogo é estabelecido e é possível trocar mais mensagens.
O estabelecimento bem-sucedido do diálogo e a troca de sinais são mostrados na figura:

Desenvolvimento do projeto
No momento, o aplicativo já fornece recursos básicos para criptografia e autenticação de mensagens por meio de assinatura digital. Mas a lista de serviços suportados é extremamente pequena.
No futuro, está planejado aumentá-lo. O trabalho já está em andamento para incluir o VKontakte nele.
Também no projeto há um aumento no conteúdo de informações da interface do usuário, como adicionar um status para conectar-se a um serviço (ativo, erro de conexão etc.).
O algoritmo para verificar mensagens duplicadas não funciona da melhor maneira, está planejado para ser finalizado.