1e41f4b71Sopenharmony_ci# Encryption and Decryption with an RSA Asymmetric Key Pair (PKCS1_OAEP)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [RSA](crypto-asym-encrypt-decrypt-spec.md#rsa).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci**Encryption**
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createAsyKeyGeneratorBySpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateasykeygeneratorbyspec10) and [AsyKeyGeneratorBySpec.generateKeyPair](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatekeypair-3) to generate an RSA asymmetric key pair (**KeyPair**) based on the specified key parameters.
11e41f4b71Sopenharmony_ci   
12e41f4b71Sopenharmony_ci   In addition to the example in this topic, [RSA](crypto-asym-key-generation-conversion-spec.md#rsa) and [Generating an Asymmetric Key Pair Based on Key Parameters](crypto-generate-asym-key-pair-from-key-spec.md) may help you better understand how to generate an RSA asymmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below.
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci2. Use [cryptoFramework.createCipher](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatecipher) with the string parameter **'RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1'** to create a **Cipher** instance. The key type is **RSA2048**, padding mode is **PKCS1_OAEP**, MD algorithm is **SHA256**, and mask digest algorithm is **MGF1_SHA1**.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci3. Use [Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1) to initialize the **Cipher** instance. In **Cipher.init**, set **opMode** to **CryptoMode.ENCRYPT_MODE** (encryption) and **key** to **KeyPair.PubKey** (the key used for encryption).
17e41f4b71Sopenharmony_ci   
18e41f4b71Sopenharmony_ci   No encryption parameter is required for asymmetric key pairs. Therefore, pass in **null** in **params**.
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci4. Use [Cipher.setCipherSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#setcipherspec10) to set the parameter **pSource** for **PKCS1_OAEP** before **Cipher.doFinal** is called. You can use [Cipher.getCipherSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getcipherspec10) to obtain OAEP-related parameters.
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci5. Use [Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1) to pass in the plaintext and encrypt it.
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci**Decryption**
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci1. If RSA is used, the **Cipher** instance cannot be initialized repeatedly. Use [cryptoFramework.createCipher](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatecipher) to create a new **Cipher** instance.
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci2. Use [Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1) to initialize the **Cipher** instance. In **Cipher.init**, set **opMode** to **CryptoMode.DECRYPT_MODE** (decryption) and **key** to **KeyPair.PriKey** (the key used for decryption). When PKCS1 mode is used, pass in **null** in **params**.
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ci3. Use [Cipher.setCipherSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#setcipherspec10) to set the parameter **pSource** for **PKCS1_OAEP** before **Cipher.doFinal** is called. The value of **pSource** must be the same as that set in encryption. You can use [Cipher.getCipherSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getcipherspec10) to obtain OAEP-related parameters.
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci4. Use [Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1) to pass in the ciphertext and decrypt it.
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci- Example (using asynchronous APIs):
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci  ```ts
40e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
41e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
42e41f4b71Sopenharmony_ci  // Construct the RSA key pair parameter based on the key pair specifications.
43e41f4b71Sopenharmony_ci  function genRsaKeyPairSpec(nIn: bigint, eIn: bigint, dIn: bigint) {
44e41f4b71Sopenharmony_ci    let rsaCommSpec: cryptoFramework.RSACommonParamsSpec = {
45e41f4b71Sopenharmony_ci      n: nIn,
46e41f4b71Sopenharmony_ci      algName: "RSA",
47e41f4b71Sopenharmony_ci      specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC
48e41f4b71Sopenharmony_ci    };
49e41f4b71Sopenharmony_ci    let rsaKeyPairSpec: cryptoFramework.RSAKeyPairSpec = {
50e41f4b71Sopenharmony_ci      params: rsaCommSpec,
51e41f4b71Sopenharmony_ci      sk: dIn,
52e41f4b71Sopenharmony_ci      pk: eIn,
53e41f4b71Sopenharmony_ci      algName: "RSA",
54e41f4b71Sopenharmony_ci      specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC
55e41f4b71Sopenharmony_ci    };
56e41f4b71Sopenharmony_ci    return rsaKeyPairSpec;
57e41f4b71Sopenharmony_ci  }
58e41f4b71Sopenharmony_ci  // Generate the RSA2048 key pair parameter.
59e41f4b71Sopenharmony_ci  function genRsa2048KeyPairSpec(): cryptoFramework.RSAKeyPairSpec {
60e41f4b71Sopenharmony_ci    let nIn = BigInt("0x9260d0750ae117eee55c3f3deaba74917521a262ee76007cdf8a56755ad73a1598a1408410a01434c3f5bc54a88b57fa19fc4328daea0750a4c44e88cff3b2382621b80f670464433e4336e6d003e8cd65bff211da144b88291c2259a00a72b711c116ef7686e8fee34e4d933c868187bdc26f7be071493c86f7a5941c3510806ad67b0f94d88f5cf5c02a092821d8626e8932b65c5bd8c92049c210932b7afa7ac59c0e886ae5c1edb00d8ce2c57633db26bd6639bff73cee82be9275c402b4cf2a4388da8cf8c64eefe1c5a0f5ab8057c39fa5c0589c3e253f0960332300f94bea44877b588e1edbde97cf2360727a09b775262d7ee552b3319b9266f05a25");
61e41f4b71Sopenharmony_ci    let eIn = BigInt("0x010001");
62e41f4b71Sopenharmony_ci    let dIn = BigInt("0x6a7df2ca63ead4dda191d614b6b385e0d9056a3d6d5cfe07db1daabee022db08212d97613d3328e0267c9dd23d787abde2afcb306aeb7dfce69246cc73f5c87fdf06030179a2114b767db1f083ff841c025d7dc00cd82435b9a90f695369e94df23d2ce458bc3b3283ad8bba2b8fa1ba62e2dce9accff3799aae7c840016f3ba8e0048c0b6cc4339af7161003a5beb864a0164b2c1c9237b64bc87556994351b27506c33d4bcdfce0f9c491a7d6b0628c7c852be4f0a9c3132b2ed3a2c8881e9aab07e20e17deb074691be677776a78b5c502e05d9bdde72126b3738695e2dd1a0a98a14247c65d8a7ee79432a092cb0721a12df798e44f7cfce0c498147a9b1");
63e41f4b71Sopenharmony_ci    return genRsaKeyPairSpec(nIn, eIn, dIn);
64e41f4b71Sopenharmony_ci  }
65e41f4b71Sopenharmony_ci  async function rsaUseSpecDecryptOAEPPromise() {
66e41f4b71Sopenharmony_ci    let plan = "This is a test";
67e41f4b71Sopenharmony_ci    // Generate the RSA key pair parameter (Rsa2048KeyPairSpec) object.
68e41f4b71Sopenharmony_ci    let rsaKeyPairSpec = genRsa2048KeyPairSpec();
69e41f4b71Sopenharmony_ci    // Generate an RSA key pair based on the RSA key pair parameter.
70e41f4b71Sopenharmony_ci    let rsaGeneratorSpec = cryptoFramework.createAsyKeyGeneratorBySpec(rsaKeyPairSpec);
71e41f4b71Sopenharmony_ci    let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
72e41f4b71Sopenharmony_ci    let decoder = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
73e41f4b71Sopenharmony_ci    // Set pSource, which defines the encoding input P filled by OAEP.
74e41f4b71Sopenharmony_ci    let pSource = new Uint8Array([1, 2, 3, 4]);
75e41f4b71Sopenharmony_ci    let input: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(plan, 'utf-8').buffer) };
76e41f4b71Sopenharmony_ci    // Generate a key pair.
77e41f4b71Sopenharmony_ci    let keyPair = await rsaGeneratorSpec.generateKeyPair();
78e41f4b71Sopenharmony_ci    // Initialize the encryption operation.
79e41f4b71Sopenharmony_ci    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null);
80e41f4b71Sopenharmony_ci    // Set and obtain the Cipher specifications after the initialization.
81e41f4b71Sopenharmony_ci    cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
82e41f4b71Sopenharmony_ci    let retP = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR);
83e41f4b71Sopenharmony_ci    // Check whether the obtained PSource is the same as the PSource set.
84e41f4b71Sopenharmony_ci    if (retP.toString() != pSource.toString()) {
85e41f4b71Sopenharmony_ci      console.error("error init pSource" + retP);
86e41f4b71Sopenharmony_ci    } else {
87e41f4b71Sopenharmony_ci      console.info("pSource changed ==" + retP);
88e41f4b71Sopenharmony_ci    }
89e41f4b71Sopenharmony_ci    // Obtain other OAEP parameters.
90e41f4b71Sopenharmony_ci    let md = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
91e41f4b71Sopenharmony_ci    console.info("md == " + md);
92e41f4b71Sopenharmony_ci    let mgf = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF_NAME_STR);
93e41f4b71Sopenharmony_ci    console.info("mgf == " + mgf);
94e41f4b71Sopenharmony_ci    let mgf1Md = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_MD_STR);
95e41f4b71Sopenharmony_ci    console.info("mgf1Md == " + mgf1Md);
96e41f4b71Sopenharmony_ci    let cipherDataBlob = await cipher.doFinal(input);
97e41f4b71Sopenharmony_ci    // The get() and set() operations can be performed before the init() operation of the Cipher object and are equivalent to those after the init() operation. For example, set and get the decoder.
98e41f4b71Sopenharmony_ci    decoder.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
99e41f4b71Sopenharmony_ci    retP = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR);
100e41f4b71Sopenharmony_ci    // Check whether the obtained PSource is the same as the PSource set.
101e41f4b71Sopenharmony_ci    if (retP.toString() != pSource.toString()) {
102e41f4b71Sopenharmony_ci      console.error("error init pSource" + retP);
103e41f4b71Sopenharmony_ci    } else {
104e41f4b71Sopenharmony_ci      console.info("pSource changed ==" + retP);
105e41f4b71Sopenharmony_ci    }
106e41f4b71Sopenharmony_ci    // Obtain other OAEP parameters.
107e41f4b71Sopenharmony_ci    md = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
108e41f4b71Sopenharmony_ci    console.info("md == " + md);
109e41f4b71Sopenharmony_ci    mgf = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF_NAME_STR);
110e41f4b71Sopenharmony_ci    console.info("mgf == " + mgf);
111e41f4b71Sopenharmony_ci    mgf1Md = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_MD_STR);
112e41f4b71Sopenharmony_ci    console.info("mgf1Md == " + mgf1Md);
113e41f4b71Sopenharmony_ci    // Initialize the decryption operation.
114e41f4b71Sopenharmony_ci    await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null);
115e41f4b71Sopenharmony_ci    let decodeData = await decoder.doFinal(cipherDataBlob);
116e41f4b71Sopenharmony_ci    // The decryption is successful.
117e41f4b71Sopenharmony_ci    if (decodeData.data.toString() === input.data.toString()) {
118e41f4b71Sopenharmony_ci      console.info("oaep decrypt success");
119e41f4b71Sopenharmony_ci    } else {
120e41f4b71Sopenharmony_ci      console.error("oaep decrypt fail");
121e41f4b71Sopenharmony_ci    }
122e41f4b71Sopenharmony_ci  }
123e41f4b71Sopenharmony_ci  ```
124e41f4b71Sopenharmony_ci
125e41f4b71Sopenharmony_ci- Example (using synchronous APIs):
126e41f4b71Sopenharmony_ci
127e41f4b71Sopenharmony_ci  ```ts
128e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
129e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
130e41f4b71Sopenharmony_ci  // Construct the RSA key pair parameter based on the key pair specifications.
131e41f4b71Sopenharmony_ci  function genRsaKeyPairSpec(nIn: bigint, eIn: bigint, dIn: bigint) {
132e41f4b71Sopenharmony_ci    let rsaCommSpec: cryptoFramework.RSACommonParamsSpec = {
133e41f4b71Sopenharmony_ci      n: nIn,
134e41f4b71Sopenharmony_ci      algName: "RSA",
135e41f4b71Sopenharmony_ci      specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC
136e41f4b71Sopenharmony_ci    };
137e41f4b71Sopenharmony_ci    let rsaKeyPairSpec: cryptoFramework.RSAKeyPairSpec = {
138e41f4b71Sopenharmony_ci      params: rsaCommSpec,
139e41f4b71Sopenharmony_ci      sk: dIn,
140e41f4b71Sopenharmony_ci      pk: eIn,
141e41f4b71Sopenharmony_ci      algName: "RSA",
142e41f4b71Sopenharmony_ci      specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC
143e41f4b71Sopenharmony_ci    };
144e41f4b71Sopenharmony_ci    return rsaKeyPairSpec;
145e41f4b71Sopenharmony_ci  }
146e41f4b71Sopenharmony_ci  // Generate the RSA2048 key pair parameter.
147e41f4b71Sopenharmony_ci  function genRsa2048KeyPairSpec(): cryptoFramework.RSAKeyPairSpec {
148e41f4b71Sopenharmony_ci    let nIn = BigInt("0x9260d0750ae117eee55c3f3deaba74917521a262ee76007cdf8a56755ad73a1598a1408410a01434c3f5bc54a88b57fa19fc4328daea0750a4c44e88cff3b2382621b80f670464433e4336e6d003e8cd65bff211da144b88291c2259a00a72b711c116ef7686e8fee34e4d933c868187bdc26f7be071493c86f7a5941c3510806ad67b0f94d88f5cf5c02a092821d8626e8932b65c5bd8c92049c210932b7afa7ac59c0e886ae5c1edb00d8ce2c57633db26bd6639bff73cee82be9275c402b4cf2a4388da8cf8c64eefe1c5a0f5ab8057c39fa5c0589c3e253f0960332300f94bea44877b588e1edbde97cf2360727a09b775262d7ee552b3319b9266f05a25");
149e41f4b71Sopenharmony_ci    let eIn = BigInt("0x010001");
150e41f4b71Sopenharmony_ci    let dIn = BigInt("0x6a7df2ca63ead4dda191d614b6b385e0d9056a3d6d5cfe07db1daabee022db08212d97613d3328e0267c9dd23d787abde2afcb306aeb7dfce69246cc73f5c87fdf06030179a2114b767db1f083ff841c025d7dc00cd82435b9a90f695369e94df23d2ce458bc3b3283ad8bba2b8fa1ba62e2dce9accff3799aae7c840016f3ba8e0048c0b6cc4339af7161003a5beb864a0164b2c1c9237b64bc87556994351b27506c33d4bcdfce0f9c491a7d6b0628c7c852be4f0a9c3132b2ed3a2c8881e9aab07e20e17deb074691be677776a78b5c502e05d9bdde72126b3738695e2dd1a0a98a14247c65d8a7ee79432a092cb0721a12df798e44f7cfce0c498147a9b1");
151e41f4b71Sopenharmony_ci    return genRsaKeyPairSpec(nIn, eIn, dIn);
152e41f4b71Sopenharmony_ci  }
153e41f4b71Sopenharmony_ci  async function main() {
154e41f4b71Sopenharmony_ci    let plan = "This is a test";
155e41f4b71Sopenharmony_ci    // Generate the RSA key pair parameter (Rsa2048KeyPairSpec) object.
156e41f4b71Sopenharmony_ci    let rsaKeyPairSpec = genRsa2048KeyPairSpec();
157e41f4b71Sopenharmony_ci    // Generate an RSA key pair based on the RSA key pair parameter.
158e41f4b71Sopenharmony_ci    let rsaGeneratorSpec = cryptoFramework.createAsyKeyGeneratorBySpec(rsaKeyPairSpec);
159e41f4b71Sopenharmony_ci    let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
160e41f4b71Sopenharmony_ci    let decoder = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
161e41f4b71Sopenharmony_ci    // Set pSource, which defines the encoding input P filled by OAEP.
162e41f4b71Sopenharmony_ci    let pSource = new Uint8Array([1, 2, 3, 4]);
163e41f4b71Sopenharmony_ci    let input: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(plan, 'utf-8').buffer) };
164e41f4b71Sopenharmony_ci    // Generate a key pair.
165e41f4b71Sopenharmony_ci    let keyPair = await rsaGeneratorSpec.generateKeyPair();
166e41f4b71Sopenharmony_ci    // Initialize the encryption operation.
167e41f4b71Sopenharmony_ci    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null);
168e41f4b71Sopenharmony_ci    // Set and obtain the Cipher specifications after the initialization.
169e41f4b71Sopenharmony_ci    cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
170e41f4b71Sopenharmony_ci    let retP = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR);
171e41f4b71Sopenharmony_ci    // Check whether the obtained PSource is the same as the PSource set.
172e41f4b71Sopenharmony_ci    if (retP.toString() != pSource.toString()) {
173e41f4b71Sopenharmony_ci      console.error("error init pSource" + retP);
174e41f4b71Sopenharmony_ci    } else {
175e41f4b71Sopenharmony_ci      console.info("pSource changed ==" + retP);
176e41f4b71Sopenharmony_ci    }
177e41f4b71Sopenharmony_ci    // Obtain other OAEP parameters.
178e41f4b71Sopenharmony_ci    let md = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
179e41f4b71Sopenharmony_ci    console.info("md == " + md);
180e41f4b71Sopenharmony_ci    let mgf = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF_NAME_STR);
181e41f4b71Sopenharmony_ci    console.info("mgf == " + mgf);
182e41f4b71Sopenharmony_ci    let mgf1Md = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_MD_STR);
183e41f4b71Sopenharmony_ci    console.info("mgf1Md == " + mgf1Md);
184e41f4b71Sopenharmony_ci    let cipherDataBlob = cipher.doFinalSync(input);
185e41f4b71Sopenharmony_ci    // The get() and set() operations can be performed before the init() operation of the Cipher object and are equivalent to those after the init() operation. For example, set and get the decoder.
186e41f4b71Sopenharmony_ci    decoder.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
187e41f4b71Sopenharmony_ci    retP = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR);
188e41f4b71Sopenharmony_ci    // Check whether the obtained PSource is the same as the PSource set.
189e41f4b71Sopenharmony_ci    if (retP.toString() != pSource.toString()) {
190e41f4b71Sopenharmony_ci      console.error("error init pSource" + retP);
191e41f4b71Sopenharmony_ci    } else {
192e41f4b71Sopenharmony_ci      console.info("pSource changed ==" + retP);
193e41f4b71Sopenharmony_ci    }
194e41f4b71Sopenharmony_ci    // Obtain other OAEP parameters.
195e41f4b71Sopenharmony_ci    md = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
196e41f4b71Sopenharmony_ci    console.info("md == " + md);
197e41f4b71Sopenharmony_ci    mgf = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF_NAME_STR);
198e41f4b71Sopenharmony_ci    console.info("mgf == " + mgf);
199e41f4b71Sopenharmony_ci    mgf1Md = decoder.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_MD_STR);
200e41f4b71Sopenharmony_ci    console.info("mgf1Md == " + mgf1Md);
201e41f4b71Sopenharmony_ci    // Initialize the decryption operation.
202e41f4b71Sopenharmony_ci    decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null);
203e41f4b71Sopenharmony_ci    let decodeData = decoder.doFinalSync(cipherDataBlob);
204e41f4b71Sopenharmony_ci    // The decryption is successful.
205e41f4b71Sopenharmony_ci    if (decodeData.data.toString() === input.data.toString()) {
206e41f4b71Sopenharmony_ci      console.info("oaep decrypt success");
207e41f4b71Sopenharmony_ci    } else {
208e41f4b71Sopenharmony_ci      console.error("oaep decrypt fail");
209e41f4b71Sopenharmony_ci    }
210e41f4b71Sopenharmony_ci  }
211e41f4b71Sopenharmony_ci  ```
212