1e41f4b71Sopenharmony_ci# Key Agreement Using DH
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [DH](crypto-key-agreement-overview.md#dh).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## How to Develop
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createAsyKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateasykeygenerator) and [AsyKeyGenerator.generateKeyPair](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatekeypair-1) to generate a DH asymmetric key pair (**KeyPair**) with the named DH group **modp1536**.
10e41f4b71Sopenharmony_ci   In addition to the example in this topic, [DH](crypto-asym-key-generation-conversion-spec.md#dh) and [Randomly Generating an Asymmetric Key Pair](crypto-generate-asym-key-pair-randomly.md) may help you better understand how to generate a DH asymmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below.
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci2. Use [cryptoFramework.createKeyAgreement](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekeyagreement) with the string parameter **'DH_modp1536'** to create a key agreement (**KeyAgreement**) instance.
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci3. Use [KeyAgreement.generateSecret](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesecret-1) to perform key agreement with the specified private key (**KeyPair.priKey**) and public key (**KeyPair.pubKey**), and return the shared secret.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci- Example: Perform key agreement using **await**.
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci  ```ts
19e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci  async function dhAwait() {
22e41f4b71Sopenharmony_ci    let keyGen = cryptoFramework.createAsyKeyGenerator('DH_modp1536');
23e41f4b71Sopenharmony_ci    // Randomly generate public-private key pair A.
24e41f4b71Sopenharmony_ci    let keyPairA = await keyGen.generateKeyPair();
25e41f4b71Sopenharmony_ci    // Randomly generate public-private key pair B with the same specifications.
26e41f4b71Sopenharmony_ci    let keyPairB = await keyGen.generateKeyPair();
27e41f4b71Sopenharmony_ci    let keyAgreement = cryptoFramework.createKeyAgreement('DH_modp1536');
28e41f4b71Sopenharmony_ci    // Use the public key of A and the private key of B to perform key agreement.
29e41f4b71Sopenharmony_ci    let secret1 = await keyAgreement.generateSecret(keyPairB.priKey, keyPairA.pubKey);
30e41f4b71Sopenharmony_ci    // Use the private key of A and the public key of B to perform key agreement.
31e41f4b71Sopenharmony_ci    let secret2 = await keyAgreement.generateSecret(keyPairA.priKey, keyPairB.pubKey);
32e41f4b71Sopenharmony_ci    // The two key agreement results should be the same.
33e41f4b71Sopenharmony_ci    if (secret1.data.toString() == secret2.data.toString()) {
34e41f4b71Sopenharmony_ci      console.info('DH success');
35e41f4b71Sopenharmony_ci      console.info('DH output is ' + secret1.data);
36e41f4b71Sopenharmony_ci    } else {
37e41f4b71Sopenharmony_ci      console.error('DH result is not equal');
38e41f4b71Sopenharmony_ci    }
39e41f4b71Sopenharmony_ci  }
40e41f4b71Sopenharmony_ci  ```
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci- Example (using synchronous APIs):
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci  ```ts
45e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci  function dhAwait() {
48e41f4b71Sopenharmony_ci    let keyGen = cryptoFramework.createAsyKeyGenerator('DH_modp1536');
49e41f4b71Sopenharmony_ci    // Randomly generate public-private key pair A.
50e41f4b71Sopenharmony_ci    let keyPairA = keyGen.generateKeyPairSync();
51e41f4b71Sopenharmony_ci    // Randomly generate public-private key pair B with the same specifications.
52e41f4b71Sopenharmony_ci    let keyPairB = keyGen.generateKeyPairSync();
53e41f4b71Sopenharmony_ci    let keyAgreement = cryptoFramework.createKeyAgreement('DH_modp1536');
54e41f4b71Sopenharmony_ci    // Use the public key of A and the private key of B to perform key agreement.
55e41f4b71Sopenharmony_ci    let secret1 = keyAgreement.generateSecretSync(keyPairB.priKey, keyPairA.pubKey);
56e41f4b71Sopenharmony_ci    // Use the private key of A and the public key of B to perform key agreement.
57e41f4b71Sopenharmony_ci    let secret2 = keyAgreement.generateSecretSync(keyPairA.priKey, keyPairB.pubKey);
58e41f4b71Sopenharmony_ci    // The two key agreement results should be the same.
59e41f4b71Sopenharmony_ci    if (secret1.data.toString() == secret2.data.toString()) {
60e41f4b71Sopenharmony_ci      console.info('DH success');
61e41f4b71Sopenharmony_ci      console.info('DH output is ' + secret1.data);
62e41f4b71Sopenharmony_ci    } else {
63e41f4b71Sopenharmony_ci      console.error('DH result is not equal');
64e41f4b71Sopenharmony_ci    }
65e41f4b71Sopenharmony_ci  }
66e41f4b71Sopenharmony_ci  ```
67