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