Fórum Criptografia de Senhas!#@amp;*$¨@ #174406

11/08/2003

0

Pessoal é o seguinte, eu tenho o seguinte códido para criptografar as senhas do meu projeto:


//Criptografa e Descriptografa Textos (Senhas).

function TF_CadLogin.Encrypt( Senha:String ): String;
Const
Chave : String = ´Jesus´;
Var
x,y : Integer;
NovaSenha : String;
begin
for x := 1 to Length( Chave ) do begin
NovaSenha := ´´;
for y := 1 to Length( Senha ) do
NovaSenha := NovaSenha + chr( (Ord(Chave[x]) xor Ord(Senha[y])));
Senha := NovaSenha;
end;
result := Senha;
DBEdit2.Text := Result;
end;



Este código esta funcionando legal, só que eu preciso saber como Descriptografar esta senha, qndo quiser fazer uma consulta de login e senha por ex.
Alguem pode me dizer como ficaria este código? :?:


Helbert

Helbert

Responder

Posts

12/08/2003

Skaarj

Cara, estou lhe enviando o algoritmo PES [Pascal] de criptografia.. Estou sem Delphi aqui, mas vou verificar sua duvida.

{ LISTAGEM DO PROGRAMA }


{$A+,B-,D+,E-,F-,G+,I+,L+,N-,O-,R-,S-,V+,X-}
{$M 10000,0,30000}
PROGRAM METODO_PES;
  { Este programa implementa a funcao PES (proposta por Lai & Massey
    em 1990), para criptografacao e decriptografacao de dados.  Esta
    funcao foi implementada em modo CBC (Chaining Block Cipher).
    Autor: Glauber Cintra - 19Out1993
    Disciplina: Introducao a Criptologia - IME-USP }

USES CRT,DOS,ROTTELA1;       { a unit ROTTELA1 contem rotinas para
                               manipulacao de janelas }
TYPE TIPO=1..2;
     VETOR=ARRAY [1..8] OF WORD;

     BLOCO=ARRAY [1..4] OF WORD;   { Tipo do bloco submetido ao PES }

     BLOCOAUX=RECORD CASE TIPO OF
                     1:(CODIGO:BLOCO);
                     2:(BYTE:ARRAY [1..8] OF BYTE);
              END;

     KEY=RECORD CASE TIPO OF                        { Tipo da CHAVE }
                1:(SENHA:STRING[16]);
                2:(SUBKEY:RECORD LIXO:CHAR;
                                 NUM:VETOR;
                          END);
         END;
     ARQ=FILE OF BLOCO; {Tipo do arquivo criptografado/decriptografado}

     VETOR_CHAVES=ARRAY [1..9,1..6] OF WORD;     { Matriz contendo as
                                        as subchaves usadas pelo PES }

VAR OPCAO,TECLA : CHAR;                       { Variaveis auxiliares }
    ARQENTRADA,                                 { Arquivo de entrada }
    ARQSAIDA : ARQ;                                { Arquivo de saida}
    CHAVE:KEY;                                    { Chave para o PES }
    TELA_INICIAL,TELA:PONT_TELA; {Variaveis p/ utilizacao de janelas }
    ARQAUXE,ARQAUXS : FILE OF BYTE;
    POSX,POSY : BYTE;


FUNCTION REPLICATE(LETRA:CHAR;VEZES:BYTE):STRING;
  { Devolve uma string contendo VEZES copias de LETRA }
  VAR CADEIA:STRING;  I:BYTE;
  BEGIN
  CADEIA:=´´;
  FOR I:=1 TO VEZES DO CADEIA:=CADEIA+LETRA;
  REPLICATE:=CADEIA
  END; { Replicate }


FUNCTION TEMPO:LONGINT;
  { Devolve o horario corrente convertido em centesimos }
  VAR HORA,MINUTO,SEGUNDO,CENTESIMO : WORD;
  BEGIN
  GETTIME(HORA,MINUTO,SEGUNDO,CENTESIMO);
  TEMPO:=CENTESIMO+SEGUNDO*100+LONGINT(MINUTO)*6000+LONGINT(HORA)*360000;
  END; { Tempo }


PROCEDURE GERA_CHAVES(CHAVE:KEY;VAR CHAVES_GERADAS:VETOR_CHAVES);
  { Devolve as subchaves usadas no PES ou na INVERSA dos PES }
  VAR I,J,K:BYTE;
      CHAVES_AUX:VETOR_CHAVES;


  PROCEDURE ROTACIONA_CHAVE_ESQ(VAR CHAVE:KEY);
    { Faz um shift-left-circular de 25 posicoes na CHAVE }
    VAR I,AUX1,AUX2:WORD;
    BEGIN
    AUX1:=(CHAVE.SUBKEY.NUM[8] SHL 9)+(CHAVE.SUBKEY.NUM[1] SHR 7);
    AUX2:=(CHAVE.SUBKEY.NUM[1] SHL 9)+(CHAVE.SUBKEY.NUM[2] SHR 7);
    FOR I:=1 TO 8 DO
      IF I<7 THEN
        CHAVE.SUBKEY.NUM[I]:=(CHAVE.SUBKEY.NUM[I+1] SHL 9)
                            +(CHAVE.SUBKEY.NUM[I+2] SHR 7)
      ELSE
        IF I=7 THEN
          CHAVE.SUBKEY.NUM[I]:=AUX1
        ELSE
          CHAVE.SUBKEY.NUM[I]:=AUX2;
    END; { Rotaciona_Chave_Esq }

  FUNCTION INV_MULT(CHAVE:WORD):WORD;
    { Calcula a inversa multiplicativa modulo 65537 de CHAVE
      usando o Algoritmo de Euclides }
    VAR G1,G2,G3,V1,V2,V3,X,Y:LONGINT;
    BEGIN
    G1:=65537;G2:=CHAVE;
    V1:=0;V2:=1;
    WHILE G2<>0 DO
      BEGIN
      Y:=G1 DIV G2;
      G3:=G1-(Y*G2);
      V3:=V1-(Y*V2);
      G1:=G2;G2:=G3;
      V1:=V2;V2:=V3
      END;
    X:=V1;
    IF X<0 THEN
      X:=X+65537;
    INV_MULT:=X
    END; { Inv_Mult }

  BEGIN
  K:=1;
  FOR I:=1 TO 7 DO
    BEGIN
    FOR J:=1 TO 8 DO
      BEGIN
      IF K<=52 THEN
        CHAVES_GERADAS[((K-1) DIV 6)+1][((K-1) MOD 6)+1]:=
                                       CHAVE.SUBKEY.NUM[J];
      INC(K)
      END;
    ROTACIONA_CHAVE_ESQ(CHAVE);
    END;

  { Calculando as subchaves para a Inversa do PES }

  IF OPCAO=´D´ THEN
    BEGIN
    CHAVES_AUX:=CHAVES_GERADAS;
    FOR I:=1 TO 9 DO
      BEGIN
      CHAVES_GERADAS[I][1]:=INV_MULT(CHAVES_AUX[10-I][1]);
      CHAVES_GERADAS[I][2]:=INV_MULT(CHAVES_AUX[10-I][2]);
      CHAVES_GERADAS[I][3]:=(NOT CHAVES_AUX[10-I][3])+1;   { Calcula a
                                         Inversa Aditiva modulo 65536 }
      CHAVES_GERADAS[I][4]:=(NOT CHAVES_AUX[10-I][4])+1;   { Calcula a
                                         Inversa Aditiva modulo 65536 }
      CHAVES_GERADAS[I][5]:=CHAVES_AUX[9-I][5];
      CHAVES_GERADAS[I][6]:=CHAVES_AUX[9-I][6]
      END;
    END;
  END; { Gera_Chaves }


PROCEDURE PES(MENSAGEM:BLOCO;VAR CODIGO:BLOCO;CHAVES:VETOR_CHAVES);
  { Devolve CODIGO que e´ a MENSAGEM depois de passar pela funcao PES }
  VAR I:BYTE;
      AUX:BLOCO;
      AUX1,AUX2:WORD;

  FUNCTION MULT_MODULO_65537(A,B:WORD):WORD;
    { Executa a multiplicacao modulo 65537 de A e B }
    VAR C,D:WORD;
    BEGIN
    C:=A*B;                                { C recebe A*B mod 65536 }
    D:=(LONGINT(A)*B SHR 16);              { D recebe A*B div 65536 }
    IF (A=0) AND (B=0) THEN
      MULT_MODULO_65537:=0
    ELSE
      IF A=0 THEN
        MULT_MODULO_65537:=65537-B
      ELSE
        IF B=0 THEN
          MULT_MODULO_65537:=65537-A
        ELSE
          IF C>=D THEN
            MULT_MODULO_65537:=C-D
          ELSE
            MULT_MODULO_65537:=C-D+65537
    END; { Mult_modulo_65537 }

  BEGIN
  FOR I:=1 TO 8 DO        { Rounds }
    BEGIN
    AUX[1]:=MULT_MODULO_65537(MENSAGEM[1],CHAVES[I][1]);
    AUX[2]:=MULT_MODULO_65537(MENSAGEM[2],CHAVES[I][2]);
    AUX[3]:=MENSAGEM[3]+CHAVES[I][3];
    AUX[4]:=MENSAGEM[4]+CHAVES[I][4];
    AUX1:=MULT_MODULO_65537(AUX[1] XOR AUX[3],CHAVES[I][5]);
    AUX2:=MULT_MODULO_65537((AUX[2] XOR AUX[4])+AUX1,CHAVES[I][6]);
    AUX1:=AUX1+AUX2;
    MENSAGEM[1]:=AUX2 XOR AUX[3];
    MENSAGEM[2]:=AUX1 XOR AUX[4];
    MENSAGEM[3]:=AUX2 XOR AUX[1];
    MENSAGEM[4]:=AUX1 XOR AUX[2]
    END;

  { Permutacao Final }

  CODIGO[1]:=MULT_MODULO_65537(MENSAGEM[1],CHAVES[9][1]);
  CODIGO[2]:=MULT_MODULO_65537(MENSAGEM[2],CHAVES[9][2]);
  CODIGO[3]:=MENSAGEM[3]+CHAVES[9][3];
  CODIGO[4]:=MENSAGEM[4]+CHAVES[9][4];
  END; { Pes }


PROCEDURE TRANSFORMA(VAR ARQENTRADA,ARQSAIDA:ARQ;CHAVE:KEY;OPCAO:CHAR;
                     TAMANHO:LONGINT);
  { Este procedimento le o ARQENTRADA em blocos de 64 bits, e submete
    estes bloco para o PES/Inversa do PES, guardando o resultado em
    ARQSAIDA }
  VAR MENSAGEM,CODIGO,MENSANTERIOR: BLOCO;
      CHAVES_GERADAS:VETOR_CHAVES;
      MENSAUX:BLOCOAUX;
      POSICAO:LONGINT;
      REG:BLOCO;
      I:BYTE;
  BEGIN
  IF OPCAO=´C´ THEN { Guarda o tamanho de ARQENTRADA na criptografacao }
    BEGIN
    REG[1]:=TAMANHO SHR 16;
    REG[2]:=TAMANHO;
    WRITE(ARQSAIDA,REG)
    END
  ELSE                { Le o tamanho de ARQENTRADA na decriptografacao }
    BEGIN
    READ(ARQENTRADA,REG);
    TAMANHO:=LONGINT(REG[1])*65536+REG[2];
    END;
  FOR I:=1 TO 4 DO            { Inicializa o primeiro bloco para o CBC }
    MENSANTERIOR[I]:=0;
  GERA_CHAVES(CHAVE,CHAVES_GERADAS);       { Gera as chaves para o PES }

  { Laco que para ler todo o ARQENTRADA }

  WHILE TAMANHO>0 DO
    BEGIN

    { Le um bloco de 64 bits }

    IF (TAMANHO<8) AND (OPCAO=´C´) THEN
      BEGIN
      POSICAO:=FILEPOS(ARQENTRADA)*8;
      CLOSE(ARQENTRADA);
      RESET(ARQAUXE);
      SEEK(ARQAUXE,POSICAO);
      FOR I:=1 TO TAMANHO DO
        READ(ARQAUXE,MENSAUX.BYTE[I]);
      MENSAGEM:=MENSAUX.CODIGO;
      CLOSE(ARQAUXE);
      RESET(ARQENTRADA)
      END
    ELSE
      READ(ARQENTRADA,MENSAGEM);

    { Na criptografacao faz um XOR da mensagem com o codigo anterior }

    IF OPCAO=´C´ THEN
      FOR I:=1 TO 4 DO
        MENSAGEM[I]:=MENSAGEM[I] XOR MENSANTERIOR[I];

    PES(MENSAGEM,CODIGO,CHAVES_GERADAS);   { Submete MENSAGEM ao PES }


    IF OPCAO=´C´ THEN                  { Atualiza o bloco para o CBC }
      MENSANTERIOR:=CODIGO
    ELSE    { Na decriptografacao faz um XOR do CODIGO com a mensagem
              da iteracao anterior, e atualiza o bloco para o CBC    }
      BEGIN
      FOR I:=1 TO 4 DO
        CODIGO[I]:=CODIGO[I] XOR MENSANTERIOR[I];
      MENSANTERIOR:=MENSAGEM
      END;

    { Grava o resultado do PES em ARQSAIDA }

    IF (TAMANHO<8) AND (OPCAO=´D´) THEN
      BEGIN
      CLOSE(ARQSAIDA);
      RESET(ARQAUXS);
      SEEK(ARQAUXS,FILESIZE(ARQAUXS));
      MENSAUX.CODIGO:=CODIGO;
      FOR I:=1 TO TAMANHO DO
        WRITE(ARQAUXS,MENSAUX.BYTE[I]);
      CLOSE(ARQAUXS);
      RESET(ARQSAIDA)
      END
    ELSE
      WRITE(ARQSAIDA,CODIGO);
    DEC(TAMANHO,8)
    END
  END; { Transforma }


PROCEDURE PROCESSA(OPCAO:CHAR);
  { Le o nome do arquivo de entrada e do arquivo de saida e a chave,
    e os submete ao procedimento TRANSFORMA. Depois, se solicitado,
    apaga o arquivo de entrada }
  VAR ARQE,ARQS,ESPACO,SENHA:STRING;
      INICIO,FIM,TAMANHO:LONGINT;
      APAGA:CHAR;
      I,X:BYTE;
      ZERO:BLOCO;

 BEGIN

  { Criacao da Tela }

  JANELA(14,19,17,1,24,80,3,60,15,7);
  IF OPCAO=´C´ THEN
    BEGIN
    GOTOXY(33,18);
    WRITELN(´CRIPTOGRAFACAO´)
    END
  ELSE
    BEGIN
    GOTOXY(32,18);
    WRITELN(´DECRIPTOGRAFACAO´)
    END;
  GOTOXY(3,19);
  WRITE(´Arquivo Origem :´);
  GOTOXY(3,20);
  WRITE(´Arquivo Destino:´);
  GOTOXY(3,21);
  WRITE(´Deseja deletar o Arquivo Origem (S/N): ´);
  GOTOXY(20,19);
  READLN(ARQE);                         { Lendo o arquivo de entrada }
  IF ARQE<>´´ THEN
    BEGIN
    {$I-}
    ASSIGN(ARQENTRADA,ARQE);          
    ASSIGN(ARQAUXE,ARQE);
    RESET(ARQAUXE);                   { Abertura do arquivo de entrada }

    IF IORESULT=0 THEN { Verifica se abertura de ARQE foi bem sucedida }
      BEGIN
      GOTOXY(20,20);
      READLN(ARQS);                         { Lendo o arquivo de saida }

      IF (FSEARCH(ARQS,´´)<>´´) THEN     { Verifica se ARQS ja´ existe }
        BEGIN
        GOTOXY(3,22);
        WRITE(7´O arquivo ´,arqs,´ ja existe. Deseja escrever ´,
               ´por cima (S/N):´);
        X:=WHEREX;
        REPEAT
          GOTOXY(X,22);
          TECLA:=UPCASE(READKEY);
          WRITE(TECLA)
        UNTIL (TECLA=´S´) OR (TECLA=´N´);
        GOTOXY(3,22);
        WRITE(REPLICATE(´ ´,76))
        END
      ELSE
        TECLA:=´S´;
      TAMANHO:=FILESIZE(ARQAUXE);
      CLOSE(ARQAUXE);
      RESET(ARQENTRADA);
      IF TECLA=´S´ THEN
        BEGIN
        ASSIGN(ARQSAIDA,ARQS);
        ASSIGN(ARQAUXS,ARQS);
        REWRITE(ARQSAIDA)                { Abertura do arquivo de saida }
        END;

      { Verifica se abertura de ARQS foi bem sucedida }

      IF (IORESULT=0) AND (ARQS<>´´) AND (TECLA=´S´) THEN
      
        BEGIN

        REPEAT { Pergunta se o usuario deseja apagar o arquivo de entrada }
          GOTOXY(42,21);
          APAGA:=UPCASE(READKEY);
          WRITE(APAGA)
        UNTIL (APAGA=´S´) OR (APAGA=´N´);

        GOTOXY(3,22);
        WRITE(´Digite a Chave (16 posicoes): ´);

        REPEAT                                            { Le a CHAVE }
          GOTOXY(33,22);
          WRITE(REPLICATE(´ ´,45));
          GOTOXY(33,22);
          READLN(SENHA);
        UNTIL LENGTH(SENHA)=16;
        CHAVE.SENHA:=SENHA;

        GOTOXY(3,23);
        WRITE(´Aguarde...´);
        INICIO:=TEMPO;

        TRANSFORMA(ARQENTRADA,ARQSAIDA,CHAVE,OPCAO,TAMANHO);

        FIM:=TEMPO;

        { Calcula o tempo gasto }

        WRITE(´    Tempo gasto: ´,(FIM-INICIO) DIV 100,
              ´ Segundos. Aperte qualquer tecla...´);

        { Apaga o arquivo de entrada, se solicitado }

        IF APAGA=´S´ THEN
          BEGIN
          TAMANHO:=FILESIZE(ARQENTRADA);
          CLOSE(ARQENTRADA);
          REWRITE(ARQENTRADA);
          FOR I:=1 TO TAMANHO DO
            WRITE(ARQENTRADA,ZERO);
          CLOSE(ARQENTRADA);
          CLOSE(ARQSAIDA);
          SWAPVECTORS;
          EXEC(GETENV(´COMSPEC´),´/C DEL ´+ARQE);
          SWAPVECTORS
          END
        ELSE
          BEGIN
          CLOSE(ARQENTRADA);
          CLOSE(ARQSAIDA);
          END;
        TECLA:=READKEY
        END
      ELSE
        BEGIN
        IF IORESULT<>0 THEN
          BEGIN
          GOTOXY(3,23);
          WRITE(7´Nao foi possivel abrir o arquivo ´,arqs,
                ´. Aperte qualquer tecla...´);
          TECLA:=READKEY
          END;
        CLOSE(ARQENTRADA);
        END;
      END
    ELSE
      BEGIN
      GOTOXY(3,23);
      WRITE(7´Nao foi possivel abrir o arquivo ´,arqe,
            ´. Aperte qualquer tecla...´);
      TECLA:=READKEY
      END;
    {$I+};
    END;
  FJANELA(14,19,17,1,24,80,3,60,14,1)
  END; { Processa }


PROCEDURE IMPRIMA;
  { Imprime ou mostra na tela um arquivo, em modo ASCII ou HEXADECIMAL }
  VAR COLUNA : BYTE;
      DIGITOS:STRING;
      ARQE,ARQS:STRING;
      I,TAMANHO:LONGINT;
      LETRA,DISP,MODO:CHAR;
      ARQENTRADA,ARQSAIDA:TEXT;

  FUNCTION HEXA(LETRA:CHAR):STRING;
    { Retorna o valor de LETRA em HEXADECIMAL }
    VAR VALOR:BYTE;
    BEGIN
    VALOR:=ORD(LETRA);
    HEXA:=DIGITOS[(VALOR SHR 4)+1]+DIGITOS[(VALOR MOD 16)+1]
    END; { Hexa }

  BEGIN

  { Criacao da Tela }

  JANELA(14,19,17,1,24,80,3,60,15,7);
  GOTOXY(3,19);
  WRITE(´Arquivo a ser Impresso:´);
  GOTOXY(27,19);
  READLN(ARQE);                         { Le o arquivo a ser impresso }
  {$I-}
  ASSIGN(ARQENTRADA,ARQE);
  RESET(ARQENTRADA);                  { Abertura do arquivo de entrada }
  DIGITOS:=´0123456789ABCDEF´;

  IF IORESULT<>0 THEN  { Verifica se abertura de ARQE foi bem sucedida }
    BEGIN
    GOTOXY(3,21);
    WRITE(7´O arquivo ´,arqe,´ nao pode ser aberto. ´);
    WRITE(´Tecle algo para continuar...´);
    TECLA:=READKEY
    END
  ELSE
    BEGIN
    GOTOXY(3,20);
    WRITE(´Tela ou Impressora (T/I):´);
    GOTOXY(3,21);
    WRITE(´ASCII ou HEXADECIMAL (A/H):´);

    REPEAT                  { Determina se arquivo vai ser impresso ou
                                                      mostrado na tela }
      GOTOXY(29,20);
      DISP:=UPCASE(READKEY);
      WRITE(DISP)
    UNTIL (DISP=´T´) OR (DISP=´I´);

    REPEAT                 { Determina o tipo da Saida (ASCII ou HEXA) }
      GOTOXY(31,21);
      MODO:=UPCASE(READKEY);
      WRITE(MODO)
    UNTIL (MODO=´A´) OR (MODO=´H´);

    IF DISP=´T´ THEN
      ARQS:=´CON´
    ELSE
      ARQS:=´PRN´;
    ASSIGN(ARQSAIDA,ARQS);
    REWRITE(ARQSAIDA);                 { Abertura do arquivo de saida }
    {$I+}
    IF IORESULT<>0 THEN { Verifica se abertura de ARQS foi bem sucedida }
      BEGIN
      GOTOXY(3,21);
      WRITE(7´O arquivo ´,arqs,´ nao pode ser aberto. ´);
      WRITE(´Tecle algo para continuar...´);
      TECLA:=READKEY
      END
    ELSE
      BEGIN
      IF DISP=´T´ THEN
        BEGIN
        SALVA_TELA(TELA);
        TEXTCOLOR(7);TEXTBACKGROUND(0);
        CLRSCR
        END
      ELSE
        BEGIN
        GOTOXY(3,22);
        WRITE(´Aguarde impressao...´)
        END;
      CLOSE(ARQENTRADA);
      ASSIGN(ARQAUXE,ARQE);
      RESET(ARQAUXE);
      TAMANHO:=FILESIZE(ARQAUXE);
      CLOSE(ARQAUXE);
      RESET(ARQENTRADA);
      COLUNA:=1;

      FOR I:=1 TO TAMANHO DO        { Laco para impressao do arquivo }
        BEGIN
        READ(ARQENTRADA,LETRA);
        IF MODO=´A´ THEN
          WRITE(ARQSAIDA,LETRA)
        ELSE
          BEGIN
          WRITE(ARQSAIDA,HEXA(LETRA),32);
          IF COLUNA>72 THEN
            BEGIN
            COLUNA:=1;
            WRITE(ARQSAIDA,1310)
            END
          ELSE
            INC(COLUNA,3);
          END;
        IF (DISP=´T´) AND (WHEREY=24) THEN
          BEGIN
          GOTOXY(1,25);
          WRITE(´Aperte qualquer tecla para continuar...´);
          TECLA:=READKEY;
          CLRSCR
          END;
        END;
      CLOSE(ARQSAIDA)
      END;
    IF DISP=´T´ THEN
      BEGIN
      GOTOXY(1,25);
      WRITE(´Final da impressao. Aperte qualquer tecla para continuar...´);
      TECLA:=READKEY;
      RESTAURA_TELA(TELA);
      DISPOSE(TELA)
      END;
    CLOSE(ARQENTRADA)
    END;
  {$I+}
  FJANELA(14,19,17,1,24,80,3,60,14,1)
  END; { Imprima }


{ Programa Principal }

BEGIN

{ Tela de Abertura }

POSX:=WHEREX;
POSY:=WHEREY;
SALVA_TELA(TELA_INICIAL);
CLRSCR;
JANELA(1,1,1,10,7,71,1,60,15,3);
GOTOXY(25,2);
WRITE(´CRIPTOGRAFADOR-DECRIPTOGRAFADOR´);
GOTOXY(12,3);
WRITE(´Utilizando a funcao PES [proposta por Lai & Massey - 1990]´);
GOTOXY(23,4);
WRITE(´(Em modo CBC - Chaining Block Cipher)´);
GOTOXY(19,5);
WRITE(´Implementado por: Glauber Cintra - 19Out1993´);
GOTOXY(18,6);
WRITE(´Disciplina: Introducao a Criptologia - IME-USP´);
JANELA(1,80,9,29,15,50,2,60,14,1);
GOTOXY(31,10);
WRITE(´C - Criptografar´);
GOTOXY(31,11);
WRITE(´D - Decriptografar´);
GOTOXY(31,12);
WRITE(´I - Imprimir ´);
GOTOXY(31,13);
WRITE(´S - Saida´);
GOTOXY(36,14);
WRITELN(´Opcao: ´);

{ Laco do menu principal }

REPEAT
  GOTOXY(43,14);
  OPCAO:=UPCASE(READKEY);
  WRITE(OPCAO);
  IF (OPCAO=´C´) OR (OPCAO=´D´) THEN
    PROCESSA(OPCAO)
    ELSE
    IF OPCAO=´I´ THEN
      IMPRIMA;
UNTIL (OPCAO=´S´) OR (OPCAO=27);

FJANELA(1,80,9,29,15,50,2,60,15,3);
FJANELA(1,1,1,10,7,71,1,60,7,0);
RESTAURA_TELA(TELA_INICIAL);
GOTOXY(POSX,POSY)
END. { Pes }



Responder

Gostei + 0

12/08/2003

Helbert

Valeu SkaaRJ, fico grato


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar