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