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