Java a un mode appelé RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
. Qu'est ce que ça veut dire?
RFC3447 , Normes de cryptographie à clé publique (PKCS) # 1: Spécifications de cryptographie RSA version 2.1 , section 7.1.2 L'opération de déchiffrement indique que Hash et MGF sont tous deux des options pour RSAES-OAEP-DECRYPT. MGF est sa propre fonction, définie dans Section B.2.1 MGF1 et qui a aussi sa propre "option" Hash.
Peut-être que l'option "Hash" dans RSAES-OAEP-DECRYPT et MGF1 est censée être la même ou peut-être pas, cela 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 s'ils ne sont pas censés être les mêmes, vous pouvez utiliser sha256 pour RSAES-OAEP-DECRYPT et, par exemple, sha1 pour MGF1. Et si tel est le cas, à quoi sert la fonction 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étrique. Livre de code électronique. Peut-être que cela est censé signifier comment Java traite les textes en clair qui sont plus grands que le modulo? ensemble? Je devine juste ..
La valeur par défaut pour OAEP est d'utiliser SHA-1 pour MGF1. Notez que le hachage choisi n'a pas beaucoup d'impact sur la sécurité de OAEP, donc il sera principalement 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 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));
Le code échouera avec une exception liée au remplissage si vous remplacez "SHA-256"
pour le MGF1 comme paramètre.
La raison pour laquelle l'algorithme étendu est nécessaire est la compatibilité avec d'autres algorithmes Cipher
. Code écrit pour par ex. "RSA/ECB/PKCS1Padding"
n'utilise aucun paramètre, sans parler des paramètres OAEP. Ainsi, sans la chaîne plus longue, OAEP ne peut pas fonctionner comme remplacement de remplacement.
Le mode de fonctionnement "ECB"
ne signifie rien dans ce contexte, cela aurait dû être "None"
ou il aurait dû être complètement supprimé. Vous ne pouvez chiffrer qu'un seul bloc à l'aide de l'implémentation RSA du fournisseur SunRSA.
Si vous souhaitez chiffrer davantage de données, créez une clé symétrique aléatoire (AES) et chiffrez-la à l'aide d'OAEP. Utilisez ensuite la clé AES pour crypter vos données spécifiques. C'est ce qu'on appelle un cryptosystème hybride car il utilise à la fois des primitives asymétriques et symétriques pour crypter les données.
Notez que OAEP n'est pas pris en charge dans JDK 7 (1.7) ou version antérieure. OAEP est inclus dans les exigences d'implémentation pour Java runtimes depuis Java 8:
RSA/ECB/OAEPWithSHA-1AndMGF1Padding
(1024, 2048)RSA/ECB/OAEPWithSHA-256AndMGF1Padding
(1024, 2048)Certains protocoles peuvent vous obliger à utiliser SHA-256 ou SHA-512 dans le rembourrage, car SHA-1 est déconseillé pour la plupart des utilisations - même s'il n'est pas directement vulnérable à ce type d'utilisation.