| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2007 22:18:09
|
silfarley
What is classpath?
Membro desde: 04/04/2007 22:08:06
Mensagens: 8
Offline
|
dudes...parabens pelo site em primeiro lugar!
To fazendo um tcc na area de criptografia, e preciso implementar um software. O sistema que eu escolhi foi o rsa, mas nao manjo quase nada de programação. Alguem pode me indicar um site que eu ache um algoritmo pronto para o netbeans?? Obrigado!!
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/04/2007 22:29:02
|
Ironlynx
Moderador
![[Avatar]](/images/avatar/93d65641ff3f1586614cf2c1ad240b6c.jpg)
Membro desde: 02/05/2003 01:06:41
Mensagens: 3515
Localização: The other side of the screen
Offline
|
Pesquise aqui mesmo no fórum que já tem exemplos...
|
Não basta persistir...tem que prevalecer!
Ironlynx
Anarquista de Sistemas
http://osereojava.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/04/2007 13:19:38
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Não use criptografia RSA para criptografar mais que 100 bytes.
Normalmente RSA é usado para criptografar chaves, não dados.
Eis um exemplo (grave este programa em um arquivo chamado "ExemploCriptografia.java", compile-o e o rode com:
java -cp . ExemploCriptografia
)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/04/2007 23:13:10
|
silfarley
What is classpath?
Membro desde: 04/04/2007 22:08:06
Mensagens: 8
Offline
|
putz...valeu ai galera, mas acho que em breve vou precisar de mais ajuda. Abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 15:34:58
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
thingol,
Estou estudando um pouco de Criptografia, pois terei de usá-lo para criptografar e descriptografar uma base de dados, e nos exemplos que encontrei na net, o seu foi o mais claro e eficiente q encontrei, parabéns...
Porém gostaria de saber se vc pode me ajudar... o código funciona perfeitamente, porém qdo eu separo as classes e vou utilizar o "Decifrador" separadamente do "Cifrador" para descriptografar um txt previamente criptografado com este código, este dá o seguinte erro:
Para descriptografar este arquivo, eu mudei a linha 151 do seu código, ficando da seguinte forma:
Visto que eu não quero chamar a criptografia novamente, antes de descriptografar...
Você pode me orientar para saber oq está ocorrendo?
Desde já agradeço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 15:48:27
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Uai, não sei onde é que pode dar esse erro. Rodei meu programa novamente (mas com um conjunto de dados bem maior) e ele funciona corretamente. Qual foi a modificação que você fez no meu código?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 15:49:58
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Uai, como é que você vai decifrar algo decifrado? Vai dar pau mesmo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 15:55:27
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
Bom, vou separar as variáveis pra ficar mais claro...
Mais na verdade o "textoClaro" é o que está criptografado no arquivo txt.
segue pra ficar amis claro:
This message was edited 2 times. Last update was at 30/05/2008 16:02:11
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 16:04:59
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Ah, é que não ficou muito claro no programa que eu mostrei.
A rotina "cifra" retorna 2 arrays de bytes: um deles com os dados cifrados, e outro deles com a chave simétrica (AES) cifrada com a chave assimétrica (RSA).
Quando você vai guardar esses dados, você precisa guardar os 2 arrays, não só um deles. Se você não guardar a chave simétrica cifrada com a chave assimétrica, então você nunca conseguirá decifrar os dados cifrados. Não é perigoso guardar a chave simétrica cifrada, porque ela só poderá ser decifrada por alguém que tiver a chave privada disponível.
Quando você for decifrar os dados, você precisa passar a chave privada (primeiro parâmetro), os dados cifrados (segundo parâmetro), e a chave simétrica cifrada com a chave assimétrica (terceiro parâmetro).
Se você acha isso esquisito, é o jeito correto de fazer, que é usado no padrão PKCS#7 signedData, e no padrão S/MIME (usado para mandar e-mails criptografados pelo MS Outlook, MS Outlook Express, Eudora, Mozilla Thunderbird, etc. )
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 16:11:14
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
Obrigada pela paciência e grande ajuda thingol, mais assim, eu estou passando sim os três parâmetros... o estranho é q o programa funciona perfeitamente qdo rodo ele cifrando e decifrando logo em seguida, assim como está seu programa...
Agora se eu separo as classes, cifro um conteúdo e guardo em um arquivo, e depois só rodo o decifrar, ele emite esse erro... porém não entendo, pq eu estou guardando os arquivos com as chaves e lendo as duas, a pública e a privada e tbm leio no arquivo o conteúdo a ser decifrado, porém emite esse erro...
fiz algunst estes e o problema está justamente na linha
Eu não mantive da forma original, pois este envocava antes a classe para cifrar, e não é oq eu quero, pois este já está no arquivo, eu gostaria apenas de decifrar o conteúdo deste arquivo.
Desde já agradeço novamente...
This message was edited 1 time. Last update was at 30/05/2008 16:15:29
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2008 17:43:30
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
lilirc wrote:
O primeiro parâmetro é a chave privada (ok)
O segundo é o texto cifrado (ok)
O terceiro não é a chave pública e sim a chave simétrica cifrada. (No programa acima era o elemento cifrado[1] do array de arrays retornado por "cifra".)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/05/2008 15:15:46
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
Sim, exatamente isso, mais o "Decifra" não tem a função de tbm pegar essa chave pública criptografada, e descriptografar esta chave e com ela, tbm decifrar o texto?
Eu não queria ter de chamar o cifra, pois eu quero apenas decifrar....chamando o cifra para obter a chave, eu criptografo novamente um conteúdo q já está criptografado, e não é isso q eu quero....
O problema é que o Decifra recebe a chave pública como um array de bytes e não como um objeto PublicKey, com isso, eu não consigo transformar este objeto PublicKey em um array de bytes, caso conseguisse fazer isso, creio q resolveria meu problema.
como poderia fazer para utilizar somente o decifra, utilizando uma chave pública previamente criada e armazenada em um arquivo? Já repliquei o método cifra e tirei a parte de cifrar o texto e deixei a parte da chave para tentar utilizá-la separadamente, já tentei transformar a chave em um array de bytes, já tentei um pouco de tudo e obti diversos erros, não sei mais oq posso fazer.... conto com a sua ajuda...
Agradeço a disposição em ajudar.... Obrigada
This message was edited 2 times. Last update was at 02/06/2008 16:54:17
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/06/2008 10:58:25
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
Existem poucos tópicos aquí a respeito de criptografia, e este está off, mais será que ninguém mais pode me ajudar?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/06/2008 13:04:30
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Calma, vou explicar tudo de novo. Pegue a sua cadeirinha e sente-se.
Normalmente, quando se quer cifrar uma grande quantidade de dados (ou seja, mais de 100 bytes), usa-se sempre criptografia normal (ou simétrica, onde a mesma chave que serve para cifrar um dado serve para decifrá-la. Ou seja, é uma chave "secreta" ou "simétrica").
As vantagens da criptografia simétrica são:
- Muito mais rápida
- Segura para pequenas ou grandes quantidades de dados.
O algoritmo recomendado hoje em dia é o AES ou Rijndael (com força de 128, 192 ou 256 bits); usei no exemplo o AES com chave de 128 bits.
Entretanto, para você mandar um dado criptografado com criptografia simétrica, é necessário que ambas as partes (remetente e destinatário) conheçam a chave simétrica. Você deve saber muito bem que é difícil mandar essa chave a menos que você pessoalmente apareça com um envelope e o dê nas mãos da pessoa (é modo de dizer); você não pode mandá-la pelo telefone, e muito menos via sockets.
A criptografia assimétrica veio para ajudar a resolver esse problema. Se você conhecer a chave PÚBLICA do destinatário, você pode mandar um dado (com menos de 100 bytes) para ele, criptografado com a chave PÚBLICA, de modo que o destinatário use a chave PRIVADA para decifrá-la.
Dados com mais bytes não devem ser criptografados com criptografia assimétrica (por exemplo, RSA), porque isso expõe uma vulnerabilidade nesses algoritmos que só se manifesta quando a quantidade de dados é grande e os dados criptografados podem ser conhecidos. Por exemplo, se você criptografasse uma mensagem - como uma página HTML - integralmente com o algoritmo RSA, ela tem alguns valores conhecidos em vários pontos, como o começo, que normalmente é "<HTML>".
E como o meu programa faz isso? Ele gera uma chave simétrica, que será usada para criptografar os dados a serem enviados. O remetente tem de mandar para o destinatário:
- Os dados criptografados com a chave simétrica gerada pelo remetente (algoritmo AES)
- A chave simétrica criptografada com a chave pública do destinatário (algoritmo RSA)
O destinatário, para decifrar a mensagem, deve obter:
- Os dados criptografados com a chave simétrica gerada pelo remetente (algoritmo AES)
- A chave simétrica criptografada (algoritmo RSA)
O que ele tem de fazer com os dados recebidos:
- Tem de decifrar a chave simétrica criptografada com a chave privada do destinatário (usando o algoritmo RSA)
- Uma vez decifrada essa chave simétrica, deve usá-la para decifrar os dados recebidos (usando o algoritmo AES)
Note que nesse processo o destinatário NÃO PRECISA da própria chave pública. O destinatário só precisa da CHAVE PRIVADA.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/06/2008 13:51:25
|
lilirc
Debugger
![[Avatar]](/images/avatar/e11f12430782bff9553b65f2be26d907.jpg)
Membro desde: 18/03/2008 10:27:26
Mensagens: 67
Offline
|
Obrigada pela paciência thingol... muitas coisas eu já havia entendido, e algumas outras ficaram mais claras para mim...
Vamos lá:
O remetente tem de mandar para o destinatário:
- Os dados criptografados com a chave simétrica gerada pelo remetente (algoritmo AES)
- A chave simétrica criptografada com a chave pública do destinatário (algoritmo RSA)
Ok, isso eu entendi... que em código seria:
O destinatário, para decifrar a mensagem, deve obter:
- Os dados criptografados com a chave simétrica gerada pelo remetente (algoritmo AES)
- A chave simétrica criptografada (algoritmo RSA)
que em código:
O que ele tem de fazer com os dados recebidos:
- Tem de decifrar a chave simétrica criptografada com a chave privada do destinatário (usando o algoritmo RSA)
- Uma vez decifrada essa chave simétrica, deve usá-la para decifrar os dados recebidos (usando o algoritmo AES)
Certo, que isto seria o papel do Decifrar
Note que nesse processo o destinatário NÃO PRECISA da própria chave pública. O destinatário só precisa da CHAVE PRIVADA.
Se ele não precisa da chave pública, o que seria o pub na linha 4 do código acima... ?
Pois, para decifrar, vc passa os seguintes parâmetros:
Onde nas linhas destacadas pvk = chave privada, cifra[0] = textoCifrado e cifrado[1] = pub, que seria a chave Pública que é obtida seu eu chamo o cifra, sendo q eu quero apenas decifrar a mensagem e não cifrá-la novamente para depois decifrá-la.
Porém, partindo do princício, se eu modificar a linha destacada do código acima, da seguinte forma:
Não é possível fazer de tal forma pq o pub é um objeto tipo PublicKey e o decifra espera um parâmetro array de bytes...
Este está sendo o meu problema... eu não sei se estou sendo clara...
Peço desculpas caso eu tenha feito muita confusão, mas o conceito de criptografar e descriptografar creio que entendi, porém não sei ao certo então o que seria a variável pub no meio de tudo isso senão a chave pública.
Obrigada pela ótima e detalhada explicação thingol, porém ainda estou um pouco confusa, como tentei explicar acima....
Abraços...
This message was edited 2 times. Last update was at 03/06/2008 13:55:33
|
|
|
 |
|
|
|
|