password encrypt decrypt data and java android security rsa bouncycastle

encrypt - Generación de Keypair de Android RSA: ¿Debo usar Java estándar/Castillo hinchable/Spongy Castle/JSch/Other?



encrypt and decrypt password in android (2)

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 métodos diferentes, pero todavía me siento confundido, así que esperaba que alguien pudiera compartir sus conocimientos sobre estos temas para que yo pueda crear mi método más buscado y más fácilmente. implementándolo en Android.

Mi método "buscado":

  1. Debe generar claves públicas y privadas de RSA
  2. El público debe tener el relleno PKCS # 1
  3. Debe ser RSA 2048
  4. Devolver clave pública en matriz de bytes

Aparentemente puedes hacerlo de cuatro maneras:

  1. Java estándar
  2. Castillo inflable
  3. Spongy Castle (¿Android friendly?)
  4. JSch

Como soy muy nuevo en seguridad y en Java en general, me preguntaba si alguien finalmente podría dar una buena explicación clara de todo esto.

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

1. Java estándar (no estoy seguro si PKCS n. ° 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. Castillo hinchable (aún 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 ha comenzado / Lo mismo que Bouncy Castle?):

4. JSch (Muy Desfuncional / Trabajo en progreso)

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 se convierta realmente en un recurso más para cualquiera que tenga problemas con la generación de claves RSA en Android (como yo, y muchos otros lo han tenido).

Siento que Bouncy Castle tiene muy poca información sobre su API, lo que hace que sea extremadamente difícil para un principiante (como yo) entenderlo. Según mi investigación, las personas usan Bouncy Castle en Java en lugar del proveedor de seguridad incorporado porque Bouncy Castle es mucho más robusto . No se desea usar Bouncy Castle en Android porque "viene con una versión paralizada de Bouncy Castle", que puede ser propenso a errores. Spongy Castle es simplemente un reensamblaje de Bouncy Castle.

Con este fin, haré mi pregunta final sobre, ¿qué método debería usarse para Android?

Actualizar

Espero que alguien pueda responder esto más adelante. En cuanto a lo que hice para resolver mi problema fue simplemente usar NDK.


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

La criptografía incorporada de Java está disponible a través de Java Cryptography Extension (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úas. Utiliza los métodos de fábrica getInstance() de varias clases de cifrado. El aspecto del proveedor de servicios es más confuso para el programador promedio. No les importa cómo se implementa la criptografía, solo quieren algo que funcione. Pero bajo el capó están las clases de proveedores de cifrado que hacen el trabajo real. Si observa los argumentos de getInstance() , verá que puede especificar el proveedor si lo desea. ¿Por qué querrías? Tal vez pagó $$$ por una implementación comercial optimizada de RSA, por lo que desea usar esa. Quizás un proveedor tenga un certificado FIPS o alguna otra certificación que necesite para su aplicación. Entonces deberías especificar ese proveedor. Sun / Oracle envía su entorno Java con varios proveedores que, en conjunto, constituyen el proveedor predeterminado establecido para su entorno Java. No los mire con demasiada atención porque se superponen y, por lo tanto, son confusos debido a los artefactos históricos. Básicamente, cuando se utiliza Oracle Java, se solicita cifrado como KeyPairGenerator través de KeyPairGenerator.getInstance("RSA"); obtendrá una instancia de clase apropiada de uno de estos proveedores.

A continuación, veamos bouncycastle. La biblioteca de bouncycastle consta de dos partes. Una es su biblioteca criptográfica única cuya API has experimentado en tu n. ° 2 anterior. La segunda parte es una gran cantidad de código de pegamento para permitir que esta biblioteca se use como proveedor de cripta para la JCE. Esto significa que usted, como programador, tiene la opción de usar la biblioteca de cifrado bouncycastle. Puede usar su API directamente como en el n. ° 2 anterior. O bien, puede usar la api de JCE pero especificar explícitamente la implementación de bouncycastle por medio de KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC"); .

Si prefiere usar la API bouncycastle única directamente (lo llaman su "API liviana"), entonces no necesita el código de pegamento utilizado para que funcione como un proveedor de JCE. Para este Bouncycastle ofrece una descarga de solo las clases API ligeras.

Y ahora, por fin, observamos la implementación de Android. Google no licenció el código fuente de Java de Oracle, por lo que no tenían ninguno de los proveedores de JCE de Oracle. Tuvieron que proporcionar sus propios proveedores. Dado que bouncycastle tenía todo el código necesario, y era de código abierto y tenía una licencia generosa, Google / Android optó por utilizar bouncycastle como base para su proveedor de JCE predeterminado. Sin embargo, Android no ha hecho ningún esfuerzo para poner a disposición la API liviana única para programadores de Android. Esperan que use estas clases únicamente a través de la JCE. Han modificado el código de Bouncycastle para sintonizarlo para Android. El hecho de que puedas encontrar y tal vez usar algo de la API liviana directamente en Android es simplemente un efecto secundario del hecho de que está ahí debajo del capó. Y no todo está allí. Algunos han descrito esta situación como "bouncycastle en Android está paralizado".

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

Entonces, ¿qué deberías usar? Eso depende de lo que desee hacer, cuáles son sus necesidades de portabilidad, cuáles son sus preferencias de estilo y cuál es su nivel de habilidad criptográfica. En general, cuando está utilizando estas bibliotecas, está utilizando cifrado en un nivel bastante bajo. Se está concentrando en cómo hacerlo (usar RSA para el transporte de claves, usar AES para el cifrado de mensajes, usar HMAC-SHA256 para integridad de mensajes, etc.) versus qué hacer (Deseo enviar un mensaje cifrado a un destinatario a través de un correo electrónico mecanismo similar). Obviamente, si puede, debe apegarse a bibliotecas de nivel superior que resuelvan directamente su problema. Estas bibliotecas ya entienden lo que es PKCS # 1 y cómo usarlo como parte de protocolos más grandes y completos.