本文原创发布在华为开发者社区。
介绍
该示例主要分为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加解密
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。