GARANTIR DESCONTO

Fórum criptografia RSA #280526

06/05/2005

0

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

Responder

Posts

06/05/2005

Marco Salles

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 :?: :?: :?:


Responder

Gostei + 0

06/05/2005

Sabah

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!!


Responder

Gostei + 0

06/05/2005

Sabah

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.


Responder

Gostei + 0

07/05/2005

Edilcimar

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


Responder

Gostei + 0

07/05/2005

Marco Salles

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?



Responder

Gostei + 0

07/05/2005

Marco Salles

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?



Responder

Gostei + 0

07/05/2005

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. 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!!!


Responder

Gostei + 0

07/05/2005

Marco Salles

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;



Responder

Gostei + 0

07/05/2005

Sabah

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!


Responder

Gostei + 0

07/05/2005

Marco Salles

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


Responder

Gostei + 0

07/05/2005

Sabah

(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


Responder

Gostei + 0

07/05/2005

Edilcimar

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


Responder

Gostei + 0

07/05/2005

Marco Salles

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 :?: :?: :?:


Responder

Gostei + 0

08/05/2005

Sabah

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!


Responder

Gostei + 0

08/05/2005

Marco Salles

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


Responder

Gostei + 0

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

Aceitar