1/* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16// [Start async_symmetry_encrypt_decrypt_sm4_cbc] 17import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 18import { buffer } from '@kit.ArkTS'; 19 20function generateRandom(len: number) { 21 let rand = cryptoFramework.createRandom(); 22 let generateRandSync = rand.generateRandomSync(len); 23 return generateRandSync; 24} 25 26function genIvParamsSpec() { 27 let ivBlob = generateRandom(16); // 16 bytes 28 let ivParamsSpec: cryptoFramework.IvParamsSpec = { 29 algName: 'IvParamsSpec', 30 iv: ivBlob 31 }; 32 return ivParamsSpec; 33} 34 35let iv = genIvParamsSpec(); 36 37// 加密消息 38async function encryptMessagePromise(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) { 39 let cipher = cryptoFramework.createCipher('SM4_128|CBC|PKCS7'); 40 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv); 41 let encryptData = await cipher.doFinal(plainText); 42 return encryptData; 43} 44 45// 解密消息 46async function decryptMessagePromise(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) { 47 let decoder = cryptoFramework.createCipher('SM4_128|CBC|PKCS7'); 48 await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv); 49 let decryptData = await decoder.doFinal(cipherText); 50 return decryptData; 51} 52 53async function genSymKeyByData(symKeyData: Uint8Array) { 54 let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData }; 55 let symGenerator = cryptoFramework.createSymKeyGenerator('SM4_128'); 56 let symKey = await symGenerator.convertKey(symKeyBlob); 57 console.info('convertKey success'); 58 return symKey; 59} 60 61async function main() { 62 try { 63 let keyData = new Uint8Array([7, 154, 52, 176, 4, 236, 150, 43, 237, 9, 145, 166, 141, 174, 224, 131]); 64 let symKey = await genSymKeyByData(keyData); 65 let message = 'This is a test'; 66 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 67 let encryptText = await encryptMessagePromise(symKey, plainText); 68 let decryptText = await decryptMessagePromise(symKey, encryptText); 69 if (plainText.data.toString() === decryptText.data.toString()) { 70 console.info('decrypt ok'); 71 console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8')); 72 } else { 73 console.error('decrypt failed'); 74 } 75 } catch (error) { 76 console.error(`SM4 “${error}“, error code: ${error.code}`); 77 } 78} 79// [End async_symmetry_encrypt_decrypt_sm4_cbc] 80 81@Entry 82@Component 83struct Index { 84 @State message: string = 'Encryption Decryption Guidance SM4 ArkTs'; 85 86 build() { 87 Column({ space: 12 }) { 88 Text(this.message).fontSize(20).fontWeight(FontWeight.Bold) 89 Button($r('app.string.call_sm4_cbc_asynchronous')) 90 .width('70%') 91 .onClick(async () => { 92 try { 93 await main(); 94 this.message = 'SM4_CBCSuccess'; 95 } catch { 96 this.message = 'SM4_CBCFail'; 97 } 98 }) 99 } 100 .height('100%') 101 .width('100%') 102 } 103}