Fórum criptografia RSA #280526
06/05/2005
0
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;Sabah
Curtir tópico
+ 0Posts
06/05/2005
Marco Salles
Eu num conheço não :cry:
:wink: Mas tento dar umas cacetadas no delphi
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));
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
06/05/2005
Sabah
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
06/05/2005
Sabah
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
07/05/2005
Edilcimar
Gostei + 0
07/05/2005
Marco Salles
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:
Gostei + 0
07/05/2005
Marco Salles
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:
Gostei + 0
07/05/2005
Martins
Procure no Active Delphi por Criptografia RSA, vc vai encontrar alguma coisa lá.
Boa Sorte!!!
Gostei + 0
07/05/2005
Marco Salles
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
07/05/2005
Sabah
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
07/05/2005
Marco Salles
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:
No mais é minha opinião
:P :P :P
Gostei + 0
07/05/2005
Sabah
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
07/05/2005
Edilcimar
Gostei + 0
07/05/2005
Marco Salles
citação de sabah
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
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
é 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
08/05/2005
Sabah
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.
Isso eu realmente não entendi, como o compilador interpreta?!
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].
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
08/05/2005
Marco Salles
Citação de Sabah
Isto voce tem toda razão.. Pensei que voce estava interresado so como numeros
Citacao de Sabah
Citacao de Marcus
O Compilador interpreta assim:
Showmessage(FloatToStr(Frac( 8.1504777725345014342277786904144e+40/2773)));
Da zero... Isto é Frac(x/n)=o , logo Frac(x/n)*n = 0
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
Clique aqui para fazer login e interagir na Comunidade :)