Tenho que fazer um projeto que efetue a criptografia baseado numa string enviada.
No processo, eu obtenho a string de um webservice feito em .net.
Depois disso eu tenho que criptografar os dados usando RSA, eu fiz o código:
public String validarAutenticacaoFuturo(String usuario, String senha) throws NoSuchAlgorithmException, InvalidKeySpecException, Exception{
WsAutenticacaoSoapProxy auth = new WsAutenticacaoSoapProxy();
String keyPublic = "<RSAKeyValue><Modulus>0Jlux+JHnHcj7w7+7Lo8dggyIxzr8Udh9zN11O9gxv65b0dvAiSCwieB7VTfAbHvD9V61q0ur60BX9FFZksAZU9zSDbYWu2cmRboiExsOrbMy8UguXdsZNIQEQJCqoe80oLupc8Xcje0OFg+WFvvOEucH4QujO288+19P0VTMQ0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
ClienteAutenticacao cliente = new ClienteAutenticacao();
AutenticacaoDto authDTO = (AutenticacaoDto)cliente.gerarParametrosAutenticacao(keyPublic);
PublicKey publica = RSAJEncrypt.generatePublicKeyByModulusExponent(authDTO.getModulus(), authDTO.getExponent());
byte[] bytes = RSAJEncrypt.encrypt(senha.getBytes(), publica);
String password = RSAJEncrypt.encodeBASE64(bytes);
String msg = "<?xml version=\"1.0\"?>";
msg += "<ObterPerfil xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">";
msg += "<Nome>" + usuario + "</Nome>";
msg += "<Senha>";
msg += password;
msg += "</Senha>";
msg += "<Sistema>Intranet</Sistema>";
msg += "</ObterPerfil>";
System.out.println("----------------------------------------------------------------");
System.out.println(msg);
String permissoes = auth.obterPermissoesUsuario(msg);
return permissoes;
}
O problema é que estou recebendo a seguinte mensagem:
Alguém tem idéia do que possa ser? Ou se tiver outra solução.
Valeu
Uma chave RSA de X bits só pode criptografar dados com X bits ou menos. Por exemplo, uma chave de 1024 bits (128 bytes) só pode criptografar até 128 bytes.
Uma página Web https, onde os dados são criptografados usando-se uma combinação de RSA e algum algoritmo como o AES ou o TripleDES, não tem esse problema porque os dados são criptografados usando-se um algoritmo como o AES (256 bits) ou o TripleDES (168 bits) e apenas a chave desses algoritmos é criptografada via RSA.
[quote=entanglement]Uma chave RSA de X bits só pode criptografar dados com X bits ou menos. Por exemplo, uma chave de 1024 bits (128 bytes) só pode criptografar até 128 bytes.
Uma página Web https, onde os dados são criptografados usando-se uma combinação de RSA e algum algoritmo como o AES ou o TripleDES, não tem esse problema porque os dados são criptografados usando-se um algoritmo como o AES (256 bits) ou o TripleDES (168 bits) e apenas a chave desses algoritmos é criptografada via RSA. [/quote]
Opa, agradeço muito a atenção entanglement, mas como eu poderia resolver?
O WebService me fornece o modulus e o exponent, com base nisso eu devo criar uma chave publica ok?
O problema é que o erro persiste?
Normalmente, quando se quer criptografar alguma coisa com RSA, você nunca nunca nunca usa o RSA sozinho, a menos que os dados a serem criptografados tenham menos de X bits (onde X é o tamanho da chave).
Normalmente você faz o seguinte, em resumo:
- Escolher um algoritmo simétrico como o TripleDES (168) ou o AES (128 bits) para criptografar seus dados (criptografia “simétrica”)
- Criar uma chave aleatória para esse algoritmo simétrico, que só vai valer para esse pacote de dados que você vai criptografar
- Criptografar a chave aleatória com a chave pública RSA . Digamos que você tenha escolhido o AES
- Criptografar seus dados com a chave aleatória AES - como sabemos, o AES criptografa dados em blocos de 16 bytes, mas o tamanho dos dados que podem ser criptografados é indefinido
- Mandar a chave aleatória criptografada com RSA, e os dados que foram criptografados com AES
- Lado que decifra os dados -
- Pegar a chave aleatória que foi criptografada com RSA, e decifrá-la com a chave privada RSA
- Usar a chave AES que foi decifrada para decifrar os dados que você quer criptografar
entanglement, fantástico o seu post!!!
você tem, um exemplo funcional?
Obrigado