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