criptografia RSA

Delphi

06/05/2005

Alguém aí conhece o método RSA de criptografia? se conhecer ou já tiver implementado algo parecido, se puder me ajudar em descobrir como fazer esse código funcionar perfeitamente, eu ficaria muito agradecido! Em tempo de compilação dá um erro de ´Operator not applicable to this operand type´.

procedure TFormPrincipal.CriptografarExecute(Sender: TObject);
var
  p, q, n, z, d, e: Extended;
  i: Integer;
begin
  { 1. escolha dois números primos grandes. }

  p:=47;
  q:=59;

  { 2. calcula-se os ois valores com base nos números primos. }

  n:=p*q;
  z:=(p-1)*(q-1);

  { 3. escolhe-se um número primo em relação a z. }

  d:=157;

  { 4. cria-se a chave de criptografia utilizando a seguinte fórmula:
  (e*d) mod z = 1
  (e*157) mod 2668 = 1
  e = 17 }

  e:=17;

  { 5. Temos os valores das chaves públicas e privadas. Ambas as chaves são compostas por dois valores, v1 e v2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou a descriptografia.

  saída = estrada^v1 mod v2

  os valores de (e, n) formam a chave pública e (d, n) formam a chave privada, onde:

  v1 = e = 17
  v2 = n = 2773
  texto criptografado = texto original^e mod n }

  Edit2.Text:´´;
  for i:=1 to Length(Edit1.Text) do Edit2.Text:=Edit2.Text+IntToStr((Power(Ord(Edit1.Text[i]), e)) mod n));

end;
[/code]


Sabah

Sabah

Curtidas 0

Respostas

Marco Salles

Marco Salles

06/05/2005

Alguém aí conhece o método RSA de criptografia?


Eu num conheço não :cry:

:wink: Mas tento dar umas cacetadas no delphi

Em tempo de compilação dá um erro de ´Operator not applicable to this operand type´


O erro da porque voce aplica uma função [color=darkred:335129b105][b:335129b105]Mod[/b:335129b105][/color:335129b105] em dois numeros que não são do tipo inteiros..
((Power(Ord(Edit1.Text[i]), e)) Mod n

É O Mesmo que escrever 3.2 [color=darkred:335129b105][b:335129b105]Mod[/b:335129b105][/color:335129b105] 2.4 --->> Da o mesmo tipo de erro

Os operadores da Função [color=darkred:335129b105][b:335129b105]Mod[/b:335129b105][/color:335129b105] são dois tipos Inteiros

Voce tem duas opções para isto
1)Edit2.Text:=Edit2.Text+IntToStr((Power(Ord(Edit1.Text[i]), e)) mod n));  
Trocar para: --->>>
Edit2.Text:=Edit2.Text+FloatToStr(Trunc((Power(Ord(Edit1.Text[i]), e))) / Trunc(n));


2)Edit2.Text:=Edit2.Text+IntToStr((Power(Ord(Edit1.Text[i]), e)) mod n));  
Trocar para --->>>
Edit2.Text:=Edit2.Text+FloatToStr((Power(Ord(Edit1.Text[i]), e)) / n));
 


se puder me ajudar em descobrir como fazer esse código funcionar perfeitamente


Nenhuma das duas é garantia que seu código irá funcionar :cry: :cry:
Como eu disse , eu não conheço o Método :cry: :cry:

Falando em Método , onde arranjou esta Função , que dá este erro de compilação :?: :?: :?:


GOSTEI 0
Sabah

Sabah

06/05/2005

O método RSA de criptografia tá explicado nos comentários.

O erro aponta pra essa linha:

for i:=1 to Length(Edit1.Text) do Edit2.Text:=Edit2.Text+IntToStr((Power(Ord(Edit1.Text[i]), e)) mod n));


voltei a usar o tipo integer, já tentei mudar os tipos pra LongInt, LongWord, Int64... o erro continua o mesmo!!


GOSTEI 0
Sabah

Sabah

06/05/2005

usando esse código o erro em tempo de compilação é eliminado:

for i:=1 to Length(Edit1.Text) do Edit2.Text:=Edit2.Text+IntToStr(Trunc(Power(Ord(Edit1.Text[i]), e)) mod n);


mas... agora o erro é de ´Invalid floating point operation.´ quando o evento é chamado.


GOSTEI 0
Edilcimar

Edilcimar

06/05/2005

para cálculo rsa você só utiliza números inteiros, por que vc está utilizando números fracionários?


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

usando esse código o erro em tempo de compilação é eliminado: Código: for i:=1 to Length(Edit1.Text) do Edit2.Text:=Edit2.Text+IntToStr(Trunc(Power(Ord(Edit1.Text[i]), e)) mod n); mas... agora o erro é de ´Invalid floating point operation.´ quando o evento é chamado.


Claro , porque um dos operadores , no caspo específico e o [size=18:eeec198378][color=darkred:eeec198378][b:eeec198378]n[/b:eeec198378][/color:eeec198378][/size:eeec198378] não é do ipo Inteiro..

Mas olhe o que eu disse na mensagem anterior... Esta faltando o [b:eeec198378]Trunc(n)[/b:eeec198378]
Edit2.Text:=Edit2.Text+FloatToStr(Trunc((Power(Ord(Edit1.Text[i]), e))) Mod Trunc(n));


Observe tb a colocação do nosso amigo edicilmar:
para cálculo rsa você só utiliza números inteiros, por que vc está utilizando números fracionários?



GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

mas... agora o erro é de ´Invalid floating point operation.´ quando o evento é chamado.


Eu não tinha observado este detalhe... Pensei que voce na compilação...
[b:140d90e120]De fato , não se podia esperar outra coisa da expressão:[/b:140d90e120]
Trunc(Power(Ord(Edit1.Text[i]), e))...

Por exemplo:
Trunc(5,676767*10^28), dara o mesmo tipo de erro :cry:

O Problema esta no que o edicilmar disse:
para cálculo rsa você só utiliza números inteiros, por que vc está utilizando números fracionários?



GOSTEI 0
Martins

Martins

06/05/2005

Pode até ser que eu esteja enganado mas esse código não rodar como deveria, e terá q sofrer grandes modificações para funcionar como vc quer. Onde vc pegou esse código, quem o fez não testou.

Procure no Active Delphi por Criptografia RSA, vc vai encontrar alguma coisa lá.

Boa Sorte!!!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Eu fiquei um pouco sismado com isto....

Não sei se é isto que voce quer... Mas tente isto:

procedure TForm1.CriptografarExecute(Sender: TObject);
var
  p, q, n, z, d, e: Integer;
  i: Integer;
begin
  { 1. escolha dois números primos grandes. }

  p:=47;
  q:=59;

  { 2. calcula-se os ois valores com base nos números primos. }

  n:=p*q; 
  z:=(p-1)*(q-1);

  { 3. escolhe-se um número primo em relação a z. } 

  d:=157; 

  { 4. cria-se a chave de criptografia utilizando a seguinte fórmula: 
  (e*d) mod z = 1 
  (e*157) mod 2668 = 1 
  e = 17 } 

  e:=17;

  { 5. Temos os valores das chaves públicas e privadas. Ambas as chaves são compostas por dois valores, v1 e v2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou a descriptografia. 

  saída = estrada^v1 mod v2

  os valores de (e, n) formam a chave pública e (d, n) formam a chave privada, onde: 

  v1 = e = 17
  v2 = n = 2773 
  texto criptografado = texto original^e mod n }

  Edit2.Text:=´´;
  for i:=1 to Length(Edit1.Text) do
  Edit2.Text:=Edit2.Text+
  IntToStr(Trunc((Power(StrToInt(Edit1.Text[i]), e))) mod Trunc(n));
end;



GOSTEI 0
Sabah

Sabah

06/05/2005

o código agota está assim:

procedure TFormPrincipal.CriptografarExecute(Sender: TObject);
var
  p, q, n, z, d, e, x: Extended;
  i: Integer;
begin
  { 1. escolha dois números primos grandes. }

  p:=47;
  q:=59;

  { 2. calcula-se os ois valores com base nos números primos. }

  n:=p*q;
  z:=(p-1)*(q-1);

  { 3. escolhe-se um número primo em relação a z. }

  d:=157;

  { 4. cria-se a chave de criptografia utilizando a seguinte fórmula:
  (e*d) mod z = 1
  (e*157) mod 2668 = 1
  e = 17 }

  e:=17;

  { 5. Temos os valores das chaves públicas e privadas. Ambas as chaves são compostas por dois valores, v1 e v2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou a descriptografia.

  saída = estrada^v1 mod v2

  os valores de (e, n) formam a chave pública e (d, n) formam a chave privada, onde:

  v1 = e = 17
  v2 = n = 2773
  texto criptografado = texto original^e mod n }

  Edit2.Text:=´´;
  for i:=1 to Length(Edit1.text) do
  begin
    x:=(Power(Ord(Edit1.Text[i]), e));
    x:=(frac(x/n) * n);
    Edit2.Text:=Edit2.Text+FloatToStr(x)+´ ´;
  end;
end;


O algoritmo só usa números inteiros, eu sei, mas o maior intervalo de valores dos inteiro no delphi, usando Int64, não é suficiente para os cálculos. Uso o tipo Extended porque é o tipo de maior intervalo.

Esse algoritmo é o mesmo mostrado no artigo do Active Delphi.

Com essa última mudança no código, os erros desapareceram, no entando só tenho como retorno da entrada de qualquer caracter o valor zero. Alguém tem mais alguma idéia?

Grato pela ajuda!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Com essa última mudança no código, os erros desapareceram, no entando só tenho como retorno da entrada de qualquer caracter o valor zero.



Esta função [b:61ea752dbd]Frac[/b:61ea752dbd] Trunca o resutado da Divisão entre dois numeros Reais

:arrow: X:= Power(Ord(Edit1.Text[i]), e)); É um numero muito Grande

Voce tem certeza que a divisão desse numero [b:61ea752dbd]X Por n=2777 [/b:61ea752dbd]Dara Um Numero Com Fração...
Poe exemplo 3.234E20/2773 = 1.166245949302(E-3xE20) =
116624594302E8 --->>> que é um numero sem fração

é claro que a divisão de 3.23 por 2773 podem não ter fim... Mas ha um Truncamento natural da própio delphi.. Porque se trabalha com ordem de grandeza.. Estamos representando o numero anterior com 12 digitos
se fossemos representar o numero anterior com 13 digitos teriamos
116624594302E8 --->>> 1166245943023E7 , que em outras palavras é insignificante..

Eu acho que o Martins pode ter razão:
citação de Martins:
Pode até ser que eu esteja enganado mas esse código não rodar como deveria, e terá q sofrer grandes modificações para funcionar como vc quer.


No mais é minha opinião
:P :P :P


GOSTEI 0
Sabah

Sabah

06/05/2005

(x/n) pode ou não ser um número fracionário, uso esse artifício para substituir o operador MOD, já que não estou utilizando operandos do tipo Integer.

x:=(Power(Ord(Edit1.Text[i]), e));
x:=(frac(x/n) * n);


o valor da variável x só substitui o seguinte trecho de código:

Power(Ord(Edit1.Text[i]), e)) mod n


já pesquisei em muitos lugares sobre o algoritmo de criptografia RSA. Até agora encontrei sempre o mesmo, se alguém quiser tentar implementar também, o algoritmo é esse:

1. escolhem-se dois números primos grandes (P e Q).

2. calculma-se dois valores com base nos números primos escolhidos:
N = P*Q
Z = (P-1)*(Q-1)

3. escolhe-se um número primo em relação a Z, ou seja, sem relação de divisibilidade entre o número escolhido e Z. chamamos esse número de D.

4. cria-se a chave de criptografia (E) usando a seguinte fórmula: (E*D) mod Z = 1.

5. temos assim as chaves públicas e privadas. Ambas as chaves são compostas por dois valores, V1 e V2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou descriptografia:

(SAÍDA) = (ENTRADA)^V1 mod N

os valores de E e N formam a chave pública, D e N formam a chave privada, onde V1 = E, e V2 = N.

(TEXTO CRIPTOGRAFADO) = (TEXTO ORIGINAL)^E mod N
(TEXTO ORIGINAL) = (TEXTO CRIPTOGRAFADO)^D mod N


GOSTEI 0
Edilcimar

Edilcimar

06/05/2005

eu tenho um sistema para criptografia e não utilizo fração, eu sempre utilizo mod


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

citação de sabah
Com essa última mudança no código, os erros desapareceram, no entando só tenho como retorno da entrada de qualquer caracter o valor zero.


citação de sabah
(x/n) pode ou não ser um número fracionário,


Neste caso (x/n) [b:7add36789e]Não sera Fracionário[/b:7add36789e]...Olhe sua formula

x:=(Power(Ord(Edit1.Text[i]), e));


Veja , voce esta usando Ord(Edit1.Text[i]))--->>> Como o Menor Numero digitado no edit [b:7add36789e]sendo um [/b:7add36789e]o Ord(Edit1.Text[1]) Retorna 49, senão me engano... Como e = 17 voce tem [size=18:7add36789e][color=darkred:7add36789e][b:7add36789e]APROXIMADAMENTE[/b:7add36789e][/color:7add36789e][/size:7add36789e]

x:=49*49*49*49*49*49*49*49*49*49*49*49*49*49*49*49*49 --->>>
x:=(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)*(5x10)
x:=(5^4)*(5^4)*(5^4)*(5^4)*5*E17
X:=(1000)*(1000)*(1000)*(1000)*5*E17
X:=E3*E3*E3*E3*5*E17--->>>APROXIMADAMENTE 5*E29

Por outro lado

x/n = 5E29/2773=5E29/3E3 e um numero na ordem de E26

Conclusão ... o numero x/n tende a não ter Fração

citação de sabah
uso esse artifício para substituir o operador MOD, já que não estou utilizando operandos do tipo Integer.

Da para entender a sua intenção... Mas o compilador , não entende desta forma :cry: :cry: :cry:

Se ao inves do Ord voce usar o Proprio digito do edit.text[i] , voce melhora e muito esta interpretação do compilador

x:=(Power(strToInt(Edit1.Text[i]), e)); Porque agora [b:7add36789e]1 e 1 , 2 e 2 , 3 e 3 e assim vai ate chegar no 9[/b:7add36789e]

Acho que sua preocupação com o intervalo:
Citação de Sabad
usando Int64, não é suficiente para os cálculos

é que esta pecando...Poxa , voce tem muitas opções de entradas, e voce esta preocupado como o valor de x..
:arrow: Talves este valor seje o que memos conte nesta ccriptografia

Entendeu ou não o meu parecer. :?: :?: :?:
Sera que fui Claro :?: :?: :?:


GOSTEI 0
Sabah

Sabah

06/05/2005

Veja , voce esta usando Ord(Edit1.Text[i]))--->>> Como o Menor Numero digitado no edit sendo um o Ord(Edit1.Text[1]) Retorna 49, senão me engano... Como e = 17 voce tem APROXIMADAMENTE


A entrada no Edit1 é qualquer caracter da tabela ASCII, logo Ord(Edit1.text[i]) pode retornar um valor encontrado no intervalo de 0 a 255.

Acredito que você ainda não compreendeu o uso do trecho:

x:=(Power(Ord(Edit1.Text[i]), e));
x:=(frac(x/n) * n);


Ao fim desses comandos, a variável X terá o valor do resto da divisão: frac(x/n) retorna a parte fracionãria da divisão de X por N, frac(x/n)*n retorna o produto entre essa parte fracionária e o valor de N, ou seja, o resto da divisão, isto é, tem o mesmo efeito do operador MOD. Sendo ou não fracionário o quociente de X por N, eu terei o resultado desejado.

Da para entender a sua intenção... Mas o compilador , não entende desta forma


Isso eu realmente não entendi, como o compilador interpreta?!

Se ao inves do Ord voce usar o Proprio digito do edit.text[i] , voce melhora e muito esta interpretação do compilador


A intenção é criptografar o carater de entrada, não um número que vai entrar, por isso uso o Ord ao invés do próprio dígito do Edit1.Text[i].

Poxa , voce tem muitas opções de entradas, e voce esta preocupado como o valor de x..


O valor de X é muito importante pois é ele que vai receber o resultado dos cálculos do procedimento de criptografia, como por exemplo 255^17 = 8,1504777725345014342277786904144e+40, que não está dentro do intevalo dos Integer.

Se puder, tente implemetar esse algoritmo, ele é pequeno, pode encontrá-lo em há algumas postagens acima. Não tenho idéia por enquanto de como modificá-lo para funcionar da maneira que desejo. Se conseguir, por gentileza, poste-o aqui!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Citaçao de marco salles
Se ao inves do Ord voce usar o Proprio digito do edit.text[i] , voce melhora e muito esta interpretação do compilador


Citação de Sabah
A intenção é criptografar o carater de entrada, não um número que vai entrar, por isso uso o Ord ao invés do próprio dígito do Edit1.Text[i].


Isto voce tem toda razão.. Pensei que voce estava interresado so como numeros


Citacao de Sabah
O valor de X é muito importante pois é ele que vai receber o resultado dos cálculos do procedimento de criptografia, como por exemplo 255^17 = 8,1504777725345014342277786904144e+40, que não está dentro do intevalo dos Integer


Citacao de Marcus
Da para entender a sua intenção... Mas o compilador , não entende desta forma


O Compilador interpreta assim:
Showmessage(FloatToStr(Frac( 8.1504777725345014342277786904144e+40/2773)));


Da zero... Isto é Frac(x/n)=o , logo Frac(x/n)*n = 0

Se puder, tente implemetar esse algoritmo, ele é pequeno, pode encontrá-lo em há algumas postagens acima.


Ja implementei.. e so funcionou com valores de e Menores.. Neste caso
Frac(x/n) é <> 0

Então a unica saida que vejo é mudar o valor do e.. Diminuin-do
Escolhendo p e q menores


GOSTEI 0
Sabah

Sabah

06/05/2005

o jeito é realmente usar valores de P e Q menores, o problema é o produto de P e Q é que determina o número máximo de caracteres criptografados de forma bijetora.

Obrigado Marco e todos que tentaram ajudar!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

:arrow: Ha Poucos dias atrás , foi lançado uma questão , que pareci ate o momento de dificil resolução

o amigo sabah Precisava achar o[b:3332ce4768] Resto [/b:3332ce4768]de uma divisão de um numero [b:3332ce4768]Grande[/b:3332ce4768] por 2773

Tentou-se alguns recursos , mas não obteve sucesso

Ao ler na net , sobre a teoria das Congruencias , me veio uma idéia , que talvez Possa resolver definitivamente a questão

[b:3332ce4768]A idéia é saber por exemplo qual o Resto da divisão De 255^17 por 2773[/b:3332ce4768] :?: :?: :?:

[color=darkred:3332ce4768][b:3332ce4768]Dado o Numero a^e :arrow: , a rotina abaixo , calcula o Resto da divisão desse numero por n[/b:3332ce4768][/color:3332ce4768]

function RestoDivisaoDeNumerosExponenciais(a,e,n:Integer):Integer;
var
 i:Integer;
 Resto:Integer;
begin
// Queremos Saber a^e mod n Qual é o resto da divisão  ???
  if e > 0 Then
    begin
      i:=1;
      Resto:=a;
         While i <= (e+1) do
           begin
             if i >= (e-1) Then
               begin
                Resto:=Resto*a;
                Resto:=Resto mod n;
                Break;
               end;
             Resto:=Trunc(Power(Resto,2));
             Resto:=Resto mod n;
             i:=i*2;
          end;
    end
  else
    Resto:=n;
result:=Resto;
end;


Finalmente o Sabad , pode tentar implementar sua Função do Seguinte Modo

procedure TForm1.CriptografarExecute(Sender: TObject);
var
  p, q, n, z, d, e, x: integer;
  i: Integer;
begin
  { 1. escolha dois números primos grandes. }

  p:=47;
  q:=59;

  { 2. calcula-se os ois valores com base nos números primos. }

  n:=p*q;
  z:=(p-1)*(q-1);

  { 3. escolhe-se um número primo em relação a z. } 

  d:=157; 

  { 4. cria-se a chave de criptografia utilizando a seguinte fórmula: 
  (e*d) mod z = 1 
  (e*157) mod 2668 = 1
  e = 17 } 

  e:=17;

  { 5. Temos os valores das chaves públicas e privadas. Ambas as chaves são compostas por dois valores, v1 e v2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou a descriptografia. 

  saída = estrada^v1 mod v2 

  os valores de (e, n) formam a chave pública e (d, n) formam a chave privada, onde:

  v1 = e = 17 
  v2 = n = 2773
  texto criptografado = texto original^e mod n } 

  Edit2.Text:=´´;
  for i:=1 to Length(Edit1.text) do 
  begin
    x:=RestoDivisaoDeNumerosExponenciais(Ord(Edit1.Text[i]),e,n);
   // x:=(Power(Ord(Edit1.Text[i]), e));
   // x:=(frac(x/n) * n);
    Edit2.Text:=Edit2.Text+FloatToStr(x)+´ ´;
  end; 
end;


[color=darkred:3332ce4768][b:3332ce4768]Note aqui Sabah , que a definição de p, q, n, z, d, e, x: integer;[/b:3332ce4768][/color:3332ce4768]

Uso o tipo Extended porque é o tipo de maior intervalo.


Não é mais necessário , Porque o Problema inicial de calcular

Power(Ord(Edit1.Text[i]), e)) mod n));


[b:3332ce4768]e agora realizado dentro da função ... E Não se perde nada por isso[/b:3332ce4768]


T :arrow: alvez o Sabah , nen precise mais disso , ou ja tenha resolvido , ou talvez nen leia mais este tópico, mas eu quero deixar aqui registrado, como se calcula o Resto da divisão , de numeros Exponenciais Relativamente Grande...

:lol: Se alguem tiver alguma dúvida e quiser debater , sinta-se á vontade


GOSTEI 0
Sabah

Sabah

06/05/2005

Marco, obrigado novamente pela ajuda.

Utilizando os valores p = 47, q = 59, n = 2773, d = 157, e = 17, vamos a um teste...

criprografando um caracter ´A´, seu cóigo ASCII é 65.

Ao criptografarmos: RestoDivisaoDeNumerosExponenciais(Ord(´A´), e, n) = 332.

Ao descriptografarmos, temos: RestoDivisaoDeNumerosExponenciais(332, d, n) = 685.

Não entendo o que está errado. O algoritmo é exatamente esse, mas o valor retornado na descriptografia é 685, e o valor desejado nesse caso para ser descriptografado é 65, o código ASCII do caracter ´A´ que foi criptografado.

Marco, tem alguma idéia do que ainda esteja errado?!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Uma coisa e uma coisa outra coisa é outra coisa..
disse o Vanderlei Luxemburro

Amigo , a função que eu enviei é [b:1580c91277]estritamente[/b:1580c91277] para calcular o Resto de uma divisão de um numero muito grande por n.. :arrow: E isto, ela parece que faz .

Como eu disse , ela é baseada na teoria das congruencias

[color=darkred:1580c91277][b:1580c91277]Bem , vejamos o que voce quer fazer com ela[/b:1580c91277][/color:1580c91277]

seje x = a^e mod n

sera verdade que a:=x^d mod n

Pelo simples fato que (e*d)mod z = 1


:lol: :lol: :lol: Nossa , isto é incrível....

o que a função faz e dizer que o resto de
x:=65^17 mod 2773 é 332

e que o resto de

a:=332 ^157 mod 2773 é 685

[color=darkred:1580c91277][b:1580c91277]Vamos provar que a função esta certa.. Vamos calcular o resto de
x:=65^17 mod 2773 é 332 na mão[/b:1580c91277][/color:1580c91277]
Acompanhe

65^4 = 17850625 = 824 mod 2773
 :arrow:  :arrow: a passagem agora precisa conhecer a teoria
(65^4)^4 = resto mod 2773 
este valor resto pode ser obtido calculando o resto de 824^4
824^4 = 451008408576 = 901 mod 2773
 :arrow: Logo 
(65^4)^4=(65^16)=901 mod 2773
multiplicando ambos os lados po 65
65*(65^16)=65^17= Resto mod 2773
Novamente vamos calcular este resto , pelo valor de 901*65  :arrow: 
65*901 = 58565 = 332 mod 2773
 :arrow: logo (65^17)= 332 mod 2773 


Bem , voce ainda pode ter dúvida... Vamos calcular uma coisa mais simples
33 = 3 mod 5
 17 = 2 mod 5
Qual é o resto da divisão de 33*17 ???
Facil , basta calcular o Resto da divisão de 2*3 Por 5
2*3=6 mod 5 = 1
Veja se confere ==>>> 33*17 = 561 = 112*5 + 1


Logo é irreduntante a prova e contrapova

[color=darkred:1580c91277][b:1580c91277]Quero deixar uma obsrvação... Apenas uma pequena correção na função apresentada anteriormente[/b:1580c91277][/color:1580c91277]

function RestoDivisaoDeNumerosExponenciais(a,e,n:Integer):Integer;
var
 i:Integer;
 Resto:Integer;
begin
// Queremos Saber a^e mod n Qual é o resto da divisão  ???
  if e > 0 Then
    begin
      i:=1;
      Resto:=a;
         While i <= (e+1) do
           begin
             if i >= (e-1) Then
               begin
                if e > 1 Then //corrija aqui
                  Resto:=Resto*a //corrija aqui
                else                    //corrija aqui
                  Resto:=a;         //corrija aqui
                Resto:=Resto mod n;
                Break;
               end;
             Resto:=Trunc(Power(Resto,2));
             Resto:=Resto mod n;
             i:=i*2;
          end;
    end
  else
    Resto:=n;
result:=Resto;
end;


[color=darkred:1580c91277][b:1580c91277]Conclusão : Ta na hora de rever este conceito[/b:1580c91277][/color:1580c91277]

se x:= a^e mod n
sera que a:= x^d mod n Pelo simples fato que e*d mod z = 1
Sera que isto é verdade..


[color=darkred:1580c91277][b:1580c91277]Bem então eu acho , que de deve usar a chave de outro modo[/b:1580c91277][/color:1580c91277]..
To tentando pesquisar no geogle sobre[b:1580c91277] Rsa [/b:1580c91277]Mas a minha conexão esta muito ruim :cry: :cry: :cry:

:arrow: Qaulquer coisa [b:1580c91277]nova[/b:1580c91277] eu posto.

Alguma dúvida :?: :?: :?:


GOSTEI 0
Sabah

Sabah

06/05/2005

1. escolhem-se dois números primos grandes (P e Q). 2. calculma-se dois valores com base nos números primos escolhidos: N = P*Q Z = (P-1)*(Q-1) 3. escolhe-se um número primo em relação a Z, ou seja, sem relação de divisibilidade entre o número escolhido e Z. chamamos esse número de D. 4. cria-se a chave de criptografia (E) usando a seguinte fórmula: (E*D) mod Z = 1. 5. temos assim as chaves públicas e privadas. Ambas as chaves são compostas por dois valores, V1 e V2, que aplicados a uma mesma fórmula genérica fazem a criptografia ou descriptografia: (SAÍDA) = (ENTRADA)^V1 mod V2 os valores de E e N formam a chave pública, D e N formam a chave privada, onde V1 = E (criptografar) ou V1 = D (descriptografar), e V2 = N. (TEXTO CRIPTOGRAFADO) = (TEXTO ORIGINAL)^E mod N (TEXTO ORIGINAL) = (TEXTO CRIPTOGRAFADO)^D mod N


provavelmente não será encontrado algo muito diferente disso, mas se encontrar, avise, por favor!!


GOSTEI 0
Edilcimar

Edilcimar

06/05/2005

eu possuo algum material sobre criptografia, mas infelizmente não existe um local aqui no clube onde possa colocá-lo, porém existem material sobre o assunto em
www.activedelphi.com.br

www.ime.usp.br/~coelho/mac0338-2004/aulas/CertifyingAlgs.pdf

www.mpi-sb.mpg.de/~mehlhorn

www.magnoabreu.kit.net

www.mabm.hpg.ig.com.br/trabalhos/algebra/tp2/tp2.doc+¬22algoritmo+rsa¬22&hl=pt-BR

www.sinpro-rs.org.br/paginasPessoais/layout1/..¬255Carquivos¬255CProf_163¬255CSEG_ChaveP¬C3¬BAblica.PDF+¬22algoritmo+rsa¬22&hl=pt-BR

http://daniellerch.com/papers/html/algoritmo_rsa.html#algoritmo_rsa

www.inf.furb.br/~pericas/orientacoes/Esteganografia2003.pdf+¬22algoritmo+rsa¬22&hl=pt-BR

www.inf.ufpr.br/~elias/seguranca3-4.pdf+¬22algoritmo+rsa¬22&hl=pt-BR

www.bry.com.br/downloads/artigo/Protocolacao¬2520Digital¬2520de¬2520Documentos¬2520Eletronicos.pdf+¬22algoritmo+rsa¬22&hl=pt-BR

creio que estes acima sirvam para início
www.bry.com.br

www.redes.unb.br/security/criptografia/rsa/rsa.html#c-¬20funcionamento¬20do¬20RSA


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Utilizando os valores p = 47, q = 59, n = 2773, d = 157, e = 17, vamos a um teste... criprografando um caracter ´A´, seu cóigo ASCII é 65. Ao criptografarmos: RestoDivisaoDeNumerosExponenciais(Ord(´A´), e, n) = 332. Ao descriptografarmos, temos: RestoDivisaoDeNumerosExponenciais(332, d, n) = 685.


Baseado nestas informações e na teoria que anteriormente eu estava achando estranho :arrow:
se x:= a^e mod n 
sera que a:= x^d mod n Pelo simples fato que e*d mod z = 1 
Sera que isto é verdade..

Resolvi vasculhar a minha função , na tentativa de obter algum erro. :cry: :cry: :cry:

Constatei então que ela possuia um erro... :lol: :lol: :lol: Ela funcionava bem somente para Numeros Exponencias e que obdecia a Relação
e:=2^k+1 , Onde K é um numero Inteiro

Por isto , quando e = 17 ela funcionava , pois 17 = 2^4+1;
mas ja para d=157 ela pifava , pois 157 <> 2^k+1...Não existe K Inteiro para isto

Descoberto isto e levando em conta a teoria das Conguencias , cheguei numa nova Função.. Que pelo testes Preliminares Funciona :lol: :lol: :lol:

function RestoDivisaoDeNumerosExponenciais(a,e,n:Integer):Integer;
var
 i:Integer;
 Resto:Real;
begin
 // Queremos Saber a^e mod n Qual é o resto da divisão  ???
 if e > 1 Then
   begin
     i:=2;
     Resto:=a;
     while i < e do
       begin
          Resto:=Power(resto,2);
          Resto:=Trunc(Resto) mod n;
          i:=i*2;
          if i+1 > e Then
            begin
              i:= i div 2;
              Break;
            end;
       end;

     while i+1 < e do
       begin
          Resto:=Resto*a*a;
          Resto:=Trunc(Resto) mod n;
          i:=i+2;
       end;
     if e mod 2 <> 0 Then
       begin
         Resto:=Resto*a;
         Resto:=Trunc(Resto) mod n;
       end;
   end
 else
   if e=1 Then
     resto:=a mod n
   else // se expoente = 0 então , o numero elevado a zero é um
     resto:=1;
Result:=Trunc(Resto);
end;


Testei para os seguintes valores:
1)exemplo:
p = 47, q = 59, n = 2773, d = 157, e = 17,
Criptogavado
a:=65 :arrow: 332
Descriptogravado
x:=332 :arrow: 65

2) Exemplo

p=43 , q=59 , n= 2537 , e=13 e d=937

entrada ---->>> 1520   111   802   1004   2402
Saida    ---->>>>  95       1648 1410 1299   0811


Criptogavado
a:=1520 :arrow: 95
Descriptogravado
x:=95 :arrow: 1520

Criptogavado
a:= :arrow: 95
Descriptogravado
x:=95 :arrow: 1520

etc... Fiz todos os testes acima


GOSTEI 0
Sabah

Sabah

06/05/2005

Minha nossa... isso até me emociona!! hehehehe... valeu, Marco!! É exatamente isso!! Funciona perfeitamente, com todos os teste que fiz até agora funcionou.

Novamente, denovo, outra vez... obrigado pela ajuda!!


GOSTEI 0
Marco Salles

Marco Salles

06/05/2005

Ufa :P :P :P :P :P :P


GOSTEI 0
POSTAR