• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 加解密(ArkTS)
2
3以AES 128密钥为例,完成加解密。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法](huks-key-generation-overview.md#支持的算法)。
4
5## 开发步骤
6
7**生成密钥**
8
91. 指定密钥别名。
10
112. 初始化密钥属性集。
12
133. 调用[generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9)生成密钥,具体请参考[密钥生成](huks-key-generation-overview.md)。
14
15除此之外,开发者也可以参考[密钥导入](huks-key-import-overview.md),导入已有的密钥。
16
17**加密**
18
191. 获取密钥别名。
20
212. 获取待加密的数据。
22
233. 获取加密[算法参数配置](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksparam)。
24   在下方示例中,使用算法AES进行加密时,必须要选择其对应分组模式以及填充模式,用例中选取的分组模式为CBC、填充模式为PKCS7,此时必须要填参数IV。
25
264. 调用[initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9)初始化密钥会话,并获取会话的句柄handle。
27
285. 调用[finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9)结束密钥会话,获取加密后的密文。
29
30**解密**
31
321. 获取密钥别名。
33
342. 获取待解密的密文。
35
363. 获取解密[算法参数配置](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksparam)。
37   不同的解密算法需写入不同的参数配置,具体请参考[密钥生成支持的算法](huks-key-generation-overview.md#支持的算法)。
38
39   在下方示例中,使用算法AES进行解密时,必须要选择其对应分组模式以及填充模式,用例中选取的分组模式为CBC、填充模式为PKCS7,此时必须要填参数IV。
40
414. 调用[initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9)初始化密钥会话,并获取会话的句柄handle。
42
435. 调用[finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9)结束密钥会话,获取解密后的数据。
44
45**删除密钥**
46
47当密钥废弃不用时,需要调用[deleteKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksdeletekeyitem9)删除密钥,具体请参考[密钥删除](huks-delete-key-arkts.md)。
48
49```ts
50/*
51 * 以下以AES 128密钥的Promise操作使用为例
52 */
53import huks from '@ohos.security.huks';
54import { BusinessError } from '@ohos.base';
55let aesKeyAlias = 'test_aesKeyAlias';
56let handle:number;
57let plainText = '123456';
58let IV = '001122334455';
59let cipherData:Uint8Array;
60function StringToUint8Array(str: String) {
61    let arr:number[]=new Array();
62    for (let i = 0, j = str.length; i < j; ++i) {
63        arr.push(str.charCodeAt(i));
64    }
65    return new Uint8Array(arr);
66}
67function Uint8ArrayToString(fileData:Uint8Array) {
68    let dataString = '';
69    for (let i = 0; i < fileData.length; i++) {
70        dataString += String.fromCharCode(fileData[i]);
71    }
72    return dataString;
73}
74function GetAesGenerateProperties() {
75    let properties: Array<huks.HuksParam> = new Array();
76    let index = 0;
77    properties[index++] = {
78        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
79        value: huks.HuksKeyAlg.HUKS_ALG_AES
80    };
81    properties[index++] = {
82        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
83        value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128
84    };
85    properties[index++] = {
86        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
87        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT |
88        huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
89    }
90    return properties;
91}
92function GetAesEncryptProperties() {
93    let properties: Array<huks.HuksParam> = new Array();
94    let index = 0;
95    properties[index++] = {
96        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
97        value: huks.HuksKeyAlg.HUKS_ALG_AES
98    };
99    properties[index++] = {
100        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
101        value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128
102    };
103    properties[index++] = {
104        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
105        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT
106    }
107    properties[index++] = {
108        tag: huks.HuksTag.HUKS_TAG_PADDING,
109        value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7
110    }
111    properties[index++] = {
112        tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
113        value: huks.HuksCipherMode.HUKS_MODE_CBC
114    }
115    properties[index++] = {
116        tag: huks.HuksTag.HUKS_TAG_IV,
117        value: StringToUint8Array(IV)
118    }
119    return properties;
120}
121function GetAesDecryptProperties() {
122    let properties: Array<huks.HuksParam> = new Array();
123    let index = 0;
124    properties[index++] = {
125        tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
126        value: huks.HuksKeyAlg.HUKS_ALG_AES
127    };
128    properties[index++] = {
129        tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
130        value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128
131    };
132    properties[index++] = {
133        tag: huks.HuksTag.HUKS_TAG_PURPOSE,
134        value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
135    }
136    properties[index++] = {
137        tag: huks.HuksTag.HUKS_TAG_PADDING,
138        value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7
139    }
140    properties[index++] = {
141        tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
142        value: huks.HuksCipherMode.HUKS_MODE_CBC
143    }
144    properties[index++] = {
145        tag: huks.HuksTag.HUKS_TAG_IV,
146        value: StringToUint8Array(IV)
147    }
148    return properties;
149}
150async function GenerateAesKey() {
151    /*
152    * 模拟生成密钥场景
153    * 1. 确定密钥别名
154    */
155    /*
156    * 2. 获取生成密钥算法参数配置
157    */
158    let genProperties = GetAesGenerateProperties();
159    let options: huks.HuksOptions = {
160        properties: genProperties
161    }
162    /*
163    * 3. 调用generateKeyItem
164    */
165    await huks.generateKeyItem(aesKeyAlias, options)
166    .then((data) => {
167        console.info(`promise: generate AES Key success, data = ${JSON.stringify(data)}`);
168    }).catch((error: BusinessError)=>{
169        console.error(`promise: generate AES Key failed` + error);
170    })
171}
172async function EncryptData() {
173    /*
174    * 模拟加密场景
175    * 1. 获取密钥别名
176    */
177    /*
178    * 2. 获取待加密的数据
179    */
180    /*
181    * 3. 获取加密算法参数配置
182    */
183    let encryptProperties = GetAesEncryptProperties();
184    let options: huks.HuksOptions = {
185        properties: encryptProperties,
186        inData: StringToUint8Array(plainText)
187    }
188    /*
189    * 4. 调用initSession获取handle
190    */
191    await huks.initSession(aesKeyAlias, options)
192    .then((data) => {
193        handle = data.handle;
194    }).catch((error: BusinessError)=>{
195        console.error(`promise: init encryptdata failed` + error);
196    })
197    /*
198    * 5. 调用finishSession获取加密后的密文
199    */
200    await huks.finishSession(handle, options)
201    .then((data) => {
202        console.info(`promise: encrypt data success, data is `+ Uint8ArrayToString(data.outData as Uint8Array));
203        cipherData = data.outData as Uint8Array;
204    }).catch((error: BusinessError)=>{
205        console.error(`promise: encrypt data failed` + error);
206    })
207}
208async function DecryptData() {
209    /*
210    * 模拟解密场景
211    * 1. 获取密钥别名
212    */
213    /*
214    * 2. 获取待解密的密文
215    */
216    /*
217    * 3. 获取解密算法参数配置
218    */
219    let decryptOptions = GetAesDecryptProperties()
220    let options: huks.HuksOptions = {
221        properties: decryptOptions,
222        inData: cipherData
223    }
224    /*
225    * 4. 调用initSession获取handle
226    */
227    await huks.initSession(aesKeyAlias, options)
228    .then((data) => {
229        handle = data.handle;
230    }).catch((error: BusinessError)=>{
231        console.error(`promise: init decryptdata failed` + error);
232    })
233    /*
234    * 5. 调用finishSession获取解密后的数据
235    */
236    await huks.finishSession(handle, options)
237    .then((data) => {
238        console.info(`promise: decrypt data success, data is ` + Uint8ArrayToString(data.outData as Uint8Array));
239    }).catch((error: BusinessError)=>{
240        console.error(`promise: decrypt data failed` + error);
241    })
242}
243async function DeleteKey() {
244    /*
245    * 模拟删除密钥场景
246    * 1. 获取密钥别名
247    */
248    let emptyOptions: huks.HuksOptions = {
249        properties: []
250    }
251    /*
252    * 2. 调用deleteKeyItem删除密钥
253    */
254    await huks.deleteKeyItem(aesKeyAlias, emptyOptions)
255    .then((data) => {
256        console.info(`promise: delete data success`);
257    }).catch((error: BusinessError)=>{
258        console.error(`promise: delete data failed` + error);
259    })
260}
261```
262