HarmonyOS鸿蒙Next中AES和RSA加解密问题

HarmonyOS鸿蒙Next中AES和RSA加解密问题 需要把string使用RSA加密生成string类型,传给接口。 解码需要把接口返回的字符串解码生成string,

RAS加密后使用buffer.from(dataBlob.data).toString(‘utf-8’)把dataBlob类型转换成string再解密报错。

// 加密消息
async function encryptMessagePromise(publicKey: cryptoFramework.PubKey, plainText: cryptoFramework.DataBlob) {
let cipher:cryptoFramework.Cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey, null);
let encryptData:cryptoFramework.DataBlob = await cipher.doFinal(plainText);
return encryptData;
}

// 解密消息
async function decryptMessagePromise(privateKey: cryptoFramework.PriKey, cipherText: cryptoFramework.DataBlob) {
let decoder = cryptoFramework.createCipher('RSA1024|PKCS1');
await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, privateKey, null);
let decryptData:cryptoFramework.DataBlob = await decoder.doFinal(cipherText);
return decryptData;
}

async function encryToString(message:string, pubKey:cryptoFramework.PubKey){
// 把字符串按utf-8解码为Uint8Array
let encryText: string = ''
try {
let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
let encryptBlob = await this.encryptMessagePromise(pubKey, plainText);
let encryText = this.dataBlobToString(encryptBlob);
PiccLog.info('RSA encryText = ' + encryText);

} catch (e) {
PiccLog.error("decrypt error = " + JSON.stringify(e))
}
return encryText;

}

function dataBlobToString(dataBlob:cryptoFramework.DataBlob){

let result:string = buffer.from(dataBlob.data).toString('utf-8');
return result;
}

function stringToDataBlob(message:string){

let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'hex').buffer)};
return plainText;
}

更多关于HarmonyOS鸿蒙Next中AES和RSA加解密问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

DataBlob和String的相互转换的方法如下:

let message = 'This is a test';

// String转换为DataBlob
let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };

// DataBlob转换为String
let message2 = buffer.from(plainText.data).toString('utf-8');

【注意】转换的编码格式要一致。问题代码中转换成dataBlob时使用的Utf-8,转回string时使用的hex

已解决:

dataBlob和Unit8直接转换

function dataBlobToUint8(dataBlob:cryptoFramework.DataBlob):Uint8Array
{
  let uint8 = dataBlob.data;
  return uint8;
}

function uit8ToDataBlob(uint8:Uint8Array){
  let dataBlob : cryptoFramework.DataBlob = { data: uint8 };
  return dataBlob;
}

function encodeByUint8(uint8Array:Uint8Array){
  let base64:util.Base64Helper = new util.Base64Helper();
  let base64Uint:Uint8Array = base64.encodeSync(uint8Array);
  let base64Str:string = ChangeHelper.uint8ArrayToStr(base64Uint);
  return base64Str;
}

function decodeToUint8(str:string){
  let base64:util.Base64Helper = new util.Base64Helper();
  let uint8Array:Uint8Array = base64.decodeSync(str);
  return uint8Array;
}

async function encryToString(message:string, pubKey:cryptoFramework.PubKey){
  let plainText: cryptoFramework.DataBlob = this.stringToDataBlob(message);
  let encryptBlob = await this.encryptMessagePromise(pubKey, plainText);
  // 加密后的DataBlob直接获取Uint8Array后进行base64编码
  let encryText = PiccBase64.encodeByUint8(encryptBlob.data);
  PiccLog.info('RSA encryText = ' + encryText);
  return encryText;
}

async function decrybyString(encryptedBase64Str:string , priKey:cryptoFramework.PriKey){
  let uit8Array = PiccBase64.decodeToUint8(encryptedBase64Str);
  //base64解码后直接用uint8Array转换为DataBlob类型进行解密
  let encryptBlob = ChangeHelper.uit8ToDataBlob(uit8Array);
  let decryptBlob = await this.decryptMessagePromise(priKey, encryptBlob);
  let decryString = this.dataBlobToString(decryptBlob)
  PiccLog.info('RSA decryString = ' + decryString);
}

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


在HarmonyOS鸿蒙Next中,AES和RSA加解密可以通过鸿蒙提供的安全能力框架实现。鸿蒙Next的安全框架支持对称加密(如AES)和非对称加密(如RSA)。

对于AES加密,鸿蒙Next提供了HksCryptoHalAes模块,支持AES-128、AES-192和AES-256三种密钥长度。开发者可以通过HksCryptoHalAesEncryptHksCryptoHalAesDecrypt函数进行加解密操作。AES加密通常用于大数据块的加密,适合对文件、消息等数据进行加密。

对于RSA加密,鸿蒙Next提供了HksCryptoHalRsa模块,支持RSA-1024、RSA-2048和RSA-4096三种密钥长度。开发者可以通过HksCryptoHalRsaEncryptHksCryptoHalRsaDecrypt函数进行加解密操作。RSA加密通常用于小数据块的加密,适合对密钥、数字签名等进行加密。

鸿蒙Next的加解密操作可以通过Hks(Huawei Key Store)模块进行密钥管理和安全存储,确保密钥的安全性。开发者需要在使用加解密功能时,确保密钥的生成、存储和使用符合安全规范。

此外,鸿蒙Next还提供了HksCryptoHal模块,支持多种加密算法和模式,开发者可以根据需求选择合适的加密算法和模式进行加解密操作。

在HarmonyOS鸿蒙Next中,AES和RSA加解密可以通过javax.cryptojava.security包实现。AES通常用于对称加密,适合大量数据加密,使用Cipher类进行加密解密操作。RSA用于非对称加密,适合密钥交换和数字签名,使用KeyPairGenerator生成密钥对,Cipher类进行加解密。注意密钥管理和安全存储,避免密钥泄露。建议使用官方提供的安全API,确保兼容性和安全性。

回到顶部