1# 使用RSA密钥对分段签名验签(PKCS1模式)(ArkTS)
2
3
4对应的算法规格请查看[签名验签算法规格:RSA](crypto-sign-sig-verify-overview.md#rsa)。
5
6
7**签名**
8
9
101. 调用[cryptoFramework.createAsyKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateasykeygenerator)、[AsyKeyGenerator.generateKeyPair](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatekeypair-1),生成密钥算法为RSA、密钥长度为1024位、素数个数为2的非对称密钥对象(KeyPair),包括公钥(PubKey)和私钥(PriKey)。
11
12   如何生成RSA非对称密钥,开发者可参考下文示例,并结合[非对称密钥生成和转换规格:RSA](crypto-asym-key-generation-conversion-spec.md#rsa)和[随机生成非对称密钥对](crypto-generate-asym-key-pair-randomly.md)理解,参考文档与当前示例可能存在入参差异,请在阅读时注意区分。
13
142. 调用[cryptoFramework.createSign](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesign),指定字符串参数'RSA1024|PKCS1|SHA256',创建非对称密钥类型为RSA1024、填充模式为PKCS1、摘要算法为SHA256的Sign实例,用于完成签名操作。
15
163. 调用[Sign.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-3),使用私钥(PriKey)初始化Sign实例。
17
184. 将一次传入数据量设置为64字节,多次调用[Sign.update](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#update-3),传入待签名的数据。
19   当前单次update长度没有限制,开发者可以根据数据量判断如何调用update。
20
215. 调用[Sign.sign](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#sign-1),生成数据签名。
22
23
24**验签**
25
26
271. 调用[cryptoFramework.createVerify](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateverify),指定字符串参数'RSA1024|PKCS1|SHA256',与签名的Sign实例保持一致。创建Verify实例,用于完成验签操作。
28
292. 调用[Verify.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-5),使用公钥(PubKey)初始化Verify实例。
30
313. 调用[Verify.update](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#update-5),传入待验证的数据。
32   当前单次update长度没有限制,开发者可以根据数据量判断如何调用update。
33
344. 调用[Verify.verify](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#verify-1),对数据进行验签。
35
36
37- 异步方法示例:
38
39  ```ts
40  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
41  import { buffer } from '@kit.ArkTS';
42
43  async function signMessageBySegment(priKey: cryptoFramework.PriKey, plainText: Uint8Array) {
44    let signAlg = "RSA1024|PKCS1|SHA256";
45    let signer = cryptoFramework.createSign(signAlg);
46    await signer.init(priKey);
47    let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
48    for (let i = 0; i < plainText.length; i += textSplitLen) {
49      let updateMessage = plainText.subarray(i, i + textSplitLen);
50      let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };
51      // 分段update
52      await signer.update(updateMessageBlob);
53    }
54    // 已通过分段传入所有明文,故此处sign传入null
55    let signData = await signer.sign(null);
56    return signData;
57  }
58  async function verifyMessagBySegment(pubKey: cryptoFramework.PubKey, plainText: Uint8Array, signMessageBlob: cryptoFramework.DataBlob) {
59    let verifyAlg = "RSA1024|PKCS1|SHA256";
60    let verifier = cryptoFramework.createVerify(verifyAlg);
61    await verifier.init(pubKey);
62    let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
63    for (let i = 0; i < plainText.length; i += textSplitLen) {
64      let updateMessage = plainText.subarray(i, i + textSplitLen);
65      let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };
66      // 分段update
67      await verifier.update(updateMessageBlob);
68    }
69    // 已通过分段传入所有明文,故此处verify第一个参数传入null
70    let res = await verifier.verify(null, signMessageBlob);
71    console.info("verify result is " + res);
72    return res;
73  }
74  async function rsaSignatureBySegment() {
75    let message = "This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
76      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
77      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
78      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
79      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
80      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
81      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
82      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!";
83    let keyGenAlg = "RSA1024";
84    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
85    let keyPair = await generator.generateKeyPair();
86    let messageData = new Uint8Array(buffer.from(message, 'utf-8').buffer);
87    let signData = await signMessageBySegment(keyPair.priKey, messageData);
88    let verifyResult = await verifyMessagBySegment(keyPair.pubKey, messageData, signData);
89    if (verifyResult == true) {
90      console.info('verify success');
91    } else {
92      console.error('verify failed');
93    }
94  }
95  ```
96
97- 同步方法示例:
98
99  ```ts
100  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
101  import { buffer } from '@kit.ArkTS';
102
103  function signMessageBySegment(priKey: cryptoFramework.PriKey, plainText: Uint8Array) {
104    let signAlg = "RSA1024|PKCS1|SHA256";
105    let signer = cryptoFramework.createSign(signAlg);
106    signer.initSync(priKey);
107    let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
108    for (let i = 0; i < plainText.length; i += textSplitLen) {
109      let updateMessage = plainText.subarray(i, i + textSplitLen);
110      let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };
111      // 分段update
112      signer.updateSync(updateMessageBlob);
113    }
114    // 已通过分段传入所有明文,故此处sign传入null
115    let signData = signer.signSync(null);
116    return signData;
117  }
118  function verifyMessagBySegment(pubKey: cryptoFramework.PubKey, plainText: Uint8Array, signMessageBlob: cryptoFramework.DataBlob) {
119    let verifyAlg = "RSA1024|PKCS1|SHA256";
120    let verifier = cryptoFramework.createVerify(verifyAlg);
121    verifier.initSync(pubKey);
122    let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
123    for (let i = 0; i < plainText.length; i += textSplitLen) {
124      let updateMessage = plainText.subarray(i, i + textSplitLen);
125      let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };
126      // 分段update
127      verifier.updateSync(updateMessageBlob);
128    }
129    // 已通过分段传入所有明文,故此处verify第一个参数传入null
130    let res = verifier.verifySync(null, signMessageBlob);
131    console.info("verify result is " + res);
132    return res;
133  }
134  function rsaSignatureBySegment() {
135    let message = "This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
136      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
137      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
138      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
139      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
140      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
141      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!" +
142      "This is a long plainTest! This is a long plainTest! This is a long plainTest! This is a long plainTest!";
143    let keyGenAlg = "RSA1024";
144    let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
145    let keyPair = generator.generateKeyPairSync();
146    let messageData = new Uint8Array(buffer.from(message, 'utf-8').buffer);
147    let signData = signMessageBySegment(keyPair.priKey, messageData);
148    let verifyResult = verifyMessagBySegment(keyPair.pubKey, messageData, signData);
149    if (verifyResult == true) {
150      console.info('verify success');
151    } else {
152      console.error('verify failed');
153    }
154  }
155  ```
156