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