##Determinação das Chaves Pública e Privada:
##
## -> p,q dois números primos.
## <- (e,n) e (d,n), as chaves públicas e privadas.
function chaves (p, q)
  n = p*q;
  fi = (p-1)*(q-1);
  e = 2;
  k = 0;
  do
    e = e+1;
  until (gcd(fi,e) == 1)
  achou = false;
  while (!achou)
    d = (1 + (k * fi))/e;
    if ( d == round(d))
      achou = true;
    else
      k = k+1;
    endif
  endwhile
  printf("\n A chave pública é (%d, %d). \n", e, n);
  printf("\n A chave privada é (%d, %d). \n\n", d, n);
endfunction

##Cifrar a Mensagem Digital Original:
##
## -> (e,n), chave pública
##    m, mensagem a cifrar (vector de inteiros)
## <- x, mensagem cifrada (vector de inteiros)
function x=cifrar(e, n, m)
  t=columns(m);
  for i=1:t
    x(i) = mod((m(i))^e, n);
  endfor
endfunction

##Decifrar a Mensagem Cifrada:
##
## -> (d,n), chave pública
##    c, mensagem a decifrar (vector de inteiros)
## <- modl, mensagem decifrada (vector de inteiros)
function modl = decifrar(d, n, c)
  t=columns(c);
  for i=1:t
    modl(i) = 1;
    j=1;
    while (j <= d)
      modl(i) = mod((c(i))*modl(i), n);
      j = j+1;
    endwhile
  endfor
endfunction


##----------------------------------------------
##Conversão da Mensagem Original em Números:
##
## -> texto, string (caracteres ASCII entre ' ' e '~')
## <- y, vector de inteiros (' '=0, ...)
##
function y = digitos(texto)
  t = columns(texto);
  s = toascii (texto);
  for i = 1:t
    y(i) = s(i)-toascii(' ');
  endfor
endfunction


##-----------------------------------------------------
##Recuperação da Mensagem Original em Letras:
##
## -> num, vector de inteiros na gama 0 a 95
## <- y, vector de caracteres (' '=0, ... )
function y=texto(num)	
  t = columns(num);
  for i = 1:t
    y(i) = char(num(i)+32);
  endfor
endfunction


## Exemplo de utilização:
##
## Mensagem original
##   octave:1> Mp="Cuidado que os vizinhos podem estar a ouvir :)"
## Determinação dos números primos (programa externo)
##   p=13,q=23
## Determinação das chaves Pública e Privada
##   octave:2> chaves (13,23);
##   A chave pública é (5, 299).
##   A chave privada é (53, 299).
## Converter a mensagem num vector de inteiros
##   octave:3> Md=digitos(MP)
## Cifrar a mensagem
##   octave:4> Mc=cifrar(5,299,Md)
##   Mc= [133,167,242,22,195,22,157,0,87,167,23,0,157,291,0,21,242,129,
##       242,169,128,157,291,0,97,157,22,23,246,0,23,291,145,195,257,0,
##       195,0,157,167,21,242,257,0,13,146]
##   esta seria a informação que seria enviada através da rede.
## Decifrar a mensagem
##   octave:5> Mdd=decifrar(53,299,Mc)
## Voltar a converter a mensagem para caracteres
##   octave:6> texto(Mdd)


