Comparta y almacene RSA - clave pública en el servidor java y viceversa

1

Mis requisitos son:

Requisito 1: Compartir la clave pública al servidor java.

Pasos:

  1. Genere claves público-privadas en la aplicación iOS.
  2. Almacena las claves generadas en el llavero.
  3. Enviar la clave pública generada al servidor java.
  4. El servidor Java podrá almacenar la clave pública compartida en la base de datos.

Requisito 2: Almacenar la clave pública enviada por el servidor java.

Pasos:

  1. El servidor Java envía la clave pública de otro usuario.
  2. Procese los datos enviados por el servidor Java y genere una clave pública a partir de él.
  3. Almacene la clave generada en el llavero, que puede recuperarse más tarde para cifrar el mensaje que se va a transferir.

Soy capaz de lograr los pasos 1-2 en el requisito 1 utilizando el siguiente método definido en la clase SecKeyWrapper (muestra de CommonCrypto):

- (void)generateKeyPair:(NSUInteger)keySize

Pregunta 1: Ahora el problema es: ¿cómo debo enviar esa clave al servidor java?

Tenemos el método getPublicKeyBits en la misma clase, que devuelve un objeto NSData, en algunas búsquedas en Google encontré que está en formato codificado DER.

Pregunta 2: Si envío el mismo objeto NSData al servidor, que creo que interpretará como un objeto ByteBuffer, ¿será posible para otros dispositivos, en mi caso podría ser Android, para interpretar esos datos?

Pregunta 3: ¿Cuál es la mejor manera de compartir la clave pública en los escenarios anteriores?

    
pregunta Devarshi 13.05.2014 - 12:21
fuente

2 respuestas

1

Los servidores Java y las aplicaciones de Android esperan la clave pública en formato X.509, consulte enlace sobre cómo realizar la conversión.

    
respondido por el pipacs 25.04.2015 - 09:52
fuente
0

Deberías:
  * Utilice netty.io para el envío de datos
  * Utilice un mecanismo de serialización y deserialización utilizando ByteArrayStreams y ObjectStreams
  * Use algún tipo de cifrado como usar AES con una frase de contraseña

netty.io:   Igual a lo que dijo el screencast pero cambia los manejadores para que se ajusten a tus necesidades, usa ByteEncoders y ByteDecoders.    enlace
Serialización:
  Codificador:
public static byte[] serialize(T object) throws IOException { ByteArrayOutputStream bOutputStream; ObjectOutputStream objectOutputStream; bOutputStream = new ByteArrayOutputStream(); objectOutputStream = new ObjectOutputStream(bOutputStream); objectOutputStream.writeObject(object); objectOutputStream.flush(); byte[] bytes = bOutputStream.toByteArray(); bOutputStream.close(); objectOutputStream.close(); return bytes; }

Decodificador:
@SuppressWarnings("unchecked") public static T deserialize(byte[] bytes) throws ClassCastException,IOException, ReflectiveOperationException { T obj; ByteArrayInputStream bInputStream; ObjectInputStream objectInputStream; bInputStream = new ByteArrayInputStream(bytes); objectInputStream = new ObjectInputStream(bInputStream); obj = (T) objectInputStream.readObject(); bInputStream.close(); objectInputStream.close(); return obj; }

AES:   Son como dos clases pero es bastante fácil. Puede buscarlo en el desbordamiento de pila o algo así

Almacenamiento:
Map < Integer, PublicKey> o lo que sea que debería hacer el truco.

    
respondido por el ramidzkh 18.03.2017 - 07:33
fuente

Lea otras preguntas en las etiquetas