1# 使用ECC压缩/非压缩公钥格式转换(ArkTS) 2 3可通过指定ECC公钥数据,生成公钥对象(PubKey);也可从公钥对象(PubKey)中,获取ECC公钥数据。 4当前仅支持ECC算法中,满足X509规范的压缩/非压缩格式的公钥数据。此处的公钥数据应当是完整的X509公钥,对于只使用点数据的情况,请参考[使用ECC压缩/非压缩点格式转换](crypto-convert-compressed-or-uncompressed-ECC-point.md)。 5ECC的算法规格请查看[非对称密钥生成和转换规格:ECC](crypto-asym-key-generation-conversion-spec.md#ecc)。 6通过传入字符串参数format,可指定需要获取的ECC公钥数据格式。如果需要获取满足X509规范的压缩格式数据,则指定format为:"X509|COMPRESSED";需要获取非压缩格式,则指定format为:"X509|UNCOMPRESSED"。 7 8 9## 指定非压缩公钥数据转换为压缩公钥数据 10 111. 指定Uint8Array类型的ECC非压缩公钥数据,封装成DataBlob对象。 12公钥和私钥可只传入其中一个,此处示例以传入非压缩公钥为例。 132. 调用[cryptoFramework.createAsyKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateasykeygenerator),指定字符串参数'ECC_BrainPoolP256r1',创建密钥算法为ECC、密钥长度为256位的非对称密钥生成器(AsyKeyGenerator)。 143. 调用[AsyKeyGenerator.convertKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkey-3),传入封装后的DataBlob对象,生成非对称密钥对象(KeyPair)。 154. 调用[PubKey.getEncodedDer](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getencodedder12),设置参数为'X509|COMPRESSED',获取压缩公钥数据的字节流。 16 17```ts 18import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 19 20async function eccPubUncompressedToCompressed() { 21 let pkData = new Uint8Array([48, 90, 48, 20, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 9, 43, 36, 3, 3, 2, 8, 1, 1, 7, 3, 66, 0, 4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111, 40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206, 200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152]); 22 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 23 let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1'); 24 let keyPair = await generator.convertKey(pubKeyBlob, null); 25 let returnBlob = keyPair.pubKey.getEncodedDer('X509|COMPRESSED'); 26 console.info('returnBlob data:' + returnBlob.data); 27} 28```