鸿蒙harmony加解密算法 写法封装

打印 上一主题 下一主题

主题 857|帖子 857|积分 2571

近来在看harmony。网络通讯最底子的数据加解密需要封装,以下研究了其写法。着实写法和flutter里 乃至android中代码写法 大同小异,详细算法可自界说修改,只展示原理。
原理:
加密:1.json字符串(待加密原文)通过base64实验decodeSync 2.通过算法转换为byte数组 3.byte转string
解密:1.string  json字符串(密文) 转byte       2.通过算法得到新byte数组         3.通过base64的encodeToStringSync 把byte转为string

  1. import util from '@ohos.util';
复制代码
  1. /**
  2. * 加解密 位移符占位数
  3. */
  4. static readonly PACKET_HEADER_SIZE: number = 5;
复制代码
  1. /**
  2. * 加密算法
  3. * @param strBuf
  4. * @returns
  5. */
  6. public decryption(strBuf: string): string {
  7.   var base64 = new util.Base64Helper();
  8.   let pBuffer = base64.decodeSync(strBuf);
  9.   var strBuffer = "";
  10.   var pNewBuffer = new Array(pBuffer.length - CommonConstants.PACKET_HEADER_SIZE);
  11.   let iSize = pBuffer.length;
  12.   if (pBuffer[0] != 0) {
  13.     for (let i = CommonConstants.PACKET_HEADER_SIZE; i < iSize; i++) {
  14.       let t1 = ((pBuffer[i] & 0xFF) ^ ((pBuffer[0] & 0xFF) ^ (iSize - i))) % 256;
  15.       if (t1 < 0) {
  16.         t1 = t1 + 256;
  17.       }
  18.       pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] = t1;
  19.       let t2 = ((pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] & 0xFF) - ((i - CommonConstants.PACKET_HEADER_SIZE) ^ (pBuffer[0] & 0xFF))) % 256;
  20.       // 取余数时 负数 加 256
  21.       if (t2 < 0) {
  22.         t2 = t2 + 256;
  23.       }
  24.       // pNewBuffer[i - PACKET_HEADER_SIZE] = Convert.ToByte(t2);
  25.       pNewBuffer[i - CommonConstants.PACKET_HEADER_SIZE] = t2;
  26.     }
  27.     strBuffer = this.byteToString(pNewBuffer);
  28.   }
  29.   return strBuffer;
  30. }
  31. /**
  32. *  解密算法
  33. * @param strBuf
  34. * @param bEncryption
  35. * @returns
  36. */
  37. public encryption(strBuf: string, bEncryption: boolean): string {
  38.   var base64 = new util.Base64Helper();
  39.   var pSndBuf = new Array();
  40.   pSndBuf = this.stringToByte(strBuf);
  41.   var iSize = pSndBuf.length;
  42.   let pTempBuffer = new Uint8Array(pSndBuf.length + CommonConstants.PACKET_HEADER_SIZE);
  43.   if (bEncryption) {
  44.     var rd = Math.random() * 1000;
  45.     pTempBuffer[0] = rd % 128;
  46.   } else {
  47.     pTempBuffer[0] = 0;
  48.   }
  49.   var iLength = (iSize + CommonConstants.PACKET_HEADER_SIZE);
  50.   var byteLength = new Array(iLength);
  51.   pTempBuffer[1] = byteLength[0];
  52.   pTempBuffer[2] = byteLength[1];
  53.   if (pTempBuffer[0] != 0) {
  54.     for (let i = 0; i < iSize; i++) {
  55.       pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = (((pSndBuf[i] & 0xFF) + (i ^ ((pTempBuffer[0] & 0xFF)))) % 256);
  56.       pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = (((pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] & 0xFF) ^ ((pTempBuffer[0] & 0xFF) ^ (iSize - i))) % 256);
  57.     }
  58.   } else {
  59.     for (let i = 0; i < iSize; i++) {
  60.       pTempBuffer[CommonConstants.PACKET_HEADER_SIZE + i] = pSndBuf[i];
  61.     }
  62.   }
  63.   return base64.encodeToStringSync(pTempBuffer);
  64. }
  65. /**
  66. * string转byte
  67. * @param str
  68. * @returns
  69. */
  70. public stringToByte(str) {
  71.   var bytes = new Array();
  72.   var len, c;
  73.   len = str.length;
  74.   for (var i = 0; i < len; i++) {
  75.     c = str.charCodeAt(i);
  76.     if (c >= 0x010000 && c <= 0x10FFFF) {
  77.       bytes.push(((c >> 18) & 0x07) | 0xf0);
  78.       bytes.push(((c >> 12) & 0x3F) | 0x80);
  79.       bytes.push(((c >> 6) & 0x3f) | 0x80);
  80.       bytes.push((c & 0x3F) | 0x80);
  81.     } else if (c >= 0x000800 && c <= 0x00FFF) {
  82.       bytes.push(((c >> 12) & 0x07) | 0xf0);
  83.       bytes.push(((c >> 6) & 0x3F) | 0x80);
  84.       bytes.push((c & 0x3F) | 0x80);
  85.     } else if (c >= 0x000800 && c <= 0x0007FF) {
  86.       bytes.push(((c >> 6) & 0x3F) | 0x80);
  87.       bytes.push((c & 0x3F) | 0x80);
  88.     } else {
  89.       bytes.push(c & 0xFF)
  90.     }
  91.   }
  92.   return bytes;
  93. }
  94. /**
  95. * byte转string
  96. * @param str
  97. * @returns
  98. */
  99. public byteToString(arr): string {
  100.   if (typeof arr === 'string') {
  101.     return arr;
  102.   }
  103.   var str = '',
  104.     _arr = arr;
  105.   for (var i = 0; i < _arr.length; i++) {
  106.     var one = _arr[i].toString(2),
  107.       v = one.match(/^1+?(?=0)/);
  108.     if (v && one.length == 8) {
  109.       var bytesLength = v[0].length;
  110.       var store = _arr[i].toString(2).slice(7 - bytesLength);
  111.       for (var st = 1; st < bytesLength; st++) {
  112.         store += _arr[st + i].toString(2).slice(2);
  113.       }
  114.       str += String.fromCharCode(parseInt(store, 2));
  115.       i += bytesLength - 1;
  116.     } else {
  117.       str += String.fromCharCode(_arr[i]);
  118.     }
  119.   }
  120.   return str;
  121. }
复制代码
  1. 用法:
  2. CommonUtils.encryption(needEncryption.toString(),true);
  3. CommonUtils.decryption(resultJson.Body.toString());
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表