Security.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { ShareConfig } from './ShareConfig';
  2. // import TextEncodingPolyfill from 'text-encoding';
  3. /** 数据传输加密 */
  4. export class Security {
  5. static repeatArray(arr: Array<number>, size: number): Array<number> {
  6. let repeatedArray = arr.slice(); // 复制原数组
  7. while (repeatedArray.length < size) {
  8. // 如果数组长度小于指定大小,就复制一份原数组内容并追加到末尾
  9. repeatedArray = repeatedArray.concat(arr.slice(0, size - repeatedArray.length));
  10. }
  11. return repeatedArray.slice(0, size); // 返回指定长度的数组
  12. }
  13. static mapKey(size: number): Array<number> {
  14. const seed = Number('905010410038421001031011063552115');
  15. // const seed = Number(new TextEncodingPolyfill.TextEncoder().encode(ShareConfig.securityKey).join(''));
  16. const dict = new Array(256);
  17. for (let i = 0; i < 256; i++) {
  18. const temp = dict[i] || i;
  19. const rand = (seed % (i + 1) + i) % 256;
  20. dict[i] = dict[rand] || rand;
  21. dict[rand] = temp;
  22. }
  23. if (size > 256) {
  24. return Security.repeatArray(dict, size);
  25. } else {
  26. return dict;
  27. }
  28. }
  29. static byteIn(keyMap: Array<number>, val: number, index: number): number {
  30. for (let i = 0; i < keyMap.length; i++) {
  31. if (keyMap[i] === val) return (i + keyMap[index]) % 256;
  32. }
  33. return 0;
  34. }
  35. static byteOut(keyMap: Array<number>, val: number, index: number): number {
  36. const diff = val - keyMap[index];
  37. return keyMap[(diff < 0) ? 256 + diff : diff];
  38. }
  39. /** 加密 */
  40. static encrypt(buf: Uint8Array): Uint8Array {
  41. return buf.map(Security.byteIn.bind(null, Security.mapKey(buf.length)));
  42. }
  43. /** 解密 */
  44. static decrypt(buf: Uint8Array): Uint8Array {
  45. return buf.map(Security.byteOut.bind(null, Security.mapKey(buf.length)));
  46. }
  47. }