criptografia RSA
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´.
[/code]
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
Curtidas 0
Respostas
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
06/05/2005
O método RSA de criptografia tá explicado nos comentários.
O erro aponta pra essa linha:
voltei a usar o tipo integer, já tentei mudar os tipos pra LongInt, LongWord, Int64... o erro continua o mesmo!!
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
06/05/2005
usando esse código o erro em tempo de compilação é eliminado:
mas... agora o erro é de ´Invalid floating point operation.´ quando o evento é chamado.
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
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
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
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
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!!!
Procure no Active Delphi por Criptografia RSA, vc vai encontrar alguma coisa lá.
Boa Sorte!!!
GOSTEI 0
Marco Salles
06/05/2005
Eu fiquei um pouco sismado com isto....
Não sei se é isto que voce quer... Mas tente 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
06/05/2005
o código agota está assim:
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!
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
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
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.
o valor da variável x só substitui o seguinte trecho de código:
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
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
06/05/2005
eu tenho um sistema para criptografia e não utilizo fração, eu sempre utilizo mod
GOSTEI 0
Marco Salles
06/05/2005
citação de sabah
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 :?: :?: :?:
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
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
06/05/2005
Citaçao de 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:
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
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
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!
Obrigado Marco e todos que tentaram ajudar!
GOSTEI 0
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]
Finalmente o Sabad , pode tentar implementar sua Função do Seguinte Modo
[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]
Não é mais necessário , Porque o Problema inicial de calcular
[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
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
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?!
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
06/05/2005
Uma coisa e uma coisa outra coisa é outra coisa..
disse o Vanderlei LuxemburroAmigo , 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
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
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
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
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
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!!
Novamente, denovo, outra vez... obrigado pela ajuda!!
GOSTEI 0
Marco Salles
06/05/2005
Ufa :P :P :P :P :P :P
GOSTEI 0