• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用AES对称密钥(CBC模式)加解密(ArkTS)
2
3对应的算法规格请查看[对称密钥加解密算法规格:AES](crypto-sym-encrypt-decrypt-spec.md#aes)。
4
5**加密**
6
71. 调用[cryptoFramework.createSymKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatesymkeygenerator)、[SymKeyGenerator.generateSymKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesymkey-1),生成密钥算法为AES、密钥长度为128位的对称密钥(SymKey)。
8
9   如何生成AES对称密钥,开发者可参考下文示例,并结合[对称密钥生成和转换规格:AES](crypto-sym-key-generation-conversion-spec.md#aes)和[随机生成对称密钥](crypto-generate-sym-key-randomly.md)理解,参考文档与当前示例可能存在入参差异,请在阅读时注意区分。
10
112. 调用[cryptoFramework.createCipher](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatecipher),指定字符串参数'AES128|CBC|PKCS7',创建对称密钥类型为AES128、分组模式为CBC、填充模式为PKCS7的Cipher实例,用于完成加密操作。
12
133. 调用[Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1),设置模式为加密(CryptoMode.ENCRYPT_MODE),指定加密密钥(SymKey)和CBC模式对应的加密参数(IvParamsSpec),初始化加密Cipher实例。
14
154. 加密内容较短时,可以不调用update,直接调用[Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1),获取加密后的数据。
16
17**解密**
18
191. 调用[cryptoFramework.createCipher](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatecipher),指定字符串参数'AES128|CBC|PKCS7',创建对称密钥类型为AES128、分组模式为CBC、填充模式为PKCS7的Cipher实例,用于完成解密操作。
20
212. 调用[Cipher.init](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#init-1),设置模式为解密(CryptoMode.DECRYPT_MODE),指定解密密钥(SymKey)和CBC模式对应的解密参数(IvParamsSpec),初始化解密Cipher实例。
22
233. 解密内容较短时,可以不调用update,直接调用[Cipher.doFinal](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#dofinal-1),获取解密后的数据。
24
25- 异步方法示例:
26
27  ```ts
28  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
29  import { buffer } from '@kit.ArkTS';
30
31  function generateRandom(len: number) {
32    let rand = cryptoFramework.createRandom();
33    let generateRandSync = rand.generateRandomSync(len);
34    return generateRandSync;
35  }
36
37  function genIvParamsSpec() {
38    let ivBlob = generateRandom(16);
39    let ivParamsSpec: cryptoFramework.IvParamsSpec = {
40      algName: "IvParamsSpec",
41      iv: ivBlob
42    };
43    return ivParamsSpec;
44  }
45  let iv = genIvParamsSpec();
46  // 加密消息。
47  async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
48    let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
49    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
50    let cipherData = await cipher.doFinal(plainText);
51    return cipherData;
52  }
53  // 解密消息。
54  async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
55    let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');
56    await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
57    let decryptData = await decoder.doFinal(cipherText);
58    return decryptData;
59  }
60
61  async function genSymKeyByData(symKeyData: Uint8Array) {
62    let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
63    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
64    let symKey = await aesGenerator.convertKey(symKeyBlob);
65    console.info('convertKey success');
66    return symKey;
67  }
68
69  async function aesCBC() {
70    try {
71      let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
72      let symKey = await genSymKeyByData(keyData);
73      let message = "This is a test";
74      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
75      let encryptText = await encryptMessagePromise(symKey, plainText);
76      let decryptText = await decryptMessagePromise(symKey, encryptText);
77      if (plainText.data.toString() === decryptText.data.toString()) {
78        console.info('decrypt ok');
79        console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
80      } else {
81        console.error('decrypt failed');
82      }
83    } catch (error) {
84      console.error(`AES CBC “${error}“, error code: ${error.code}`);
85    }
86  }
87  ```
88
89- 同步方法示例:
90
91  ```ts
92  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
93  import { buffer } from '@kit.ArkTS';
94
95  function generateRandom(len: number) {
96    let rand = cryptoFramework.createRandom();
97    let generateRandSync = rand.generateRandomSync(len);
98    return generateRandSync;
99  }
100
101  function genIvParamsSpec() {
102    let ivBlob = generateRandom(16);
103    let ivParamsSpec: cryptoFramework.IvParamsSpec = {
104      algName: "IvParamsSpec",
105      iv: ivBlob
106    };
107    return ivParamsSpec;
108  }
109  let iv = genIvParamsSpec();
110  // 加密消息。
111  function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
112    let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
113    cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
114    let cipherData = cipher.doFinalSync(plainText);
115    return cipherData;
116  }
117  // 解密消息。
118  function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
119    let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');
120    decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
121    let decryptData = decoder.doFinalSync(cipherText);
122    return decryptData;
123  }
124
125  function genSymKeyByData(symKeyData: Uint8Array) {
126    let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
127    let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
128    let symKey = aesGenerator.convertKeySync(symKeyBlob);
129    console.info('convertKeySync success');
130    return symKey;
131  }
132
133  function main() {
134    try {
135      let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
136      let symKey = genSymKeyByData(keyData);
137      let message = "This is a test";
138      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
139      let encryptText = encryptMessage(symKey, plainText);
140      let decryptText = decryptMessage(symKey, encryptText);
141      if (plainText.data.toString() === decryptText.data.toString()) {
142        console.info('decrypt ok');
143        console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
144      } else {
145        console.error('decrypt failed');
146      }
147    } catch (error) {
148      console.error(`AES CBC “${error}“, error code: ${error.code}`);
149    }
150  }
151  ```