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