HarmonyOS鸿蒙Next中多种加解密示例代码

HarmonyOS鸿蒙Next中多种加解密示例代码

介绍

该示例主要分为3个部分:

  1. 国密算法的加解密:包含了SM2、SM4的加解密示例;
  2. 安卓格式和鸿蒙格式的转换:包含了安卓格式的公私钥,转化为鸿蒙格式的公私钥;安卓加密的密文,在鸿蒙解密;鸿蒙生成的密文解码,用于安卓解密;
  3. 以AES128算法为例,实现了CBC/ECB/GCM算法分组的加解密示例。

多种加解密源码链接

效果预览

![图片名称]

使用说明

打开应用,点击按钮,进入对应示例,进行对应的加解密测试。

实现思路

国密算法的加解密

SM2加密

async encryptSM2BySpecifiedKeyPair(encryptOption: ISM2Cipher) {
  let pubKeyBlob: cryptoFramework.DataBlob | null = encryptOption.pkData ? { data: encryptOption.pkData } : null;
  let priKeyBlob: cryptoFramework.DataBlob | null = encryptOption.skData ? { data: encryptOption.skData } : null;
  let keyPair = await KeyManager.genKeyPairByData(pubKeyBlob, priKeyBlob, encryptOption.algName);
  let pubKey = keyPair.pubKey;
  
  // 把字符串按utf-8解码为Uint8Array
  let plainTextBlob: cryptoFramework.DataBlob = { data: stringToUint8Array(encryptOption.plainText)};
  let encryptText = await this.encryptMessage(encryptOption.cipherTransform,pubKey, plainTextBlob);
  let encryptData = '';
  let outputType = encryptOption.outputType || 'base64';
  encryptData = base64Helper.encodeToStringSync(encryptText.data);
  if (outputType === 'hex') {
    encryptData = uint8ArrayToHexString(encryptText.data);
  }
  return encryptData;
}

SM2解密

async decryptSM2BySpecifiedKeyPair(decryptOption: ISM2Cipher) {
  let encrptStr = decryptOption.encryptedStr || '';
  let plainMessage: Uint8Array;
  let inputType = decryptOption.inputType || 'base64';
  plainMessage = base64Util.decodeSync(encrptStr);
  if (inputType === 'hex') {
    plainMessage = hexStrToUint8Array(encrptStr);
  }
  let pubKeyBlob: cryptoFramework.DataBlob | null = decryptOption.pkData ? { data: decryptOption.pkData } : null;
  let priKeyBlob: cryptoFramework.DataBlob | null = decryptOption.skData ? { data: decryptOption.skData } : null;
  let keyPair = await KeyManager.genKeyPairByData(pubKeyBlob, priKeyBlob, decryptOption.algName);
  let priKey = keyPair.priKey;
  
  // 把字符串按utf-8解码为Uint8Array
  let plainTextBlob: cryptoFramework.DataBlob = { data: plainMessage };
  let decryptText = await this.decryptMessage(decryptOption.cipherTransform, priKey, plainTextBlob);
  let decryptData = uint8ArrayToString(decryptText.data);
  return decryptData;
}

SM4加密

async encryptSM4BySpecifiedKeyPair(encryptOption: ISM4Cipher) {
  let symKey = await KeyManager.genSymKeyBySpecifiedKey(encryptOption.originKeyData, encryptOption.algName);
  let plainTextBlob: cryptoFramework.DataBlob = { data: stringToUint8Array(encryptOption.plainText) };
  let encryptText = await this.encryptMessage(encryptOption.cipherTransform, symKey, plainTextBlob);
  let encryptData = base64Helper.encodeToStringSync(encryptText.data);
  return encryptData;
}

SM4解密

async decryptSM4BySpecifiedKeyPair(decryptOption: ISM4Cipher) {
  let message = base64Helper.decodeSync(decryptOption.encryptedStr);
  let symKey = await KeyManager.genSymKeyBySpecifiedKey(decryptOption.originKeyData, decryptOption.algName);
  let plainTextBlob: cryptoFramework.DataBlob = { data: message };
  let decryptText = await this.decryptMessage(decryptOption.cipherTransform, symKey, plainTextBlob);
  let decryptData = uint8ArrayToString(decryptText.data);
  return decryptData;
}

安卓生成的密钥转换为鸿蒙

async encryptAndroidCipherText(harmonyPrk: string, androidCiphertext: string): Promise<string> {
  let priKeyBlob: cryptoFramework.DataBlob = { data: base64Util.decodeSync(harmonyPrk) }
  let keyPair = await KeyManager.genKeyPairByData(null, priKeyBlob, 'SM2_256');

  // 对于安卓加密的密文,在鸿蒙这边解密时,由于鸿蒙这边的格式是ASN.1包裹的格式,因此需要先序列化
  let c = hexStrToUint8Array(new SM2Ciphertext().i2d_SM2_Ciphertext(androidCiphertext))
  let res = await this.decryptMessage('SM2_256|SM3', keyPair.priKey, { data: c })
  return uint8ArrayToString(res.data);
}

AES128加解密(ECB/CBC/GCM)

通过调用不同加解密算法实现ECB/CBC/GCM加解密

Button('AES128|CBC|PKCS7加密').onClick(async () => {
  this.ciphertextCBC = await CipherUtil.encryptAESByCBC(this.plainText, this.keys, this.iv)
  hilog.info(0xFF00, 'AES128|CBC', 'aes Encrypt  = ' + this.ciphertextCBC);
})
TextInput({ text: this.ciphertextCBC })

Button('CBC解密').onClick(async () => {
  this.plainTextCBC = await CipherUtil.decryptAESByCBC(this.ciphertextCBC, this.keys, this.iv)
})
TextInput({ text: this.plainTextCBC })


Button('AES128|GCM|PKCS7加密').onClick(async () => {
  this.ciphertextGCM = await CipherUtil.encryptAESByGCM(this.plainText, this.keys, this.iv)
  hilog.info(0xFF00, 'AES128|GCM', 'aes Encrypt  = ' + this.ciphertextGCM);
})
TextInput({ text: this.ciphertextGCM })

更多关于HarmonyOS鸿蒙Next中多种加解密示例代码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

很详细

更多关于HarmonyOS鸿蒙Next中多种加解密示例代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,加解密操作可以通过cryptoFramework模块实现。以下是一些常见的加解密示例代码:

  1. AES加密
import ohos.security.cryptoFramework.Cipher;
import ohos.security.cryptoFramework.CipherKey;
import ohos.security.cryptoFramework.CryptoFramework;

Cipher cipher = CryptoFramework.createCipher("AES|ECB|PKCS7");
CipherKey key = CryptoFramework.createCipherKey("AES", keyData);
cipher.init(Cipher.MODE_ENCRYPT, key);
byte[] encryptedData = cipher.doFinal(plainData);
  1. RSA加密
Cipher cipher = CryptoFramework.createCipher("RSA|ECB|PKCS1");
CipherKey key = CryptoFramework.createCipherKey("RSA", keyData);
cipher.init(Cipher.MODE_ENCRYPT, key);
byte[] encryptedData = cipher.doFinal(plainData);
  1. MD5哈希
import ohos.security.cryptoFramework.MessageDigest;

MessageDigest md = CryptoFramework.createMessageDigest("MD5");
md.update(data);
byte[] hash = md.doFinal();
  1. SHA256哈希
MessageDigest sha256 = CryptoFramework.createMessageDigest("SHA256");
sha256.update(data);
byte[] hash = sha256.doFinal();

这些代码展示了如何在HarmonyOS中进行常见的加解密操作,开发者可以根据需求选择合适的算法。

回到顶部