none
Ajuda Criptografia C# RRS feed

  • Pergunta

  • Olá. Sou novata em CC e estou desenvolvendo um algoritmo de criptografia de APS. O método que escolhi para criptografar é usando o a Cifra de César pra encriptar e desencriptar. Só que só tá fazendo um dos 2 por vez na tela do prompt:

    A intenção é colocar uma mensagem(Ex: socorro), aí clico "enter" pra gerar o output, daí clico "enter" de novo pra decriptografar esse output e aí re-aparece em baixo a mensagem original(Ex: socorro)! TUDO no mesmo Prompt!

    ^

    Como corrijo isso?

    Segue o código:

    using System;
    namespace Cifra_Cesar
    {
        class Program
        {
            static void Main(string[] args)
            {
                
               
                string palavra, encrypt = "";
    
    
                  Console.Write("Entre com a mensagem para ser criptografada: ");
    
    
                        palavra = Console.ReadLine().ToLower();
    
    
                        for (int i = 0; i < palavra.Length; i++)
                        {
    
                            int ASCII = (int)palavra[i];
    
    
                            int ASCIIC = ASCII + 10;
    
    
                            encrypt += Char.ConvertFromUtf32(ASCIIC);
                        }
    
    
                        Console.Write("Resultado: " + encrypt);
    
    
                        Console.Write("Pressione 'enter' para decriptografar");
                        palavra = Console.ReadLine().ToLower();
    
                        for (int i = 0; i < palavra.Length; i++)
                        {
    
                            int ASCII = (int)palavra[i];
    
    
                            int ASCIIC = ASCII - 10;
    
                            encrypt += Char.ConvertFromUtf32(ASCIIC);
    
                        }
    
                        Console.Write("Resultado: " + encrypt);
    
                        Console.ReadKey();
    
                       
    
                }
    
                
    
            }
    
        }
    
    
    

    EDIT (mudei a codificação após algum feedback).













    • Editado Luísa314 quarta-feira, 25 de novembro de 2015 01:58
    terça-feira, 24 de novembro de 2015 18:04

Respostas

  • Bom, daí é um problema de lógica.

    Estamos tentando resolver o problema de "não fechar o prompt até a opção 0 ser digitada".

    Ou seja: tu executas o programa, digita a opção 1 e digita "socorro"; o programa gera um output da mensagem criptografada.

    Aparece o menu novamente, tu digitas 2 e insere o output da opção 1 (a mensagem "socorro" criptografada), o programa gera o output "socorro".

    Tu digitas 0, o programa fecha.

    Recomendo a colocar os valores do ASCII para "+1" e "-1" para ser mais fácil identificar o problema e debugar a solução para verificar o que pode estar acontecendo.


    Att., Rafael Simor

    • Marcado como Resposta Luísa314 quarta-feira, 25 de novembro de 2015 17:30
    terça-feira, 24 de novembro de 2015 19:16
  • Bom, então tire toda a estrutura do menu, do switch e o do/while.

    "Junte" o código do case 1 e case 2, sendo que no case 2 tu mudas essa linha:

    for (int i = 0; i < palavra.Length; i++)
    // Para:
    for (int i = 0; i < encrypt.Length; i++)

    E faça os ajustes necessários de variáveis e sintaxe.

    Edit: recomendo testar do jeito que se encontra antes de alterar a estrutura. Criptografe pela opção 1, anote o valor e coloque este mesmo valor, utilizando a opção 2, só para ver se o programa está funcionando como deve.


    Att., Rafael Simor


    • Editado SimorC terça-feira, 24 de novembro de 2015 19:35
    • Marcado como Resposta Luísa314 quarta-feira, 25 de novembro de 2015 17:30
    terça-feira, 24 de novembro de 2015 19:34

Todas as Respostas

  • Boa tarde.

    Tente:

    do
    {
        string palavra, encrypt = "";
        // resto do código
    
    } while (opcao != 0);


    Att., Rafael Simor

    terça-feira, 24 de novembro de 2015 18:33
  • Resto deixa tudo igual, ou muda alguma coisa?
    terça-feira, 24 de novembro de 2015 18:41
  • tudo igual... voce só vai colocar um laço de repetiçao onde o criterio de saida é opçao 0

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 24 de novembro de 2015 18:51
    Moderador
  • tudo igual... voce só vai colocar um laço de repetiçao onde o criterio de saida é opçao 0

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Dá dando este erro na variável "opcao"

    Error    1    The name 'opcao' does not exist in the current context

    O que faço pra arrumar?

    Segue o código modificado:

     static void Main(string[] args)
            {
    
                do
                {
                string palavra, encrypt = "";
    
    
                Console.Write("|---------------------------------|\n");
                Console.Write("| 1 - Criptografar um mensagem    |\n");
                Console.Write("| 2 - Decriptografar uma mensagem |\n");
                Console.Write("| 0 - Sair                        |\n");
                Console.Write("|---------------------------------|\n");
                Console.Write(" Escolha a opçao: ");
    
    
                int opcao = int.Parse(Console.ReadLine());
    
    
                switch (opcao)
                {
    
    
                    case 1: Console.Write("Entre com a mensagem para ser criptografada: ");
    
    
                        palavra = Console.ReadLine().ToLower();
    
    
                        for (int i = 0; i < palavra.Length; i++)
                        {
    
                            int ASCII = (int)palavra[i];
    
    
                            int ASCIIC = ASCII + 10;
    
    
                            encrypt += Char.ConvertFromUtf32(ASCIIC);
                        }
    
    
                        Console.Write("Resultado: " + encrypt);
    
    
                        Console.ReadKey();
    
    
                        break;
    
    
                    case 2: Console.Write("Entre com a mensagem para ser decriptografada: ");
    
                        palavra = Console.ReadLine().ToLower();
    
                        for (int i = 0; i < palavra.Length; i++)
                        {
    
                            int ASCII = (int)palavra[i];
    
    
                            int ASCIIC = ASCII - 10;
    
                            encrypt += Char.ConvertFromUtf32(ASCIIC);
    
                        }
    
                        Console.Write("Resultado: " + encrypt);
    
                        Console.ReadKey();
    
                        break;
    
                }
                } while (opcao != 0);
    
            }
    
        }
    
    }
    



    • Editado Luísa314 terça-feira, 24 de novembro de 2015 18:57
    terça-feira, 24 de novembro de 2015 18:53
  • Antes do "do", coloque:

    int opcao = -1;

    E depois só tire o "int" antes do "opcao".


    Att., Rafael Simor

    terça-feira, 24 de novembro de 2015 18:57
  • Amigos, infelizmente ñ resolveu meu problema.

    Na verdade o que quero fazer é CRIPTOGRAFAR uma mensagem(Ex: Socorro!) e depois DECRIPTAR o resultado da criptografia pra que volte a aparecer a mensagem original(Socorro) no mesmo PROMPT!

    Acho que se eu colocar a mensagem e usar o comando "2", encripta a mensagem tbm :P


    • Editado Luísa314 terça-feira, 24 de novembro de 2015 19:12
    terça-feira, 24 de novembro de 2015 19:11
  • Bom, daí é um problema de lógica.

    Estamos tentando resolver o problema de "não fechar o prompt até a opção 0 ser digitada".

    Ou seja: tu executas o programa, digita a opção 1 e digita "socorro"; o programa gera um output da mensagem criptografada.

    Aparece o menu novamente, tu digitas 2 e insere o output da opção 1 (a mensagem "socorro" criptografada), o programa gera o output "socorro".

    Tu digitas 0, o programa fecha.

    Recomendo a colocar os valores do ASCII para "+1" e "-1" para ser mais fácil identificar o problema e debugar a solução para verificar o que pode estar acontecendo.


    Att., Rafael Simor

    • Marcado como Resposta Luísa314 quarta-feira, 25 de novembro de 2015 17:30
    terça-feira, 24 de novembro de 2015 19:16
  • Bom, daí é um problema de lógica.

    Estamos tentando resolver o problema de "não fechar o prompt até a opção 0 ser digitada".

    Ou seja: tu executas o programa, digita a opção 1 e digita "socorro"; o programa gera um output da mensagem criptografada.

    Aparece o menu novamente, tu digitas 2 e insere o output da opção 1 (a mensagem "socorro" criptografada), o programa gera o output "socorro".

    Tu digitas 0, o programa fecha.

    Recomendo a colocar os valores do ASCII para "+1" e "-1" para ser mais fácil identificar o problema e debugar a solução para verificar o que pode estar acontecendo.


    Att., Rafael Simor

    Sim, realmente. Creio que o problema ñ é na codificação, e sim na estrutura do programa, acho que nem preciso desse menu.

    O que quero é colocar uma mensagem(Ex: socorro), aí clico "enter" pra gerar o output, daí clico "enter" de novo pra decriptografar esse output e aí re-aparece em baixo a mensagem original(Ex: socorro)!

    ^

    Como faço isso? To mais perdida aqui que cego em tiroteio :P

    terça-feira, 24 de novembro de 2015 19:29
  • Bom, então tire toda a estrutura do menu, do switch e o do/while.

    "Junte" o código do case 1 e case 2, sendo que no case 2 tu mudas essa linha:

    for (int i = 0; i < palavra.Length; i++)
    // Para:
    for (int i = 0; i < encrypt.Length; i++)

    E faça os ajustes necessários de variáveis e sintaxe.

    Edit: recomendo testar do jeito que se encontra antes de alterar a estrutura. Criptografe pela opção 1, anote o valor e coloque este mesmo valor, utilizando a opção 2, só para ver se o programa está funcionando como deve.


    Att., Rafael Simor


    • Editado SimorC terça-feira, 24 de novembro de 2015 19:35
    • Marcado como Resposta Luísa314 quarta-feira, 25 de novembro de 2015 17:30
    terça-feira, 24 de novembro de 2015 19:34

  • Edit: recomendo testar do jeito que se encontra antes de alterar a estrutura. Criptografe pela opção 1, anote o valor e coloque este mesmo valor, utilizando a opção 2, só para ver se o programa está funcionando como deve.


    Att., Rafael Simor


    Isso aí já tá certinho, testei aqui. Vo tentar esses ajustes que vc postou agora.
    terça-feira, 24 de novembro de 2015 19:47
  • Bom, então tire toda a estrutura do menu, do switch e o do/while.

    "Junte" o código do case 1 e case 2, sendo que no case 2 tu mudas essa linha:

    for (int i = 0; i < palavra.Length; i++)
    // Para:
    for (int i = 0; i < encrypt.Length; i++)

    E faça os ajustes necessários de variáveis e sintaxe.

    Edit: recomendo testar do jeito que se encontra antes de alterar a estrutura. Criptografe pela opção 1, anote o valor e coloque este mesmo valor, utilizando a opção 2, só para ver se o programa está funcionando como deve.


    Att., Rafael Simor


    Fiz os ajustes que vc falou. A criptografia faz certinho, mas o prompt fecha sozinho na hora de DECRIPTAR a mensagem!

    • Editado Luísa314 quarta-feira, 25 de novembro de 2015 01:11
    quarta-feira, 25 de novembro de 2015 00:41
  • O que posso fazer pra AJUSTAR a decriptografia?
    • Editado Luísa314 quarta-feira, 25 de novembro de 2015 02:18
    quarta-feira, 25 de novembro de 2015 01:11
  • Coloque seu código para analisarmos.

    Att., Rafael Simor

    quarta-feira, 25 de novembro de 2015 13:01
  • Coloque seu código para analisarmos.

    Att., Rafael Simor

    Consegui! A única coisa que falta é diferenciar maiúscula de minúscula no resultado. Ex: se eu pôr a mensagem "Socorro" com s maiúscula, no resultado sai tudo minúsculo, mas a codificação tá certa. Como posso ajustar?

    Segue o código:

    using System;
    namespace Cifra_Cesar
    {
        class Program
        {
            static void Main(string[] args)
            {
    
    
                string palavra, encrypt = "";
    
    
                Console.Write("\nEntre com a mensagem a ser criptografada: ");
    
    
                palavra = Console.ReadLine().ToLower();
    
    
                for (int i = 0; i < palavra.Length; i++)
                {
    
                    int ASCII = (int)palavra[i];
    
    
                    int ASCIIC = ASCII + 7;
    
    
                    encrypt += Char.ConvertFromUtf32(ASCIIC);
                }
    
    
                Console.WriteLine("\nResultado: " + encrypt);
    
                encrypt = "";
                for (int i = 0; i < palavra.Length; i++)
                {
    
                    int ASCII = (int)palavra[i];
    
    
                    int ASCIIC = ASCII;
    
                    encrypt += Char.ConvertFromUtf32(ASCIIC);
    
                }
                Console.Write("\nPressione 'enter' para decriptografar");
                palavra = Console.ReadLine().ToLower();
                Console.Write("\nResultado: {0}", encrypt);
    
    
                Console.ReadKey();
    
    
    
            }
    
    
    
        }
    
    }
    


    quarta-feira, 25 de novembro de 2015 17:17
  • Jurei que havia postado:

    Tire o .ToLower() desta linha:

     palavra = Console.ReadLine().ToLower();

    Att., Rafael Simor

    quarta-feira, 25 de novembro de 2015 17:19