# Chiffrement

# Préface

Cette section contient des informations sur la façon d'utiliser ce document.

# Conventions Utilisées dans ce Document

Les conventions suivantes sont utilisées dans ce document pour identifier les types spécifiés d'information :

Type d'Information Convention Exemple
ÉlĂ©ments de l'API, tels que ressources Gras /authorization
Variables Italique entre accolades {ID}
Termes du glossaire Italique à la premiÚre occurrence ; défini dans le Glossaire Le but de l'API est de permettre des transactions financiÚres interopérables entre un Payeur (un payeur de fonds électroniques dans une transaction de paiement) situé dans un FSP (une entité fournissant un service financier numérique à un utilisateur final) et un Bénéficiaire (un destinataire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.
Documents de rĂ©fĂ©rence Italique Les informations utilisateur ne devraient, en gĂ©nĂ©ral, pas ĂȘtre utilisĂ©es par les dĂ©ploiements de l’API ; les mesures de sĂ©curitĂ© dĂ©taillĂ©es dans Signature de l'API et Chiffrement de l'API devraient ĂȘtre utilisĂ©es Ă  la place.

# Informations sur les versions du document

Version Date Description des modifications
1.1 2020-05-19 Cette version contient les modifications suivantes : 1. Les éléments ExtensionList de la Section 4 ont été mis à jour sur la base du problÚme Interpretation of the Data Model for the ExtensionList element (opens new window), afin de corriger le modÚle de données de l'objet extensionList.
1.0 2018-03-13 Version initiale

# Introduction

Ce document dĂ©taille les mĂ©thodes de sĂ©curitĂ© Ă  mettre en Ɠuvre pour l'Open API (Interface de Programmation Applicative) pour l'interopĂ©rabilitĂ© des FSP (Fournisseurs de Services Financiers) (ci-aprĂšs citĂ©e « l’API ») afin de garantir la confidentialitĂ© des messages API entre un client API et le serveur API.

En sĂ©curitĂ© de l'information, la confidentialitĂ© signifie que l'information n'est pas rendue disponible ou divulguĂ©e Ă  des personnes, entitĂ©s ou processus non autorisĂ©s (extrait de l’ISO27000The ISO 27000 Directory (opens new window)). Pour l’API, la confidentialitĂ© signifie que certains champs sensibles du contenu d’un message API ne peuvent ĂȘtre consultĂ©s ou identifiĂ©s de maniĂšre non autorisĂ©e ou non dĂ©tectĂ©e par les intermĂ©diaires impliquĂ©s dans la communication API. Autrement dit, si certains champs d’un message API sont chiffrĂ©s par le client API, alors seul le destinataire prĂ©vu de l’API peut dĂ©chiffrer ces champs.

Le chiffrement JSON Web Encryption (JWE, dĂ©fini dans la RFC 7516JSON Web Encryption (JWE) (opens new window)) doit ĂȘtre appliquĂ© Ă  l'API pour assurer la confidentialitĂ© de bout en bout des messages. Lorsqu'un client API envoie une requĂȘte HTTP (telle qu'une requĂȘte API ou un message de rappel) Ă  un contrepartie, le client API peut dĂ©terminer s'il existe des champs sensibles dans le message API Ă  protĂ©ger selon la rĂ©glementation ou le systĂšme local. S'il y a un champ Ă  protĂ©ger, le client API utilise JWE pour chiffrer la valeur de ce champ. Par la suite, le texte chiffrĂ© de ce champ sera transmis Ă  la contrepartie.

Pour prendre en charge le chiffrement de plusieurs champs d’un message API, le JWE est Ă©tendu dans ce document pour s’adapter aux exigences de l’API.


# Spécification Open API pour l'interopérabilité FSP

La SpĂ©cification Open API pour l’InteropĂ©rabilitĂ© FSP comprend les documents suivants.

# Documents logiques

# Documents de liaison REST asynchrones

# Intégrité des données, Confidentialité et Non-répudiation

# Documents généraux


# Définition du chiffrement de l'API

Cette section présente la technologie utilisée par le chiffrement de l'API, notamment :

  • Le format d'Ă©change de donnĂ©es pour les champs chiffrĂ©s d’un message API.
  • Le mĂ©canisme de chiffrement et de dĂ©chiffrement des champs.

# ModÚle de données pour le chiffrement

L’API utilise l’en-tĂȘte HTTP personnalisĂ© FSPIOP-Encryption pour reprĂ©senter les champs chiffrĂ©s d’un message API ; sa valeur est une sĂ©rialisation d’objet JSON. Le modĂšle de donnĂ©es de ce paramĂštre est dĂ©crit dans la Table 1, Table 2 et Table 3.

Note : Si FSPIOP-Encryption est prĂ©sent dans un message API, il doit Ă©galement ĂȘtre protĂ©gĂ© par la signature de l’API. Cela signifie que FSPIOP-Encryption doit ĂȘtre inclus dans le JWS Protected Header de la signature.

# Tableau 1
Nom Cardinalité Type Description
encryptedFields 1 EncryptedFields Informations sur les champs chiffrĂ©s d’un message API

Tableau 1 -- ModĂšle de donnĂ©es du champ d’en-tĂȘte HTTP FSPIOP-Encryption

# Tableau 2
Nom Cardinalité Type Description
encryptedField 1..* EncryptedField Informations sur un champ chiffrĂ© d’un message API

Tableau 2 -- ModÚle de données du type complexe EncryptedFields

# Tableau 3
Nom Cardinalité Type Description
fieldName 1 String(1..512) Cet Ă©lĂ©ment identifie le champ Ă  chiffrer dans le contenu d’un message API.
Comme la charge utile (payload) de l’API est une chaĂźne de sĂ©rialisation d’objet JSON, le nom du champ doit permettre d’identifier le chemin exact de l’élĂ©ment dans l’objet JSON. Un point (‘.’) est utilisĂ© pour sĂ©parer les Ă©lĂ©ments dans un chemin d’élĂ©ment. Par exemple, payer.personalInfo.dateOfBirth est une valeur valide pour cet Ă©lĂ©ment pour la requĂȘte API POST /quotes.
encryptedKey 1 String(1..512) Valeur de la clé de chiffrement de contenu chiffrée (CEK). Sa valeur est encodée en BASE64URL (Clé Chiffrée JWE).
S'il y a plusieurs champs Ă  chiffrer dans le message API, il est recommandĂ© d'utiliser la mĂȘme clĂ© chiffrĂ©e JWE pour simplifier la mise en Ɠuvre ; cependant, c'est une dĂ©cision propre Ă  chaque FSP selon leur implĂ©mentation.
protectedHeader 1 String(1..1024) Cet Ă©lĂ©ment identifie les paramĂštres d’en-tĂȘte appliquĂ©s Ă  JWE pour chiffrer le champ spĂ©cifiĂ©. Sa valeur est encodĂ©e en BASE64URL(UTF8(JWE Protected Header)).
Par exemple, si le JWE Protected Header appliqué au chiffrement est {"alg":"RSA-OAEP-256","enc":"A256GCM"}, alors la valeur est eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
initializationVector 1 String(1..128) Valeur du vecteur d'initialisation utilisé lors du chiffrement du texte clair. Sa valeur est encodée en BASE64URL (vecteur d'initialisation JWE).
authenticationTag 1 String(1..128) Valeur de l’étiquette d’authentification rĂ©sultant du chiffrement authentifiĂ© du texte en clair avec des DonnĂ©es AuthentifiĂ©es Additionnelles. Sa valeur est encodĂ©e en BASE64URL (Tag d’authentification JWE)

Tableau 3 -- ModÚle de données du type complexe EncryptedField

# Chiffrement des champs d’un message API

Cette section dĂ©crit le processus de chiffrement des champs de message. L’ordre des Ă©tapes n'est pas significatif dans les cas oĂč il n'y a pas de dĂ©pendances entre les entrĂ©es et sorties des Ă©tapes.

  1. DĂ©terminer l'algorithme utilisĂ© pour dĂ©terminer la valeur de la CEK (c'est l'algorithme enregistrĂ© dans le paramĂštre d'en-tĂȘte alg du JWE rĂ©sultant). Parce que la CEK doit ĂȘtre chiffrĂ©e avec la clĂ© publique du destinataire de l’API, l’algorithme disponible pour protĂ©ger la CEK dans l’API ne peut ĂȘtre que RSA-OAEP-256.
  2. S'il y a plusieurs champs à chiffrer dans le message API, exécuter les étapes 3-15 pour chaque champ.
  3. GĂ©nĂ©rer une CEK alĂ©atoire. Le FSP peut gĂ©nĂ©rer la valeur en utilisant sa propre application ou l’implĂ©mentation JWE employĂ©e.
  4. Chiffrer la CEK avec l’algorithme dĂ©terminĂ© par le paramĂštre d’en-tĂȘte JWE alg.
  5. Calculer la valeur encodée en BASE64URL(JWE Encrypted Key).
  6. GĂ©nĂ©rer un vecteur d'initialisation JWE alĂ©atoire de la taille correcte pour l’algorithme de chiffrement de contenu (si requis par l’algorithme) ; sinon, que le vecteur soit une sĂ©quence d’octets vide.
  7. Calculer la valeur encodée du vecteur d'initialisation BASE64URL(JWE Initialization Vector).
  8. Si un paramĂštre zip a Ă©tĂ© inclus, compresser le texte clair en utilisant l’algorithme de compression spĂ©cifiĂ© et que M soit la sĂ©quence d’octets reprĂ©sentant le texte clair compressĂ© ; sinon, que M soit la sĂ©quence d’octets reprĂ©sentant le texte clair.
  9. CrĂ©er l'objet JSON ou les objets contenant le jeu dĂ©sirĂ© de paramĂštres d’en-tĂȘte, qui constituent ensemble le JWE Protected Header. Outre le paramĂštre alg, le paramĂštre enc doit ĂȘtre inclus dans le protected header JWE. Les valeurs disponibles pour le paramĂštre enc dans l’API ne peuvent ĂȘtre que : A128GCM, A192GCM, A256GCM. A256GCM est recommandĂ©.
  10. Calculer la valeur encodée du protected header BASE64URL(UTF8(JWE Protected Header)).
  11. Prendre pour paramÚtre de Données Authentifiées Additionnelles la valeur ASCII(Encoded Protected Header).
  12. Chiffrer M en utilisant la CEK, le vecteur d'initialisation JWE et la DonnĂ©e AuthentifiĂ©e Additionnelle selon l’algorithme de chiffrement de contenu spĂ©cifiĂ© pour crĂ©er la valeur du texte chiffrĂ© JWE et le Tag d’authentification JWE (qui est la sortie du chiffrement).
  13. Calculer la valeur chiffrée encodée en BASE64URL (JWE Cipher Text).
  14. Calculer la valeur du tag d’authentification encodĂ©e en BASE64URL (JWE Authentication Tag).
  15. Calculer l'Ă©lĂ©ment encryptedField (voir la Table 3) pour le paramĂštre d'en-tĂȘte HTTP FSPIOP-Encryption.
  16. Calculer la valeur du paramĂštre d’en-tĂȘte HTTP FSPIOP-Encryption comme dĂ©crit dans la documentation FSPIOP API. La valeur de ce FSPIOP-Encryption est une chaĂźne de sĂ©rialisation d’objet JSON.

Note : Si JWE est utilisé pour chiffrer certains champs de la charge utile, alors le client API doit :

  1. Chiffrer les champs désirés.

  2. Remplacer la valeur de ces champs par le texte chiffré encodé dans la charge utile.

  3. Signer la charge utile.

# DĂ©chiffrement des champs d’un message API

Si le paramĂštre d’en-tĂȘte HTTP FSPIOP-Encryption (qui est aussi protĂ©gĂ© par la signature de l’API) est prĂ©sent, alors le destinataire du message API doit dĂ©chiffrer les champs chiffrĂ©s du message API aprĂšs que la signature de l’API ait Ă©tĂ© validĂ©e avec succĂšs. Le processus de dĂ©chiffrement est l’inverse du chiffrement. L’ordre des Ă©tapes n’est pas significatif dans les cas oĂč il n’y a pas de dĂ©pendance entre les entrĂ©es et sorties des Ă©tapes. S’il y a plusieurs champs chiffrĂ©s, alors tous les champs doivent ĂȘtre dĂ©chiffrĂ©s avec succĂšs ; sinon cela indique que le message API est invalide.

  1. Analyser le paramĂštre d’en-tĂȘte HTTP FSPIOP-Encryption pour obtenir les informations sur les champs chiffrĂ©s, y compris le nom du champ, le protected header JWE, la clĂ© chiffrĂ©e JWE, le vecteur d’initialisation JWE et le tag d’authentification JWE pour chaque champ. S’il y a plusieurs champs Ă  dĂ©chiffrer, exĂ©cuter les Ă©tapes 2-9 pour chaque champ.
  2. Obtenir le texte chiffré du champ chiffré en analysant la charge utile avec le chemin de champ spécifié. La valeur du champ spécifié est déjà encodée en BASE64URL.
  3. VĂ©rifier que la sĂ©quence d'octets rĂ©sultant du dĂ©codage du protected header JWE encodĂ© est une reprĂ©sentation UTF-8 valide d'un objet JSON conforme au format d’échange JSON (cf. RFC 7159The JavaScript Object Notation (JSON) Data Interchange Format (opens new window)) ; le protected header JWE doit ĂȘtre cet objet JSON.
  4. VĂ©rifier que les paramĂštres dans le protected header JWE comprennent et peuvent traiter tous les champs requis pour prendre en charge la spĂ©cification JWE ; par exemple, l’algorithme utilisĂ©.
  5. DĂ©terminer si l’algorithme spĂ©cifiĂ© par le paramĂštre alg du header correspond Ă  l’algorithme de la clĂ© publique / privĂ©e du destinataire de l’API.
  6. Déchiffrer la clé chiffrée JWE avec la clé privée du destinataire API pour obtenir la CEK JWE.
  7. Prendre pour paramÚtre de Données Authentifiées Additionnelles la valeur ASCII (Encoded Protected Header).
  8. DĂ©chiffrer le texte chiffrĂ© JWE en utilisant la CEK, le vecteur d'initialisation JWE, la DonnĂ©e AuthentifiĂ©e Additionnelle et le Tag d’authentification JWE avec l’algorithme de chiffrement spĂ©cifiĂ©, pour retourner le texte dĂ©chiffrĂ© tout en validant le tag d’authentification conformĂ©ment Ă  l’algorithme. Si le tag d’authentification JWE est incorrect, rejeter l’entrĂ©e sans procĂ©der au dĂ©chiffrement.
  9. Si un paramĂštre zip a Ă©tĂ© inclus, le destinataire de l’API doit dĂ©compresser le texte dĂ©chiffrĂ© en utilisant l'algorithme de compression spĂ©cifiĂ©.

# Exemples de chiffrement/dĂ©chiffrement d’API

Cette section utilise un processus typique de devis pour expliquer comment le chiffrement et le dĂ©chiffrement de l’API sont rĂ©alisĂ©s avec JWE. Puisque l’algorithme de clĂ© publique / privĂ©e du destinataire de l’API ne peut ĂȘtre que RSA, la clĂ© RSA utilisĂ©e pour cet exemple est reprĂ©sentĂ©e ci-dessous au format JSON Web Key (JWK, dĂ©fini dans la RFC 7517JSON Web Key(JWK) (opens new window)) (avec retours Ă  la ligne pour l’affichage uniquement) :

{
    "kty": "RSA",
    "n": "oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-
        BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9Le
        wND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-
        PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5tw
        XTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-
        FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-
        L5StowjzGy-_bq6Gw",
    "e": "AQAB",
    "d": "kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-
        WY5NWV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD93D
        t62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghkqDp0Vqj3
        kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vlt3UVe4WO3JkJOz
        lpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-
        VFs3VSndVTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ",
    "p": "1r52Xk46c-LsfB5P442p7atdPUrxQSy4mti_tZI3Mgf2EuFVbUoDBvaRQ-
        SWxkbk-
        moEzL7JXroSBjSrK3YIQgYdMgyAEPTPjXv_hI2_1eTSPVZfzL0lffNn03IXqWF5M
        DFuoUYE0hzb2vhrlN_rKrbfDIwUbTrjjgieRbwC6Cl0",
    "q":
        "wLb35x7hmQWZsWJmB_vle87ihgZ19S8lBEROLIsZG4ayZVe9Hi9gDVCOBmUDdaD
        YVTSNx_8Fyw1YYa9XGrGnDew00J28cRUoeBB_jKI1oma0Orv1T9aXIWxKwd4gvxF
        ImOWr3QRL9KEBRzk2RatUBnmDZJTIAfwTs0g68UZHvtc",
    "dp": "ZK-
        YwE7diUh0qR1tR7w8WHtolDx3MZ_OTowiFvgfeQ3SiresXjm9gZ5KLhMXvo-uz-
        KUJWDxS5pFQ_M0evdo1dKiRTjVw_x4NyqyXPM5nULPkcpU827rnpZzAJKpdhWAgq
        rXGKAECQH0Xt4taznjnd_zVpAmZZq60WPMBMfKcuE",
    "dq":
        "Dq0gfgJ1DdFGXiLvQEZnuKEN0UUmsJBxkjydc3j4ZYdBiMRAy86x0vHCjywcMlY
        Yg4yoC4YZa9hNVcsjqA3FeiL19rk8g6Qn29Tt0cj8qqyFpz9vNDBUfCAiJVeESOj
        JDZPYHdHY8v1b-o-Z2X5tvLx-TCekf7oxyeKDUqKWjis",
    "qi": "VIMpMYbPf47dT1w_zDUXfPimsSegnMOA1zTaX7aGk_8urY6R8-
        ZW1FxU7AlWAyLWybqq6t16VFd7hQd0y6flUK4SlOydB61gwanOsXGOAOv82cHq0E
        3eL4HrtZkUuKvnPrMnsUUFlfUdybVzxyjz9JF_XyaY14ardLSjf4L_FNY"
}

# Exemple de chiffrement

Le texte de message suivant est un exemple d’une requĂȘte POST /quotes sans chiffrement envoyĂ©e par le FSP Payeur Ă  un FSP BĂ©nĂ©ficiaire.

POST /quotes HTTP/1.1 
FSPIOP-Destination:5678
Accept:application/vnd.interoperability.quotes+json;version=1.0 
Content-Length:975 
Date:Tue, 23 May 2017 21:12:31 GMT 
FSPIOP-Source:1234 
Content-Type:application/vnd.interoperability.quotes+json;version=1.0
{
    "payee": {
        "partyIdInfo": { "partyIdType": "MSISDN", "partyIdentifier": "15295558888",
            "fspId": "5678" } },
    "amountType": "RECEIVE",
    "transactionType": { "scenario": "TRANSFER", "initiator": "PAYER",
        "subScenario": "P2P Transfer across MM systems", "initiatorType": "CONSUMER" },
    "note": "Ceci est un exemple de requĂȘte POST /quotes",
    "amount": { "amount": "150","currency": "USD" },
    "fees": { "amount": "1.5", "currency": "USD" },
    "extensionList": {
        "extension": [
            { "value": "value1", "key": "key1"},
            { "value": "value2", "key": "key2"},
            { "value": "value3", "key": "key3" }
        ]
    },
    "geoCode": { "latitude": "57.323889", "longitude": "125.520001"
    },
    "expiration": "2017-05-24T08:40:00.000-04:00",
    "payer": {
        "personalInfo": {
            "complexName": { "firstName": "Bill", "middleName": "Ben", "LastName": "Lee"
            }, "dateOfBirth": "1986-02-14" },
        "partyIdInfo": { "partyIdType": "MSISDN",
            "partySubIdOrType": "RegisteredCustomer", "partyIdentifier": "16135551212",
            "fspId": "1234"
        }, "name": "Bill Lee"
    }, "quoteId": "59e331fa-345f-4554-aac8-fcd8833f7d50",
    "transactionId": "36629a51-393a-4e3c-b347-c2cb57e1e1fc"
}

Dans ce cas, le FSP Payeur souhaite chiffrer deux champs du message API : payer et payee.partyIdInfo.partyIdentifier.

# Chiffrer les champs requis

Comme il y a deux champs à chiffrer, le FSP Payeur doit les chiffrer l’un aprùs l’autre.

# Chiffrer "payer"

Le FSP Payeur exécute les étapes suivantes pour chiffrer le champ payer dans le message API POST /quotes.

  1. DĂ©terminer l’algorithme utilisĂ© pour dĂ©terminer la CEK. Dans ce cas, supposons qu’il s’agit de RSA-OAEP-256.
  2. Générer une CEK aléatoire de 256 bits. Dans ce cas, sa valeur est (notation tableau JSON) :
191 100 167 60 2 248 21 136 172 39 145 120 102 7 73 31 166 66 114 199 219 157 104 162 7 253 10 105 33 136 57 167
  1. Chiffrer la CEK avec la clĂ© publique du FSP BĂ©nĂ©ficiaire indiquĂ©e au format JSON Web Key dans Exemples de chiffrement/dĂ©chiffrement d’API. Dans ce cas, la valeur chiffrĂ©e est :
22 210 45 47 ... (les valeurs restent identiques, inchangées pour la traduction)
  1. Calculer la valeur de la clé chiffrée en BASE64URL(JWE Encrypted Key). La valeur sera :
FtItL5lft09UGsIqG5gyw6MS63mMeOCBtHgVAC7EFXL7lH9LxipX-rpiD4j5g-BJb2yfj...

... (Le reste des exemples, tableaux, et représentations JSON sont laissés tels quels car ce sont des valeurs techniques universelles.)

# Exemple de déchiffrement

Dans cet exemple, le FSP BĂ©nĂ©ficiaire reçoit le message API POST /quotes du FSP Payeur. Le message est dĂ©crit dans le ModĂšle de donnĂ©es pour le chiffrement. Si le FSP BĂ©nĂ©ficiaire dĂ©tecte que le paramĂštre d'en-tĂȘte HTTP FSPIOP-Encryption est prĂ©sent dans le message, il sait alors que certains champs ont Ă©tĂ© chiffrĂ©s par le FSP Payeur. Le FSP BĂ©nĂ©ficiaire effectue alors les Ă©tapes suivantes pour dĂ©chiffrer les champs chiffrĂ©s.

# Analyser FSPIOP-Encryption

Le FSP BĂ©nĂ©ficiaire vĂ©rifie que la valeur de FSPIOP-Encryption est une reprĂ©sentation encodĂ©e UTF-8 d’un objet JSON valide selon la RFC 7159. Le FSP analyse alors le paramĂštre d’en-tĂȘte HTTP FSPIOP-Encryption pour obtenir les informations sur les champs chiffrĂ©s : nom du champ, Protected Header JWE, ClĂ© chiffrĂ©e JWE, Vecteur d'initialisation JWE, et Tag d’authentification JWE pour chaque champ.

# Déchiffrer les champs chiffrés

Dans ce cas, le FSP BĂ©nĂ©ficiaire extrait deux champs payer et payee.partyIdInfo.partyIdentifier de l’en-tĂȘte HTTP FSPIOP-Encryption, puis les dĂ©chiffre l’un aprĂšs l’autre.

# Déchiffrer payer

Le FSP Payeur exécute les étapes suivantes pour déchiffrer le champ payer dans le message API POST /quotes.

  1. Obtenir le Protected Header JWE encodé BASE64URL depuis FSPIOP-Encryption pour le champ payer. Sa valeur est :
eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0 

... (Les étapes détaillées sont conservées, simplement traduites ; les valeurs techniques ne changent pas.)


# Table des tableaux