Segurança da Informação, RSAPublicKey de Java para C#.Net - Java - Portugal-a-Programar
Segurança da Informação, RSAPublicKey de Java para C#.Net
Por burncd, 16 de Novembro de 2009 em Java
Encontrei o vosso forum de programação e pareceu-me o mais indicado apara colocar a minha duvida.
Estou a desenvolver uma aplicação de cliente servidor, em que o servidor encontra-se em C#.Net e o cliente em java, e o objectivo é a troca de Chaves publicas dos algoritmos para depois estabelecer uma ligação segura entre ambos para realizar troca de comandos.
A parte de enviar comandos do cliente para o servidor encontra-se feita e a funcionar a 100%. O problema vem quando é para realizar a troca de chaves publicas dos algoritmo RSA entre ambos.
Consigo enviar a stream com as chaves para ambos os lados, e parece-me que ambas estão feitas de forma correcta. Mas o servidor quando tento criar o algoritmo rsa a partir de uma XmlString diz-me o seguinte erro:
(protocol.GetStringFromData())
"The input is not a valid base-64 string as it contains a non-base 64 character, more the 2 padding characters, or a non-white space character among the padding characters."
O conteúdo que o servidor está a receber é o seguinte:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><RSAKeyvalue><Modulus>AIKTJ+GUABnqQ422G7nmMdVyy38smuWFzrwlZ3mmdg5nqNeDPp76Vst/yNiddLc4Xpsi2AqbyKTm&#13;
+RfOEDER2up05p6EVMluwg26io5/4IeVzZhWXff9BKHmY0YmmQqsN9uuJYch7Jy6pbGuY7k6B+uF&#13;
i1xRIGoJ1zmobibslF8f</Modulus><Exponent>AQAB</Exponent></RSAKeyvalue>
O codigo gerado a partir das seguintes instruções em Java:
public static String getRSAPublicKeyAsXMLString(RSAPublicKey key) throws
public static Document getRSAPublicKeyAsXML(RSAPublicKey key) throws ParserConfigurationException, SAXException, IOException {
Document result = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
//modulusBytes = stripLeadingZeros(modulusBytes);
System.out.println("Modulus: " + new String(modulusBytes));
modulus.appendChild(result.createTextNode(new String(new sun.misc.BASE64Encoder().encode(modulusBytes))));
//exponentBytes = stripLeadingZeros(exponentBytes);
System.out.println("Exponent: " + new String(exponentBytes));
exponent.appendChild(result.createTextNode(new String(new sun.misc.BASE64Encoder().encode(exponentBytes))));
Não consigo obter o algoritmo do lado do servidor para poder continuar com a resolução do problema. Será que me podiam ajudar?
Desculpem se alguma informação está mal explicada.
Coloca a solução, para quem tiver a mesma dúvida.
O código não é muito necessário, pois a diferença está em em vez de criar o XML do lado do java, basta enviar os dados do da chave publica em BASE64Encoder(), ou seja, enviar o Modulus e a Exponent a parte para o .NET e criar o XML do lado do .NET.
Mas se quiserem posso postar mais tarde o código, pois ainda não o tenho funcional mas foi assim que um dos meus colegas de trabalho conseguiu.