From 9f1a0b75e3e43932cadefd93608ddba0179f4432 Mon Sep 17 00:00:00 2001 From: Jesse-Ma <24167796@qq.com> Date: Wed, 29 Mar 2023 20:39:29 +0800 Subject: [PATCH] hex --- src/api/note.js | 7 ++- src/libs/secret.js | 139 ++++++++++++++++++++++++++++++----------- src/views/ViewNote.vue | 7 ++- 3 files changed, 110 insertions(+), 43 deletions(-) diff --git a/src/api/note.js b/src/api/note.js index a5ff743..efa30ce 100644 --- a/src/api/note.js +++ b/src/api/note.js @@ -1,7 +1,7 @@ import axios from "axios"; import { getStoreKey } from "@/api/lock"; import storage from "@/libs/storage"; -import { md5, wrap} from "@/libs/secret"; +import { md5, wrap, convertHexStringToUint8Array} from "@/libs/secret"; import NoteConstant from "@/libs/constants"; axios.interceptors.response.use(undefined, (err) => { @@ -51,8 +51,9 @@ export function saveNote(noteForm, secret) { // let bufferArrary = eval("[" + note.text + "]"); // let array = Uint8Array.from(bufferArrary); - let encoder = new TextEncoder() - let array = encoder.encode(note.text) + // let encoder = new TextEncoder() + // let array = encoder.encode(note.text) + let array = convertHexStringToUint8Array(note.text) let blob = new Blob([array], { type: "application/octet-stream" }); let form = new FormData(); diff --git a/src/libs/secret.js b/src/libs/secret.js index 51581b0..0c55e91 100644 --- a/src/libs/secret.js +++ b/src/libs/secret.js @@ -4,6 +4,43 @@ import pako from "pako"; const wasmFlate = window.wasm_bindgen; + +CryptoJS.enc.Uint8Array = { + + /** + * WordArray转Uint8Array + * @param wordArray + * @returns {Uint8Array} + */ + stringify: function (wordArray) { + var len = wordArray.words.length, + u8_array = new Uint8Array(len << 2), + offset = 0, word, i; + for (i = 0; i < len; i++) { + word = wordArray.words[i]; + u8_array[offset++] = word >> 24; + u8_array[offset++] = (word >> 16) & 0xff; + u8_array[offset++] = (word >> 8) & 0xff; + u8_array[offset++] = word & 0xff; + } + return u8_array; + }, + + /** + * Uint8Array转WordArray + * @param u8arr + * @returns {WordArray} + */ + parse: function (u8arr) { + var len = u8arr.length; + var words = []; + for (var i = 0; i < len; i++) { + words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8); + } + return CryptoJS.lib.WordArray.create(words, len); + } +}; + /** * @word 要加密的内容 * @keyWord String 服务器随机返回的关键字 @@ -11,7 +48,7 @@ const wasmFlate = window.wasm_bindgen; export function wrap(text, secretKey) { text = "FLAGNOTE#" + text; - let ui8ary = noteZip(text); + let ui8ary = noteZip(text); let result = aesEncrypt(convertUint8ArrayToWordArray(ui8ary), secretKey); return result; } @@ -39,14 +76,16 @@ export function aesEncrypt(word, keyWord) { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding, }); - return encrypted.toString(); + return encrypted.ciphertext.toString(); } //解密 export function aesDecrypt(word, keyWord) { - let key = CryptoJS.enc.Utf8.parse(keyWord); - let decrypt = CryptoJS.AES.decrypt(word, key, { + var srcs = CryptoJS.enc.Hex.parse(word); + let decrypt = CryptoJS.AES.decrypt({ + ciphertext: srcs + }, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding, }); @@ -76,16 +115,16 @@ export function noteZip(text) { return text; } -export function zip(data){ - if(wasmFlate.__wbindgen_wasm_module){ - return wasmFlate.gzip_encode_raw(data); - } +export function zip(data) { + if (wasmFlate.__wbindgen_wasm_module) { + return wasmFlate.gzip_encode_raw(data); + } return pako.gzip(data); } -export function unzip(data){ - if(wasmFlate.__wbindgen_wasm_module){ +export function unzip(data) { + if (wasmFlate.__wbindgen_wasm_module) { return wasmFlate.gzip_decode_raw(data); } @@ -93,34 +132,60 @@ export function unzip(data){ } function convertWordArrayToUint8Array(wordArray) { - var len = wordArray.words.length, - u8_array = new Uint8Array(len << 2), - offset = 0, word, i - ; - for (i=0; i> 24; - u8_array[offset++] = (word >> 16) & 0xff; - u8_array[offset++] = (word >> 8) & 0xff; - u8_array[offset++] = word & 0xff; - } - return u8_array; + + let rr = CryptoJS.enc.Uint8Array.stringify(wordArray); + return rr; + // console.log(rr) + + + // var len = wordArray.words.length, + // u8_array = new Uint8Array(len << 2), + // offset = 0, word, i + // ; + // for (i = 0; i < len; i++) { + // word = wordArray.words[i]; + // u8_array[offset++] = word >> 24; + // u8_array[offset++] = (word >> 16) & 0xff; + // u8_array[offset++] = (word >> 8) & 0xff; + // u8_array[offset++] = word & 0xff; + // } + // return u8_array; } function convertUint8ArrayToWordArray(u8Array) { - var words = [], i = 0, len = u8Array.length; - - while (i < len) { - words.push( - (u8Array[i++] << 24) | - (u8Array[i++] << 16) | - (u8Array[i++] << 8) | - (u8Array[i++]) - ); - } - - return { - sigBytes: words.length * 4, - words: words - }; + + let rr = CryptoJS.enc.Uint8Array.parse(u8Array); + return rr; + // console.log(rr) + + // var words = [], i = 0, len = u8Array.length; + + // while (i < len) { + // words.push( + // (u8Array[i++] << 24) | + // (u8Array[i++] << 16) | + // (u8Array[i++] << 8) | + // (u8Array[i++]) + // ); + // } + + // return { + // sigBytes: words.length * 4, + // words: words + // }; } + +export function convertHexStringToUint8Array(hexString) { + var result = []; + for (var i = 0; i < hexString.length; i += 2) { + result.push(parseInt(hexString.substr(i, 2), 16)); + } + return Uint8Array.from(result); + // Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); +} + +export function convertUint8ArrayToHexString(byteArray) { + return Array.prototype.map.call(byteArray, function(byte) { + return ('0' + (byte & 0xFF).toString(16)).slice(-2); + }).join(''); +} \ No newline at end of file diff --git a/src/views/ViewNote.vue b/src/views/ViewNote.vue index 4185a4a..401be05 100644 --- a/src/views/ViewNote.vue +++ b/src/views/ViewNote.vue @@ -336,7 +336,7 @@