Olá pessoal,
Estou precisando de uma grande ajuda, alguem sabe um site bão e confiável onde posso encontrar os principais algoritmos de criptografia em JAVA … Aes , Des , Md5 e assim vai
Obrigado
Olá pessoal,
Estou precisando de uma grande ajuda, alguem sabe um site bão e confiável onde posso encontrar os principais algoritmos de criptografia em JAVA … Aes , Des , Md5 e assim vai
Obrigado
Obrigado pela ajuda.
Amigos, obrigado pela resposta
Não sou muito experiente. Alguem poderia me dar um exemplo da utilização dessas classes de criptografia?
O que quero fazer é: Um sistema que o usuario poderá escolher qual criptografia quer usar para criptografar um texto e descriptografa-lo tbm.
Ele escolherá entre ±6 algoritmos e insirirá seu texto.
Pensei num Applet como interface grafica q chamará todos os
algoritmos que ficaram contidos em outras classes, como metodos.
O que acham?
****obrigado pelas respostas
Dá uma olhada nesse código de RSA (peguei na net a algumas semanas e fins uns testes)
De repente pode ser útil a vc.
flw
/*************************************************************************
* Compilation: javac RSA.java
* Execution: java RSA N
*
* Generate an N-bit public and private RSA key and use to encrypt
* and decrypt a random message.
*
* % java RSA 50
* public = 65537
* private = 553699199426609
* modulus = 825641896390631
* message = 48194775244950
* encrpyted = 321340212160104
* decrypted = 48194775244950
*
* Known bugs (not addressed for simplicity)
* -----------------------------------------
* - It could be the case that the message >= modulus. To avoid, use
* a do-while loop to generate key until modulus happen to be exactly N bits.
*
* - It's possible that gcd(phi, publicKey) != 1 in which case
* the key generation fails. This will only happen if phi is a
* multiple of 65537. To avoid, use a do-while loop to generate
* keys until the gcd is 1.
*
*************************************************************************/
import java.math.BigInteger;
import java.security.SecureRandom;
public class RSA {
private final static BigInteger one = new BigInteger("1");
private final static SecureRandom random = new SecureRandom();
private BigInteger privateKey;
private BigInteger publicKey;
private BigInteger modulus;
// generate an N-bit (roughly) public and private key
RSA(int N) {
BigInteger p = BigInteger.probablePrime(N/2, random);
BigInteger q = BigInteger.probablePrime(N/2, random);
BigInteger phi = (p.subtract(one)).multiply(q.subtract(one));
modulus = p.multiply(q);
publicKey = new BigInteger("65537"); // common value in practice = 2^16 + 1
privateKey = publicKey.modInverse(phi);
}
BigInteger encrypt(BigInteger message) {
return message.modPow(publicKey, modulus);
}
BigInteger decrypt(BigInteger encrypted) {
return encrypted.modPow(privateKey, modulus);
}
public String toString() {
String s = "";
s += "public = " + publicKey + "\n";
s += "private = " + privateKey + "\n";
s += "modulus = " + modulus;
return s;
}
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
RSA key = new RSA(N);
System.out.println(key);
// create random message, encrypt and decrypt
BigInteger message = new BigInteger(N-1, random);
//// create message by converting string to integer
// String s = "test";
// byte[] bytes = s.getBytes();
// BigInteger message = new BigInteger(s);
BigInteger encrypt = key.encrypt(message);
BigInteger decrypt = key.decrypt(encrypt);
System.out.println("message = " + message);
System.out.println("encrpyted = " + encrypt);
System.out.println("decrypted = " + decrypt);
}
}
Na verdade vc não precisa vairos algoritmos de criptografia,
so permita que o usuario digite a chave da criptografia que ele quizer
ja vai resolver.
Abraço.
[quote=leandroviolim]O que quero fazer é: Um sistema que o usuario poderá escolher qual criptografia quer usar para criptografar um texto e descriptografa-lo tbm.
Ele escolherá entre ±6 algoritmos e insirirá seu texto.
Pensei num Applet como interface grafica q chamará todos os
algoritmos que ficaram contidos em outras classes, como metodos.
O que acham?[/quote]
Outra coisa. Como é que ele vai entrar com a chave? Usando uma senha? Ou uma chave fixa?
Se for usar uma senha, aprenda a usar PBE (“Password-Based Encryption”). Um exemplo de PBE:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.KeySpec;
public final class TestePBE {
private static SecretKey skey;
private static final String algorithm = "AES/CBC/PKCS5Padding";
public static final void encrypt(char[] password, File arq)
throws IOException,
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
KeySpec ks = new PBEKeySpec (password, new byte[]{1,2,3,4,5,6,7,8,9,10}, 1000);
SecretKey skey = skf.generateSecret (ks);
final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
return cipher.doFinal(text.getBytes());
}
public static final void decrypt(char[] password, File arq)
throws IOException,
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
KeySpec ks = new PBEKeySpec (password, new byte[]{1,2,3,4,5,6,7,8,9,10}, 1000);
SecretKey skey = skf.generateSecret (ks);
final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
return cipher.doFinal(text.getBytes());
}
private static int tamArquivoTeste = 12345;
private static void geraArquivoTeste(File arq) throws IOException {
Random r = new Random ();
r.setSeed (123456789);
byte[] bytes = new byte[tamArquivoTeste];
r.next (bytes);
OutputStream os = new FileOutputStream (arq);
os.write (bytes);
os.close();
}
private static boolean confereArquivoTeste(File arq) throws IOException {
boolean ret = true;
Random r = new Random ();
r.setSeed (123456789);
byte[] bytes = new byte[tamArquivoTeste];
r.next (bytes);
byte[] readBytes = new byte[tamArquivoTeste];
if (arq.length() != tamArquivoTeste) {
System.out.println ("Arquivo de tamanho diferente do esperado");
return false;
}
InputStream is = new FileInputStream (arq);
int nBytes = is.read (readBytes);
is.close();
if (nBytes != tamArquivoTeste) {
System.out.println ("Arquivo de tamanho diferente do esperado");
return false;
}
return Arrays.equals (readBytes, bytes);
}
public static void main(String[] args) throws Exception {
String password = "senha altamente secreta";
File arqEntrada = new File ("teste.bin");
File arqCifrado = new File ("teste.bin.cifrado");
File arqDecifrado = new File ("teste.bin.decifrado");
geraArquivoTeste (arqTeste);
TestePBE.encrypt (password, arqEntrada, arqCifrado);
//-- Checando com a senha certa
TestePBE.decrypt (password, arqCifrado, arqDecifrado);
if (confereArquivoTeste (arqEntrada, arqDecifrado)) {
System.out.println ("Os arquivos bateram");
}
//-- Checando com a senha errada
TestePBE.decrypt ("senhaErrada", arqTeste);
if (confereArquivoTeste (arqEntrada, arqDecifrado)) {
System.out.println ("Os arquivos bateram");
}
}
}
leandroviolim,
Eu uso este algoritmo para encriptar com o MD5, de uma olhada.
public class EncriptaSenha {
/** Creates a new instance of EncriptaSenha */
public EncriptaSenha() {
}
public static String encripta (String senha) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(senha.getBytes());
BASE64Encoder encoder = new BASE64Encoder ();
return encoder.encode(digest.digest());
}catch (NoSuchAlgorithmException ns) {
ns.printStackTrace ();
return senha;
}
}
}
Espero ter ajudado.
fsquadro, só um toque: MD5 (e outros algoritmos de Hash/MAC) não servem para transmitir mensagens, pois o receiver não vai poder fazer decript da mensagem.
oyama,
Tranquilo. É que ele não especificou que seria para transmitir mensagens (na realidade nem sei, se realmente é).
Mas valeu ai a dica.
[editado]
Agora vi, que abaixo ele especificou que seria troca de mensagem. Desculpe.
[quote=oyama][quote=leandroviolim]O que quero fazer é: Um sistema que o usuario poderá escolher qual criptografia quer usar para criptografar um texto e descriptografa-lo tbm.
Ele escolherá entre ±6 algoritmos e insirirá seu texto.
Pensei num Applet como interface grafica q chamará todos os
algoritmos que ficaram contidos em outras classes, como metodos.
O que acham?[/quote]
Obrigado pelas respostas!
Oyama, o sistema é apenas uma prova de conceito. Quero mostrar a funcionalidade dos algoritmos.
Quanto a estas questoes de chave, são minha grande duvida. Ainda nao sei bem como resolver este problema. (Se alguem tiver alguma dica, seria muito bem vinda!)
SSL para transmitir as mensagens que foram criptografadas de um computador a outro para que o programa que estará no outro comp. possa descriptografa-las?
Para mostrar a funcionalidade dos algoritmos, você pode especificar:
Não entendi bem o que você quis dizer com “mostrar funcionalidade dos algoritmos”. Qual o objetivo final desta prova de conceito? O que você quer provar com este programa que você quer desenvolver?
De novo, eu teria que entender o que você quer demonstrar. Um módulo de segurança pode prover várias features: confidencialidade, autenticidade, integridade, controle de acesso, disponibilidade e “nonrepudiation”. Quais você que cobrir com esta prova de conceito? A segurança das chaves também deveriam fazer parte prova de conceito?
SSL é um protocolo “seguro” para transmissão de dados em uma rede. Ele endereça quase todas as features que eu citei acima. O objetivo não é usar um algoritmo ou outro, mas prover um protocolo de como dois sistemas podem se comunicar de maneira “segura”. A questão da distribuição das chaves é endereçada usando-se certificados. O PGP também é um exemplo de um protocolo seguro para comunicação.
Não entendi bem o que você quis dizer com “mostrar funcionalidade dos algoritmos”. Qual o objetivo final desta prova de conceito? O que você quer provar com este programa que você quer desenvolver?
De novo, eu teria que entender o que você quer demonstrar. Um módulo de segurança pode prover várias features: confidencialidade, autenticidade, integridade, controle de acesso, disponibilidade e “nonrepudiation”. Quais você que cobrir com esta prova de conceito? A segurança das chaves também deveriam fazer parte prova de conceito?
SSL é um protocolo “seguro” para transmissão de dados em uma rede. Ele endereça quase todas as features que eu citei acima. O objetivo não é usar um algoritmo ou outro, mas prover um protocolo de como dois sistemas podem se comunicar de maneira “segura”. A questão da distribuição das chaves é endereçada usando-se certificados. O PGP também é um exemplo de um protocolo seguro para comunicação.[/quote]
Certo,
Assim, estou fazendo um tcc e o assunto criptografia é o que mais me interessa.
A principio pensei em estudar e explicar a historia de alguns algoritmos de criptografa. Porém presisa ter pelo menos uma implementação para o projeto estar valendo. Então pensei em reunir todos algoritimos em um unico sistema … ai a pessoa escrevia a mensagem e escolhia o tipo de criptografia que ela queria. Talvez mais pra frente fazer um sitema de envio de mensagens e tals mais isso ´so mais pra frente.
Então na verdade oq eu precisava era de uns 5 ou 6 algoritimos.
E tenho como principal dúvida Existem metodos nas bibliotecas do java para que utilize os algoritmos de criptografia ou terei que reescreve-los e dividir cada 1 em uma classe, pra que eu possa organizar melhor o sistema ?
Valeu a todos pela ajuda
Nada como requisitos bem definidos…
Agora que eu entendi o que você quer fazer, posso dar dicas mais precisas:
:arrow: Em Java existe JCE (Java Cryptography Extension). JCE determina interfaces para se acessar algoritmos de criptgrafia através de providers. http://java.sun.com/products/jce/index.jsp
:arrow: Provider que implementa vários algoritmos de criptografia: http://www.bouncycastle.org/
:arrow: Inclua algoritmos simétricos e assimétricos.
:arrow: Opinião: mostrar uma sistema mandando uma mensagem criptografada usando diferentes algoritmos de criptografia não vai dar a noção das diferenças dos algoritmos. Tem que mostrar matematicamente a diferença deles.
Criptografia não é para amadores.
Dois livros (infelizmente em Inglês) para ler:
Applied Cryptography - Bruce Schneier - esse livro talvez possa ser achado na biblioteca de sua escola, já que não é específico para Java. Procure na biblioteca da faculdade de Matemática da sua universidade.
Java Cryptography - Jonathan Knudsen - É um livro realmente velho (1998 ), mas deve ser fácil de encontrar em bibliotecas, e como é curto não é (muito) difícil de ler. Se você quiser ler apenas um livro, leia o Java Cryptography.
O livro a seguir é se você quiser usar a biblioteca BouncyCastle, precisar dos detalhes sangrentos, e tiver uns dólares para gastar (ou se você achar na sua biblioteca, he he he)
Beginning Cryptography with Java - David Hook
Galera, achei melhor nao criar outro topico, entao vou pegaer “emprestado” esse… :lol:
Em meus sistemas desktop, estou criando senhas para validacao de mensalidades… mas nao to com a minima noção de como resolver isso dentro do sistema “hospedeiro”…
Eu crio uma senha para os sistemas atraves do codigo do meu cliente e a data de vencimento… consigo criptografar com SHA-256 tbm… mas tah, eu tenho a bendita senha comigo, mas como validar ela “dentro” do sistema???
Tipo, quer dizer que vai ter q ter na codificacao do sistema uma rotina que contenha o codigo do cliente gerado por mim e a data de vencimento, transferindo para SHA-256 e comparando com a entrada???
A minha grande duvida eh q, apesar de criptografar a senha, ela está “aberta” dentro do sistema, entao se alguem ler os fonts vai ver a senha lah!!!
Alguem por favor tem alguma dica pra isso???
jopss [:p]
jopss,
Acredito que você esteja um pouco “confuso”. Eu não tenho experiência com sistemas desktop, porém a lógica de autenticação é a mesma para sistemas desktop e para sistemas web.
Vou lhe explicar o que eu costumo fazer. Quando gero um cliente (usuário) cri o login e a senha, e esta fica criptograda no banco de dados. Quando o usuário vai entrar no sistema e digita sua senha, eu criptografo o que ele digitou e comparo com o que está no banco. Caso confira, ele está autenticado e a partir dai não confiro mais a senha dele em momento algum.
Você não está trabalhando com banco de dados? A senha fico no banco de dados, e caso alguem leia o código fonte, não saberá qual a senha dos usuários.
Espero ter ajudado.
Ola… desculpe-me, acho q nao me fiz entender…
O que necessito eh uma validacao de senha mensal, pois meus sistemas vao ser alugados, com mensalidades…
As contas de usuarios no sistema eu jah fiz… mas oq necessito eh a validacao mensal… Quem vai passar a senha (senao o sistema tranca) sou eu, por telefone ou internet, com as seguintes caracteristicas:
– A senha se dará pela obtenção de um codigo e pela data de vencimento da mensalidade, transformada para criptografia…
Esse codigo e essa data de mensalidade para formar a senha eh restrita a mim… o cliente que vai adquirir o sistema nao pode ter a menor ideia doq seja a “codificacao” da senha criptografada…
E é essa minha duvida… pois dentro da rotina de criacao de senha mensal, em algum lugar dentro do sistema, vai haver como foi feita a senha… dai se eu vender os sistemas para clientes meus de lugares longe, nao vou ter controle nenhum… e o cara pode mt bem pagar alguem pra “desabilitar” o trancamento mensal de meus sistemas, pois eh soh abrir o .jar e ver como a criacao de senha está feita… o codigo está a mostra!!!
jopss [:p]