最近在看harmony。网络通讯最基础的数据加解密需要封装,以下研究了其写法。其实写法和flutter里 甚至android中代码写法 大同小异,具体算法可自定义修改,只展示原理。

原理:

加密:1.json字符串(待加密原文)通过base64执行decodeSync 2.通过算法转换为byte数组 3.byte转string

解密:1.string  json字符串(密文) 转byte       2.通过算法得到新byte数组         3.通过base64的encodeToStringSync 把byte转为string

import util from '@ohos.util';

/**

* 加解密 位移符占位数

*/

static readonly PACKET_HEADER_SIZE: number = 5;

/**

* 加密算法

* @param strBuf

* @returns

*/

public decryption(strBuf: string): string {

var base64 = new util.Base64Helper();

let pBuffer = base64.decodeSync(strBuf);

var strBuffer = "";

var pNewBuffer = new Array(pBuffer.length - CommonConstants.PACKET_HEADER_SIZE);

let iSize = pBuffer.length;

if (pBuffer[0] != 0) {

for (let i = CommonConstants.PACKET_HEADER_SIZE; i < iSize; i++) {

let t1 = ((pBuffer[i] & 0xFF) ^ ((pBuffer[0] & 0xFF) ^ (iSize - i))) % 256;

if (t1 < 0) {

t1 = t1 + 256;

}

pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] = t1;

let t2 = ((pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] & 0xFF) - ((i - CommonConstants.PACKET_HEADER_SIZE) ^ (pBuffer[0] & 0xFF))) % 256;

// 取余数时 负数 加 256

if (t2 < 0) {

t2 = t2 + 256;

}

// pNewBuffer[i - PACKET_HEADER_SIZE] = Convert.ToByte(t2);

pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] = t2;

}

strBuffer = this.byteToString(pNewBuffer);

}

return strBuffer;

}

/**

* 解密算法

* @param strBuf

* @param bEncryption

* @returns

*/

public encryption(strBuf: string, bEncryption: boolean): string {

var base64 = new util.Base64Helper();

var pSndBuf = new Array();

pSndBuf = this.stringToByte(strBuf);

var iSize = pSndBuf.length;

let pTempBuffer = new Uint8Array(pSndBuf.length + CommonConstants.PACKET_HEADER_SIZE);

if (bEncryption) {

var rd = Math.random() * 1000;

pTempBuffer[0] = rd % 128;

} else {

pTempBuffer[0] = 0;

}

var iLength = (iSize + CommonConstants.PACKET_HEADER_SIZE);

var byteLength = new Array(iLength);

pTempBuffer[1] = byteLength[0];

pTempBuffer[2] = byteLength[1];

if (pTempBuffer[0] != 0) {

for (let i = 0; i < iSize; i++) {

pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = (((pSndBuf[i] & 0xFF) + (i ^ ((pTempBuffer[0] & 0xFF)))) % 256);

pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = (((pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] & 0xFF) ^ ((pTempBuffer[0] & 0xFF) ^ (iSize - i))) % 256);

}

} else {

for (let i = 0; i < iSize; i++) {

pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = pSndBuf[i];

}

}

return base64.encodeToStringSync(pTempBuffer);

}

/**

* string转byte

* @param str

* @returns

*/

public stringToByte(str) {

var bytes = new Array();

var len, c;

len = str.length;

for (var i = 0; i < len; i++) {

c = str.charCodeAt(i);

if (c >= 0x010000 && c <= 0x10FFFF) {

bytes.push(((c >> 18) & 0x07) | 0xf0);

bytes.push(((c >> 12) & 0x3F) | 0x80);

bytes.push(((c >> 6) & 0x3f) | 0x80);

bytes.push((c & 0x3F) | 0x80);

} else if (c >= 0x000800 && c <= 0x00FFF) {

bytes.push(((c >> 12) & 0x07) | 0xf0);

bytes.push(((c >> 6) & 0x3F) | 0x80);

bytes.push((c & 0x3F) | 0x80);

} else if (c >= 0x000800 && c <= 0x0007FF) {

bytes.push(((c >> 6) & 0x3F) | 0x80);

bytes.push((c & 0x3F) | 0x80);

} else {

bytes.push(c & 0xFF)

}

}

return bytes;

}

/**

* byte转string

* @param str

* @returns

*/

public byteToString(arr): string {

if (typeof arr === 'string') {

return arr;

}

var str = '',

_arr = arr;

for (var i = 0; i < _arr.length; i++) {

var one = _arr[i].toString(2),

v = one.match(/^1+?(?=0)/);

if (v && one.length == 8) {

var bytesLength = v[0].length;

var store = _arr[i].toString(2).slice(7 - bytesLength);

for (var st = 1; st < bytesLength; st++) {

store += _arr[st + i].toString(2).slice(2);

}

str += String.fromCharCode(parseInt(store, 2));

i += bytesLength - 1;

} else {

str += String.fromCharCode(_arr[i]);

}

}

return str;

}

用法:

CommonUtils.encryption(needEncryption.toString(),true);

CommonUtils.decryption(resultJson.Body.toString());

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: