Android RSA Generación de pares de claves – ¿Debo usar Java estándar / Bouncy Castle / Spongy Castle / JSch / Other?

He estado buscando alrededor de una semana + para implementar un método que tengo en mente. He encontrado (y leído) muchos artículos sobre todos estos diferentes métodos, pero todavía estoy confundido, así que esperaba que alguien puede difundir su conocimiento de estos temas para que pueda más fácilmente ir sobre la creación de mi buscado método y Implementándolo en Android.

Mi método "buscado":

  1. Debe generar claves públicas y privadas RSA
  2. Público debe tener PKCS # 1 relleno
  3. Debe ser RSA 2048
  4. Devolver clave pública en Byte array

Al parecer, puedes hacerlo de cuatro maneras:

  1. Java estándar
  2. Castillo inflable
  3. Castillo Esponjoso (Android Friendly?)
  4. JSch

Ya que soy muy nuevo en seguridad y Java en su conjunto me preguntaba si alguien podría finalmente dar una buena explicación clara de todo esto.

A continuación se presentan las formas en que he intentado implementar mi buscado método (mencionado anteriormente) en los 4 diferentes métodos de programación. Si no sé algo es porque no puedo averiguar a través de la documentación respectiva. Por favor no dude en corregirme.

1. Java estándar (no está seguro si PKCS # 1):

public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048); KeyPair keyPair = kpg.genKeyPair(); byte[] pri = keyPair.getPrivate().getEncoded(); byte[] pub = keyPair.getPublic().getEncoded(); return pub; } 

2. Bouncy Castle (Todavía no funcional = / Ideas?):

 public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException { RSAKeyPairGenerator r = new RSAKeyPairGenerator(); r.init(new KeyGenerationParameters(new SecureRandom(),4096)); AsymmetricCipherKeyPair keys = r.generateKeyPair(); CipherParameters pri = keys.getPrivate(); CipherParameters pub = keys.getPublic(); byte[] pubbyte = pub.toString().getBytes(); return pubbyte; //NOT WORKING } 

3. SpongyCastle (No lo inició / Lo mismo que Bouncy Castle?):

4. JSch (Muy Disfuncional / Trabajo en curso)

 public byte[] returnPublicKeyInBytes(JSch jSch) { try { KeyPair keyPair = KeyPair.genKeyPair(jSch, KeyPair.RSA); ByteArrayOutputStream bs = new ByteArrayOutputStream(); keyPair.writePrivateKey(bs); jSch.addIdentity("Generated", bs.toByteArray(), keyPair.getPublicKeyBlob(), null); return keyPair.getPublicKeyBlob(); } catch (JSchException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } 

Me gustaría que esto realmente se convierta en más de un recurso para cualquier persona que tiene problemas con la generación de claves RSA en Android (como yo, y muchos otros han tenido).


Creo que Bouncy Castle tiene muy poca información sobre su API que hace que sea extremadamente difícil para un principiante (como yo) entenderlo. De mi investigación, la gente usa Bouncy Castle en Java en lugar del proveedor de seguridad incorporado porque Bouncy Castle es mucho más robusto . El uso de Bouncy Castle en Android no se desea, ya que "se envía con una versión lisiada de Bouncy Castle", que puede ser propenso a errores. Spongy Castle es simplemente un reempaquetado de Bouncy Castle.

Con este fin, voy a hacer mi pregunta final de, ¿qué método se debe utilizar para Android?

Actualizar

Espero que alguien pueda responder a esto más adelante. En cuanto a lo que hice para solucionar mi problema era simplemente utilizar NDK.

Es complicado, pero trataré de explicar lo mejor que pueda. Creo que voy a empezar con Java. Mi discusión está orientada a Java 6, no estoy seguro de lo que ha cambiado en Java 7.

La criptografía incorporada de Java está disponible a través de la Extensión de Criptografía de Java (JCE). Esta extensión tiene dos partes, la API de la aplicación y la API del proveedor de servicios. La API de la aplicación es la parte con la que interactúa. Utiliza los métodos de fábrica getInstance() de varias clases de criptografía. El aspecto del proveedor de servicios es más confuso para el programador promedio. No les importa cómo se implementa el cripto, solo quieren algo que funcione. Pero debajo de la capilla hay las clases del abastecedor del cripto que hacen el trabajo real. Si observa los argumentos de getInstance() , verá que puede especificar el proveedor si lo desea. ¿Por qué querrías hacerlo? Tal vez usted ha pagado $$$ por una implementación comercial optimizada de RSA, por lo que desea utilizar esa. Tal vez un proveedor tiene un certificado FIPS o alguna otra certificación que necesita para su aplicación. Entonces usted especificaría ese proveedor. Sun / Oracle envía su entorno Java con varios proveedores que juntos forman el proveedor predeterminado establecido para su entorno Java. No los mire con demasiada atención porque se superponen y, por lo tanto, confunde debido a los artefactos históricos. Básicamente, cuando se usa Oracle Java, se solicita criptografía como KeyPairGenerator través de KeyPairGenerator.getInstance("RSA"); Usted va a obtener una instancia de clase apropiada de uno de estos proveedores.

A continuación, echemos un vistazo a bouncycastle. La biblioteca de bouncycastle consta de dos partes. Una es su biblioteca de criptografía única cuya API ha experimentado en su # 2 anterior. La segunda parte es un montón de código de pegamento para permitir que esta biblioteca se utilice como proveedor de criptas para la JCE. Esto significa que usted como programador tiene una opción en cuanto a cómo se utiliza la biblioteca bouncycastle cripto. Puede usar su API directamente como en # 2 arriba. O bien, puede usar la API de JCE pero especificar explícitamente la implementación de bouncycastle por algo como KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC"); .

Si prefiere utilizar la API exclusiva de bouncycastle directamente (lo llaman su "API ligera"), entonces no tiene necesidad de todo el código de pegamento utilizado para que funcione como un proveedor de JCE. Para este bouncycastle proporciona una descarga de sólo las clases de API de peso ligero.

Y ahora, por fin, miramos la implementación de Android. Google no licenció el código fuente de Java de Oracle, así que no tenían ninguno de los proveedores de JCE de Oracle. Tuvieron que proporcionar sus propios proveedores. Debido a que bouncycastle tenía todo el código necesario, y era de código abierto y libremente licenciado, Google / Android eligió usar bouncycastle como base para su proveedor de JCE predeterminado. Sin embargo, Android no ha hecho ningún esfuerzo para poner a disposición la única API ligera para programadores de Android. Esperan que utilice estas clases únicamente a través de la JCE. Han modificado el código de bouncycastle para sintonizarlo para Android. El hecho de que usted puede encontrar y tal vez utilizar algunos de la API de peso ligero directamente en Android es simplemente un efecto secundario del hecho de que está allí debajo de la capucha. Y no todo está allí. Algunos han descrito esta situación como "bouncycastle en Android está lisiado".

Para proporcionar una versión completa de la biblioteca de bouncycastle en Android, algunos desarrolladores produjeron algo llamado la biblioteca de Spongycastle . No es nada más que la biblioteca de bouncycastle modificada para que pueda funcionar en Android. La principal modificación fue cambiar los nombres de paquetes de org.bouncycastle.* org.spongycastle.* Para evitar conflictos de espacio de nombres.

Entonces, ¿qué debe usar? Eso depende de lo que usted quiere hacer, cuáles son sus necesidades de la portabilidad, cuáles son sus preferencias del estilo, y qué usted es nivel de habilidad del cripto. En general, cuando está utilizando estas bibliotecas está utilizando cripto en un nivel bastante bajo. Se está concentrando en cómo hacerlo (use RSA para el transporte de claves, utilice AES para el cifrado de mensajes, utilice HMAC-SHA256 para integridad del mensaje, etc.) en comparación con qué hacer (Quiero enviar un mensaje cifrado a un destinatario a través de un correo electrónico Como el mecanismo). Obviamente, si usted puede usted debe pegarse a las bibliotecas del más alto nivel que solucionan directamente su problema. Estas bibliotecas ya entienden lo que PKCS # 1 es y cómo usarlo como parte de protocolos más grandes y completos.

Estaba ayudando a alguien más temprano hoy con castillo hinchable hoy. Su código funciona, así que échale un vistazo

Los pares de claves RSA generan usando castillo inflable. Hacer que el código ejecute desde el programa java

  • Calcular SHA256 Hash en Android / Java y C #
  • Hacer que el teclado Android resista a los ataques de KeyLogger
  • ¿Cómo la emulación de tarjeta basada en software (HCE) garantiza la seguridad NFC?
  • Prevención de la piratería de la aplicación android
  • ¿Cuál es la mejor manera de ocultar la contraseña de keystore en Android?
  • Una implementación insegura de la interfaz X509TrustManager de google
  • Android Recomendación de seguridad en la aplicación: ¿qué significa esto?
  • CSRF en aplicaciones móviles
  • Obtener una matriz de char desde el usuario sin utilizar String
  • Seguridad de PubNub contra una ingeniería inversa de una aplicación android
  • ¿Qué es APPKEY en Truecaller API?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.