在OpenHarmony 中,可以使用系统提供的api 进行加密算法。下文将列举几个常见的加密算法实现,供开发者参考使用。

导包

下面两种导包方式均可以

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
或者
import cryptoFramework from '@ohos.security.cryptoFramework';

安全随机数

使用 createRandom 生成Random实例,生成随机数

    let len = 32;
    let random = cryptoFramework.createRandom();
    let dataBlob = await random.generateRandom(len);
    let uint8Array = dataBlob.data;

AES128加解密

使用createSymKeyGenerator和createCipher进行AES128 加解密,AES256加密算法类似。

let asyKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
let symKey = await asyKeyGenerator.convertKey({
    data: key
})
let gcmmParams: cryptoFramework.GcmParamsSpec = {
    algName: "GcmParamsSpec",
    iv: {
        data: iv // iv 偏移
    },
    aad: {
        data: aad // aad
    },
    authTag: {
        data: authTag // tag
    }
}
let cipher = cryptoFramework.createCipher("AES128|GCM|NoPadding");
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmmParams);
// 加密数据
let dataBlob = await cipher.doFinal({ data: data})
let uint8Array = dataBlob.data;

HMAC消息认证码算法

HMAC消息认证码算法支持SHA1,SHA224,SHA256,SHA384,SHA512。

let mac = cryptoFramework.createMac("SHA256");
let asyKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
// 加密Key
let symKey = await asyKeyGenerator.convertKey({  data: key})
// 加密数据
await mac.init(symKey);await mac.update({  data: data});
let dataBlob = await mac.doFinal();
let uint8Array = dataBlob.data;

HKDF

HKDF是一种基于HMAC的密钥导出函数,分为提取和扩展两步,用于从短密钥材料生成更长的密钥。HKDF在OpenHarmony 使用非常简单,参考下面的方法。

let kdf = cryptoFramework.createKdf("HKDF|SHA256");
let params: cryptoFramework.HKDFSpec = {  
    key: key,  // 加密key
    salt: salt,  // 盐
    info: info,  // 扩展info
    keySize: keySize,  // 扩展长度
    algName: "HKDF"
}
let dataBlob = await kdf.generateSecret(params);
let uint8Array = dataBlob.data;

大素数取模

let base: bigint = BigInt('0x' + 大数);
let exp: bigint = BigInt('0x2');
let mod: bigint = BigInt('0x' + 大素数);
let result = BigInt(1);
base = base % mod;
while (exp > BigInt(0)) {
     if ((exp & BigInt(1)) === BigInt(1)) {
        result = (result * base) % mod;
      }
      exp >>= BigInt(1); // 右移一位相当于除以2
      base = (base * base) % mod;
 }
 return result;
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐