Auxílio em variante da cifra de Cesar

Bom dia,

Preciso fazer o seguinte: Fornecer uma palavar para servir de “chave”, para fazer a cifragem, por exemplo se for fornecida a palavra JAVA

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z --> alfabeto normal
J A V B C D E F G H I K L M N O P Q R S T U W X Y Z --> alfabeto usado para cifrar um texto por exemplo (onde tiver A será substituido por “J” onde tiver B, por “B”, onde for C, trocar por “V”, onde for D, trocar por “B”…)

As letras não podem repetir-se, para não dar problema de 2 letras terem a mesma representação, se a palavra chave for ARARA o que será inserido no inicio do alfabeto “normal” para formar o alfabeto usado para cifragem seria apenas “AR”…

A implementação do método que faz isso acho que ja tenho na cabeça (com 2 arrays), se tiver maneira mais fácil me avisem :). O que preciso de de um auxílio com Sockets, pois o trabalho tem que ser da seguinte forma…

Tenho que fazer, pelo que entendi, um aplicativo cliente e um servidor, onde o aplicativo “cliente” deverá obter uma chave para cifragem junto ao servidor, que sera usada como parâmetro para cifragem, depois o servidor tem que poder gerar uma palavra chave de até 26 caracteres que o “cliente precisa orter pela porta 6666 (tcp)”, daí o cliente tem que verificar se a palavra satisfaz as exigencias e “avisar” o servidor se a palçavra foi aceita ou não. Quando a chave for aceita, deve ser mostrada na tela do cliente o alfabeto para cifragem(exemplo que coloquei acima), por exemplo CASA cifrada com o alfabeto de exemplo acima ficaria VJRJ.

O aplicativo cliente deverá fazer a cifragem de um arquivo texto, e enviá-lo cifrado para o servidor por meio da porta 6667(udp).
O módulo servidor deverá realizar a exibição do texto cifrado e abaixo do texto decifrado.

Me dêem, por gentileza, algumas dicas de como proceder, pois estas conexões eu nunca fiz e to meio perdido… So sei que tem que usar Sockets, pois o enunciado indicou…

Grato,
Jeferson Neves

Sua dúvida é de Java avançado. Tópico movido.

Além disso, ficou muito ampla. Tente começar o trabalho, e então perguntar coisas mais específicas. Mas para toda aplicação de rede, o primeiro passo é imaginar como será o protocolo de sua aplicação.

Tente organiza-lo em camadas funcionais.
Por exemplo, os primeiros bytes de seu pacote podem conter informações físicas: tamanho do pacote, checksum.
Os bytes seguintes são específicos de cada mensagem. E estarão criptografados por seu algorítmo.

[quote=ViniGodoy]Sua dúvida é de Java avançado. Tópico movido.

Além disso, ficou muito ampla. Tente começar o trabalho, e então perguntar coisas mais específicas. Mas para toda aplicação de rede, o primeiro passo é imaginar como será o protocolo de sua aplicação.

Tente organiza-lo em camadas funcionais.
Por exemplo, os primeiros bytes de seu pacote podem conter informações físicas: tamanho do pacote, checksum.
Os bytes seguintes são específicos de cada mensagem. E estarão criptografados por seu algorítmo.[/quote]

Boa tarde ViniGodoy,

Bom, comecei o trabalho fazendo o que eu sabia, ja fiz os algoritmos pra criptografar e descriptografar, fiz a interface gráfica, fiz o tratamento pras chaves digitadas, agora vem a parte mais difícil pra mim, que é a conxão pela rede, pra teste fiz tudo em um só programa(tatamento de chave, criptografia, descriptografia…), mas terei que separar, pois um(cliente) terá que conectar ao servidor(outra aplicação que ficará em outra maquina na rede) solicitar uma chave e criptografar um texto que eu vou ler no cliente(ja ta certinho no cliente carregando o arquivo com o texto), depois posso poder mandar o texto criptografado para o servidor e descriptografar lá.

Outra coisa, como não foi especificado tamanho mínimo de pacote, nem validações adicionais, queria saber a maneira mais fácil para fazer isso(pra saber o que ler, pois li muita coisa e não me ajudou muito, pois vi diversas maneiras de fazer, mas na verdade não entendi muito bem nenhuma…), se puder me dar uma dica de que mais especificamente preciso dar uma estudada (por exemplo quais métodos irei precisar para fazer isso…) eu agradeço.

ps. não sei se muda algo, mas uma exigência é que a chave deverá ser obtida pelo cliente unicamente por meio da porta 6666/tcp e enviar o arquivo
cifrado para o servidor unicamente por meio da porta 6667/udp.

Grato,
Jeferson Neves

Comunicar por TCP é bem fácil. Mas você terá que primeiro pensar num protocolo entre sua aplicação e o servidor.
Comece enumerando todas as mensagens que eles terão que trocar entre si.

Por exemplo, quando o cliente se conecta no servidor, quem faz a primeira comunicação? É o cliente que já sai mandando dados para o servidor? O servidor aceita qualquer coisa?

Em seguida, como o cliente envia a chave para o servidor? Como o servidor saberá que aquela mensagem tem uma chave? E até onde ler os dados da chave?

Lembre-se que protocolos de rede geralmente são binários. Então, você terá que organizar as mensagens de modo que fique fácil ler esses bytes da rede (considere incluir tamanhos dos dados, contadores, coisas que facilitem a leitura).

No caso do arquivo de texto via UDP, você tem os seguintes problemas:
a) O UDP não garante a ordenação dos pacotes. Você terá que incluir em seu protocolo informação de ordem;
b) O UDP não garante que o pacote chegue. Você terá que incluir no seu protocolo mensagens de retransmissão;
c) O UDP tem limite no tamanho do pacote. Costuma a ser grande, mas isso pode exigir que você quebre textos muito grandes em várias mensagens. Você terá que incluir no seu protocolo a informação se o texto foi quebrado ou não.

Comece tentando fazer uma aplicação trivial em sockets. Só enviar um dado de um lado para o outro. Aí tudo vai começar a ficar mais claro.

[quote=ViniGodoy]Comunicar por TCP é bem fácil. Mas você terá que primeiro pensar num protocolo entre sua aplicação e o servidor.
Comece enumerando todas as mensagens que eles terão que trocar entre si.

Por exemplo, quando o cliente se conecta no servidor, quem faz a primeira comunicação? É o cliente que já sai mandando dados para o servidor? O servidor aceita qualquer coisa?

Em seguida, como o cliente envia a chave para o servidor? Como o servidor saberá que aquela mensagem tem uma chave? E até onde ler os dados da chave?

Lembre-se que protocolos de rede geralmente são binários. Então, você terá que organizar as mensagens de modo que fique fácil ler esses bytes da rede (considere incluir tamanhos dos dados, contadores, coisas que facilitem a leitura).

No caso do arquivo de texto via UDP, você tem os seguintes problemas:
a) O UDP não garante a ordenação dos pacotes. Você terá que incluir em seu protocolo informação de ordem;
b) O UDP não garante que o pacote chegue. Você terá que incluir no seu protocolo mensagens de retransmissão;
c) O UDP tem limite no tamanho do pacote. Costuma a ser grande, mas isso pode exigir que você quebre textos muito grandes em várias mensagens. Você terá que incluir no seu protocolo a informação se o texto foi quebrado ou não.

Comece tentando fazer uma aplicação trivial em sockets. Só enviar um dado de um lado para o outro. Aí tudo vai começar a ficar mais claro.

[/quote]

Boa tarde,

 Dei uma pesquisada e após fazer alguns testes consegui realizar o envio do arquivo do cliente pro server, mas não sei se to fazendo da maneira correta, estou utilizando (Socket, ServerSocket, FileOutputStream, ObjectInputStream, ObjectoutputStream...) mas da maneira que to fazendo eu tenho que clicar em um botão no server e ficar aguardando o envio do arquivo (neste período, até o recebimento do mesmo o server fica "pendurado") dai no client eu importo um arquivo e clico num botão que envia, daí a transferência ocorre e "libera" o server... To testando local mesmo(localhost, só altero "manualmente" a porta, 6666 ou 6667), usando 2 projetos diferentes(um pro cliente e um pro server) e o arquivo que estava no diretório do client foi pro diretório do server... O que quero saber é se tem como fazer para ficar "escutando" para enviar o arquivo sem "pendurar" o que vai receber o arquivo... pois to com problema agora no seguinte:

Tenho que conectar no server(via client) e solicitar uma chave para usar na cifragem, o server envia a chave e eu valido, se for válida eu tenho que responder para o server que é valida e fazer algumas coisas e cifrar meu testo que depois será enviado… Se não for válida tenho que avisasr também, mas dai não pego ela… Da maneira que to fazendo posso fazer isso mas com a intervensão do usuário, pois teria que clicar em um botão no client para esperar o envio do server(deixando pendurado o client) e depois no server enviar a chave que vai chegar no client e posso validar no moment que chegar, depois teria que clicar um botão no server para ele aguardar o envio da resposta do client… mas isso com certeza não deve ser feito assim… :frowning: Vou falzar com o profº hoje eu acho e vou tirar algumas dúvidas, mas acredito que as dúvidas de java ele não tire, pois a cadeira e de redes e ele falou que poderia usar qualquer linguagem, so teria que fazer o que ele quer.

Desculpem o tamanho do texto, mas tentei explicar bem :).

Grato.

Está quase lá:

  1. O problema da interface congelar é pq o loop principal do seu server está na mesma thread do Swing. Mova-o para uma thread separada.
  2. Tente não usar o ObjectOuputStream. No lugar, use o DataOutputStream e monte você mesmo seu protocolo (você deve saber que informação está enviando, e em que ordem, para poder ler do outro lado).

No mais, é bem por aí mesmo.

[quote=ViniGodoy]Está quase lá:

  1. O problema da interface congelar é pq o loop principal do seu server está na mesma thread do Swing. Mova-o para uma thread separada.
  2. Tente não usar o ObjectOuputStream. No lugar, use o DataOutputStream e monte você mesmo seu protocolo (você deve saber que informação está enviando, e em que ordem, para poder ler do outro lado).

No mais, é bem por aí mesmo.[/quote]

Boa tarde,

 Obrigado pelo auxílio, na verdade até entendo o conceito de threads, mas não sei utilizar muito bem, entendi que se eu tiver, por exemplo, 2 threads executando para escutar em lugares diferentes(em 2 campos de texto por exemplo) poderei trabalhar com elas sem "trancar" o programa principal, mas não sei bem como fazer... Eu teria que sobrescrever o metodo RUN() ou START() de threads, e minha classe extender Threads??? To meio na dúvida ainda... se puder me dar uma direção acho que eu me "acho" mais rápido ;)

Abraço