HarmonyOS鸿蒙Next中多种加解密示例代码
HarmonyOS鸿蒙Next中多种加解密示例代码
介绍
该示例主要分为3个部分:
- 国密算法的加解密:包含了SM2、SM4的加解密示例;
- 安卓格式和鸿蒙格式的转换:包含了安卓格式的公私钥,转化为鸿蒙格式的公私钥;安卓加密的密文,在鸿蒙解密;鸿蒙生成的密文解码,用于安卓解密;
- 以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中,加解密操作可以通过cryptoFramework
模块实现。以下是一些常见的加解密示例代码:
- 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);
- 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);
- MD5哈希:
import ohos.security.cryptoFramework.MessageDigest;
MessageDigest md = CryptoFramework.createMessageDigest("MD5");
md.update(data);
byte[] hash = md.doFinal();
- SHA256哈希:
MessageDigest sha256 = CryptoFramework.createMessageDigest("SHA256");
sha256.update(data);
byte[] hash = sha256.doFinal();
这些代码展示了如何在HarmonyOS中进行常见的加解密操作,开发者可以根据需求选择合适的算法。