• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 指定二进制数据转换对称密钥(ArkTS)
2
3<!--Kit: Crypto Architecture Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @zxz--3-->
6<!--Designer: @lanming-->
7<!--Tester: @PAFT-->
8<!--Adviser: @zengyawen-->
9
10以3DES和HMAC为例,根据指定的对称密钥二进制数据,生成对称密钥对象(SymKey),即将外部或存储的二进制数据转换为算法库的密钥对象,该对象可用于后续的加解密等操作。
11
12## 指定二进制数据转换3DES密钥
13
14对应的算法规格请查看[对称密钥生成和转换规格:3DES](crypto-sym-key-generation-conversion-spec.md#3des)。
15
161. 获取3DES二进制密钥数据,封装成[DataBlob](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#datablob)对象。
17
182. 调用[cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator),指定字符串参数'3DES192',创建密钥算法为3DES、密钥长度为192位的对称密钥生成器(SymKeyGenerator)。
19
203. 调用[SymKeyGenerator.convertKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkey-1),根据指定的对称密钥二进制数据生成对称密钥对象(SymKey)。
21
224. 调用[SymKey.getEncoded](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getencoded),获取密钥对象的二进制数据。
23
24- 以使用callback方式生成3DES密钥为例:
25
26  ```ts
27  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
28  import { BusinessError } from '@kit.BasicServicesKit';
29
30  function genKeyMaterialBlob(): cryptoFramework.DataBlob {
31    let arr = [
32      0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
33      0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
34      0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // 密钥长度为192位,即24字节。
35    let keyMaterial = new Uint8Array(arr);
36    return { data: keyMaterial };
37  }
38
39  function testConvertSymKey() {
40    // 创建SymKeyGenerator实例。
41    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
42    // 根据指定的数据生成对称密钥。
43    let keyMaterialBlob = genKeyMaterialBlob();
44    try {
45      symKeyGenerator.convertKey(keyMaterialBlob, (error, key) => {
46        if (error) { // 如果业务逻辑执行失败,则callback的第一个参数返回错误信息,即异步抛出异常。
47          let e: BusinessError = error as BusinessError;
48          console.error(`convertKey error, ${e.code}, ${e.message}`);
49          return;
50        }
51        console.info('key algName:' + key.algName);
52        console.info('key format:' + key.format);
53        let encodedKey = key.getEncoded(); // 获取对称密钥对象的二进制数据,并以字节数组形式输出。长度为24字节。
54        console.info('key getEncoded hex: ' + encodedKey.data);
55      })
56    } catch (error) { // 参数检查发现错误立即抛出异常。
57      let e: BusinessError = error as BusinessError;
58      console.error(`convertKey failed, ${e.code}, ${e.message}`);
59    }
60  }
61  ```
62
63- 同步方法(调用方法[convertKeySync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkeysync12)):
64  ```ts
65  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
66
67  function genKeyMaterialBlob(): cryptoFramework.DataBlob {
68    let arr = [
69      0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
70      0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
71      0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // 密钥长度为192位,即24字节。
72    let keyMaterial = new Uint8Array(arr);
73    return { data: keyMaterial };
74  }
75
76  function testConvertSymKey() {
77    // 创建SymKeyGenerator实例。
78    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
79    // 根据指定的数据生成对称密钥。
80    let keyMaterialBlob = genKeyMaterialBlob();
81    let key = symKeyGenerator.convertKeySync(keyMaterialBlob);
82    let encodedKey = key.getEncoded(); // 获取对称密钥对象的二进制数据,并以字节数组形式输出。长度为24字节。
83    console.info('key getEncoded hex' + encodedKey.data);
84  }
85  ```
86
87## 指定二进制数据转换HMAC密钥
88
89请查看[对称密钥生成和转换规格:HMAC](crypto-sym-key-generation-conversion-spec.md#hmac)。
90
911. 获取HMAC二进制密钥并封装成DataBlob对象。
92
932. 调用[cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator),指定字符串参数'HMAC',创建密钥算法为HMAC、密钥长度为[1, 32768]位的对称密钥生成器(SymKeyGenerator)。
94
953. 调用[SymKeyGenerator.convertKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkey-1),根据指定的对称密钥二进制数据,生成对称密钥对象(SymKey)。
96
974. 调用[SymKey.getEncoded](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getencoded),获取密钥的二进制数据。
98
99- 以生成HMAC密钥为例,使用await方式:
100
101  ```ts
102  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
103  import { buffer } from '@kit.ArkTS';
104
105  async function testConvertHmacKey() {
106    // 对称密钥长度64字节,512比特。
107    let keyMessage = '12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh';
108    let keyBlob: cryptoFramework.DataBlob = {
109      data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer)
110    }
111    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC');
112    let key = await symKeyGenerator.convertKey(keyBlob);
113    let encodedKey = key.getEncoded();
114    console.info('key encoded data:' + encodedKey.data);
115  }
116  ```
117
118- 同步方法(调用方法[convertKeySync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkeysync12)):
119  ```ts
120  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
121  import { buffer } from '@kit.ArkTS';
122
123  function testConvertKeySync() {
124    // 对称密钥长度64字节,512比特。
125    let keyMessage = '12345678abcdefgh12345678abcdefgh12345678abcdefgh12345678abcdefgh';
126    let keyBlob: cryptoFramework.DataBlob = {
127      data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer)
128    }
129    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC');
130    let key = symKeyGenerator.convertKeySync(keyBlob);
131    let encodedKey = key.getEncoded();
132    console.info('key encoded data:' + encodedKey.data);
133  }
134  ```
135