1# Signing and Signature Recovery Using an RSA Key Pair (PKCS1 Mode) (ArkTS)
2
3
4For details about the algorithm specifications, see [RSA](crypto-sign-sig-verify-overview.md#rsa).
5
6
7**Signing**
8
9
101. 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**).
11
12   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.
13
142. 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**.
15
163. Use [Sign.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-3) to initialize the **Sign** instance with the private key (**PriKey**).
17
184. Use [Sign.sign](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#sign-1) to generate a signature.
19
20
21**Signature Verification**
22
23
241. 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.
25
262. Use [Verify.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-5) to initialize the **Verify** instance using the public key (**PubKey**).
27
283. Use [Verify.recover](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#recover12) to recover the original data from the signature.
29
30- Example (using asynchronous APIs):
31
32  ```ts
33  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
34  import { buffer } from '@kit.ArkTS';
35  // The plaintext is split into input1 and input2.
36  let input1: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
37  async function signMessagePromise(priKey: cryptoFramework.PriKey) {
38    let signAlg = "RSA1024|PKCS1|NoHash|OnlySign";
39    let signer = cryptoFramework.createSign(signAlg);
40    await signer.init(priKey);
41    let signData = await signer.sign(input1);
42    return signData;
43  }
44  async function verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) {
45    let verifyAlg = "RSA1024|PKCS1|NoHash|Recover";
46    let verifier = cryptoFramework.createVerify(verifyAlg);
47    await verifier.init(pubKey);
48    let rawSignData = await verifier.recover(signMessageBlob);
49    return rawSignData;
50  }
51  async function main() {
52    let keyGenAlg = "RSA1024";
53    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
54    let keyPair = await generator.generateKeyPair();
55    let signData = await signMessagePromise(keyPair.priKey);
56    let rawSignData = await verifyMessagePromise(signData, keyPair.pubKey);
57    if (rawSignData != null) {
58      console.info('recover result: ' + rawSignData.data);
59    } else {
60      console.error("get verify recover result fail!");
61    }
62  }
63  ```
64
65- Example (using synchronous APIs):
66
67  ```ts
68  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
69  import { buffer } from '@kit.ArkTS';
70  // The plaintext is split into input1 and input2.
71  let input1: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
72  function signMessagePromise(priKey: cryptoFramework.PriKey) {
73    let signAlg = "RSA1024|PKCS1|NoHash|OnlySign";
74    let signer = cryptoFramework.createSign(signAlg);
75    signer.initSync(priKey);
76    let signData = signer.signSync(input1);
77    return signData;
78  }
79  function verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) {
80    let verifyAlg = "RSA1024|PKCS1|NoHash|Recover";
81    let verifier = cryptoFramework.createVerify(verifyAlg);
82    verifier.initSync(pubKey);
83    let rawSignData = verifier.recoverSync(signMessageBlob);
84    return rawSignData;
85  }
86  function main() {
87    let keyGenAlg = "RSA1024";
88    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
89    let keyPair = generator.generateKeyPairSync();
90    let signData = signMessagePromise(keyPair.priKey);
91    let rawSignData = verifyMessagePromise(signData, keyPair.pubKey);
92    if (rawSignData != null) {
93      console.info('recover result: ' + rawSignData.data);
94    } else {
95      console.error("get verify recover result fail!");
96    }
97  }
98  ```
99