analizando RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING

1

Así que Java tiene un modo llamado RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING . ¿Qué significa eso?

RFC3447 , Estándares de criptografía de clave pública (PKCS) # 1: RSA Especificaciones de criptografía Versión 2.1 , sección 7.1.2 Operación de descifrado dice que Hash y MGF son opciones para RSAES-OAEP-DECRYPT. MGF es su propia función, definida en Sección B.2.1 MGF1 y que también tiene su propia "opción" de Hash.

Tal vez se supone que la "opción" de Hash en RSAES-OAEP-DECRYPT y MGF1 es la misma o quizás no lo sea, no está claro para mí. Si lo son, entonces supongo que cuando tienes RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING eso significa que sha256 debería usarse para ambos. Pero si no se supone que son iguales, entonces se podría usar sha256 para RSAES-OAEP-DECRYPT y, por ejemplo, sha1 para MGF1. Y si ese es el caso, ¿para qué función se debe usar sha256? ¿Y qué algoritmo hash se supone que debe usarse para la otra función?

¿Y qué significa el BCE en este contexto? ECB es un modo de cifrado de bloque simétrico. Libro de códigos electrónicos. ¿Tal vez se supone que significa que Java trata con texto sin formato que son más grandes que el módulo? ¿Tal vez tal vez divide el texto simple en partes que son tan grandes como el módulo y luego encripta cada una con RSA y las concatena juntas? Solo estoy adivinando ...

    
pregunta neubert 22.08.2015 - 20:19
fuente

1 respuesta

1

Cotizando enlace ,

  

El valor predeterminado para OAEP es utilizar SHA-1 para MGF1. Tenga en cuenta que el hash   elegido no tiene mucho impacto en la seguridad de OAEP, por lo que   principalmente se dejará a este valor predeterminado.

     

Podemos probar esto fácilmente probándolo con "OAEPPadding" y    OAEPParameterSpec :

// --- we need a key pair to test encryption/decryption
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024); // speedy generation, but not secure anymore
KeyPair kp = kpg.generateKeyPair();
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic();
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate();

// --- encrypt given algorithm string
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey);
byte[] ct = oaepFromAlgo.doFinal("owlstead".getBytes(StandardCharsets.UTF_8));

// --- decrypt given OAEPParameterSpec
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
byte[] pt = oaepFromInit.doFinal(ct);
System.out.println(new String(pt, StandardCharsets.UTF_8));
     

El código fallará con una excepción relacionada con el relleno si sustituye a "SHA-256" por el MGF1 como parámetro.

     

La razón por la que se necesita el algoritmo extendido es la compatibilidad con otros algoritmos Cipher . Código escrito para, por ejemplo, "RSA/ECB/PKCS1Padding" no usa ningún parámetro, y mucho menos los parámetros OAEP. Por lo tanto, sin la cadena más larga, OAEP no puede funcionar como reemplazo en su lugar.

     

El modo de operación "ECB" no significa nada en este contexto, debería haber sido "None" o debería haberse omitido por completo. Solo puede cifrar un solo bloque mediante la implementación RSA del proveedor SunRSA.

    
respondido por el neubert 24.09.2015 - 21:03
fuente

Lea otras preguntas en las etiquetas