décomposer RSA / BCE / OAEPWITHSHA-256ANDMGF1PADDING

Donc, Java a un mode appelé RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING . Qu’est ce que ça veut dire?

RFC3447 , Normes de cryptographie à clé publique (PKCS) n ° 1: Spécifications de cryptographie RSA, version 2.1 , section 7.1.2. L’opération de décryptage indique que les fonctions Hash et MGF sont deux options pour RSAES-OAEP-DECRYPT. MGF est sa propre fonction, définie dans la Section B.2.1, MGF1 , qui possède également sa propre “option” de hachage.

Peut-être que les “options” de hachage dans RSAES-OAEP-DECRYPT et MGF1 sont supposées être les mêmes ou peut-être pas, ce n’est pas clair pour moi. S’ils le sont, je suppose que lorsque vous avez RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING cela signifie que sha256 doit être utilisé pour les deux. Mais si elles ne sont pas supposées être identiques, vous pourriez utiliser sha256 pour RSAES-OAEP-DECRYPT et, par exemple, sha1 pour MGF1. Et si tel est le cas, quelle fonction est censé utiliser sha256? Et quel algorithme de hachage est censé être utilisé pour l’autre fonction?

Et que signifie la BCE dans ce contexte? ECB est un mode de chiffrement par bloc symésortingque. Livre de code électronique. C’est peut-être censé vouloir dire comment Java traite les textes en clair qui sont plus gros que le modulo? Comme peut-être, scinde-t-il le texte en morceaux de la taille du modulo, puis les chiffre avec RSA et les concatène? Je suis juste en train de deviner..

La valeur par défaut pour OAEP consiste à utiliser SHA-1 pour MGF1. Notez que le hachage choisi n’a pas beaucoup d’impact sur la sécurité de OAEP, il sera donc généralement laissé à cette valeur par défaut.

Nous pouvons facilement tester cela en le testant contre "OAEPPadding" et 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 ssortingng 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 Ssortingng(pt, StandardCharsets.UTF_8)); 

Le code échouera avec une exception liée au remplissage si vous substituez "SHA-256" au paramètre MGF1.

La raison pour laquelle l’algorithme étendu est nécessaire est la compatibilité avec d’autres algorithmes de Cipher . Le code écrit pour, par exemple, "RSA/ECB/PKCS1Padding" n’utilise aucun paramètre, encore moins les parameters OAEP. Donc, sans la chaîne plus longue, OAEP ne peut pas remplacer le remplacement.


Le mode de fonctionnement "ECB" ne signifie rien dans ce contexte, il aurait dû être "None" ou il aurait dû être laissé de côté. Vous ne pouvez crypter qu’un seul bloc à l’aide de l’implémentation RSA du fournisseur SunRSA.

Si vous souhaitez chiffrer plus de données, créez une clé symésortingque aléatoire (AES) et chiffrez-la à l’aide de OAEP. Utilisez ensuite la clé AES pour chiffrer vos données spécifiques. C’est ce qu’on appelle un cryptosystème hybride car il utilise des primitives asymésortingques et symésortingques pour chiffrer les données.