1e41f4b71Sopenharmony_ci# Signing and Signature Recovery Using an RSA Key Pair (PKCS1 Mode) (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [RSA](crypto-sign-sig-verify-overview.md#rsa).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci**Signing**
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_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 1024-bit RSA key pair (**KeyPair**) with two primes. The **KeyPair** instance consists of a public key (**PubKey**) and a private key (**PriKey**).
11e41f4b71Sopenharmony_ci   
12e41f4b71Sopenharmony_ci   In addition to the example in this topic, [RSA](crypto-asym-key-generation-conversion-spec.md#rsa) and [Randomly Generating an Asymmetric Key Pair](crypto-generate-asym-key-pair-randomly.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.createSign](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesign) with the string parameter **'RSA1024|PKCS1|SHA256|SignOnly'** to create a **Sign** instance for signing without the MD. The key type is **RSA1024**, the padding mode is **PKCS1**, and the MD algorithm is **SHA256**.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci3. Use [Sign.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-3) to initialize the **Sign** instance with the private key (**PriKey**).
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci4. Use [Sign.sign](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#sign-2) to generate a signature.
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci**Signature Verification**
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createVerify](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateverify) with the string parameter **'RSA1024|PKCS1|SHA256|Recover'** to create a **Verify** instance. The key parameters must be the same as that used to create the **Sign** instance.
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci2. Use [Verify.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-5) to initialize the **Verify** instance using the public key (**PubKey**).
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci3. Use [Verify.recover](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#recover12) to recover the original data from the signature.
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci- Example (using asynchronous APIs):
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ci  ```ts
33e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
34e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
35e41f4b71Sopenharmony_ci  // The plaintext is split into input1 and input2.
36e41f4b71Sopenharmony_ci  let input1: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
37e41f4b71Sopenharmony_ci  async function signMessagePromise(priKey: cryptoFramework.PriKey) {
38e41f4b71Sopenharmony_ci    let signAlg = "RSA1024|PKCS1|NoHash|OnlySign";
39e41f4b71Sopenharmony_ci    let signer = cryptoFramework.createSign(signAlg);
40e41f4b71Sopenharmony_ci    await signer.init(priKey);
41e41f4b71Sopenharmony_ci    let signData = await signer.sign(input1);
42e41f4b71Sopenharmony_ci    return signData;
43e41f4b71Sopenharmony_ci  }
44e41f4b71Sopenharmony_ci  async function verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) {
45e41f4b71Sopenharmony_ci    let verifyAlg = "RSA1024|PKCS1|NoHash|Recover";
46e41f4b71Sopenharmony_ci    let verifier = cryptoFramework.createVerify(verifyAlg);
47e41f4b71Sopenharmony_ci    await verifier.init(pubKey);
48e41f4b71Sopenharmony_ci    let rawSignData = await verifier.recover(signMessageBlob);
49e41f4b71Sopenharmony_ci    return rawSignData;
50e41f4b71Sopenharmony_ci  }
51e41f4b71Sopenharmony_ci  async function main() {
52e41f4b71Sopenharmony_ci    let keyGenAlg = "RSA1024";
53e41f4b71Sopenharmony_ci    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
54e41f4b71Sopenharmony_ci    let keyPair = await generator.generateKeyPair();
55e41f4b71Sopenharmony_ci    let signData = await signMessagePromise(keyPair.priKey);
56e41f4b71Sopenharmony_ci    let rawSignData = await verifyMessagePromise(signData, keyPair.pubKey);
57e41f4b71Sopenharmony_ci    if (rawSignData != null) {
58e41f4b71Sopenharmony_ci      console.info('recover result: ' + rawSignData.data);
59e41f4b71Sopenharmony_ci    } else {
60e41f4b71Sopenharmony_ci      console.error("get verify recover result fail!");
61e41f4b71Sopenharmony_ci    }
62e41f4b71Sopenharmony_ci  }
63e41f4b71Sopenharmony_ci  ```
64e41f4b71Sopenharmony_ci
65e41f4b71Sopenharmony_ci- Example (using synchronous APIs):
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci  ```ts
68e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
69e41f4b71Sopenharmony_ci  import { buffer } from '@kit.ArkTS';
70e41f4b71Sopenharmony_ci  // The plaintext is split into input1 and input2.
71e41f4b71Sopenharmony_ci  let input1: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
72e41f4b71Sopenharmony_ci  function signMessagePromise(priKey: cryptoFramework.PriKey) {
73e41f4b71Sopenharmony_ci    let signAlg = "RSA1024|PKCS1|NoHash|OnlySign";
74e41f4b71Sopenharmony_ci    let signer = cryptoFramework.createSign(signAlg);
75e41f4b71Sopenharmony_ci    signer.initSync(priKey);
76e41f4b71Sopenharmony_ci    let signData = signer.signSync(input1);
77e41f4b71Sopenharmony_ci    return signData;
78e41f4b71Sopenharmony_ci  }
79e41f4b71Sopenharmony_ci  function verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) {
80e41f4b71Sopenharmony_ci    let verifyAlg = "RSA1024|PKCS1|NoHash|Recover";
81e41f4b71Sopenharmony_ci    let verifier = cryptoFramework.createVerify(verifyAlg);
82e41f4b71Sopenharmony_ci    verifier.initSync(pubKey);
83e41f4b71Sopenharmony_ci    let rawSignData = verifier.recoverSync(signMessageBlob);
84e41f4b71Sopenharmony_ci    return rawSignData;
85e41f4b71Sopenharmony_ci  }
86e41f4b71Sopenharmony_ci  function main() {
87e41f4b71Sopenharmony_ci    let keyGenAlg = "RSA1024";
88e41f4b71Sopenharmony_ci    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
89e41f4b71Sopenharmony_ci    let keyPair = generator.generateKeyPairSync();
90e41f4b71Sopenharmony_ci    let signData = signMessagePromise(keyPair.priKey);
91e41f4b71Sopenharmony_ci    let rawSignData = verifyMessagePromise(signData, keyPair.pubKey);
92e41f4b71Sopenharmony_ci    if (rawSignData != null) {
93e41f4b71Sopenharmony_ci      console.info('recover result: ' + rawSignData.data);
94e41f4b71Sopenharmony_ci    } else {
95e41f4b71Sopenharmony_ci      console.error("get verify recover result fail!");
96e41f4b71Sopenharmony_ci    }
97e41f4b71Sopenharmony_ci  }
98e41f4b71Sopenharmony_ci  ```
99