diff --git a/src/views/tool/encrypt.vue b/src/views/tool/encrypt.vue index f1d50a776353a69ac75bc87a1f169d597abcc834..10eba731d4bcf3c26a0f27490b4af84d9600277f 100644 --- a/src/views/tool/encrypt.vue +++ b/src/views/tool/encrypt.vue @@ -2,21 +2,57 @@ - - - - - - - - + + + + + + + + + + + - - + + + + + + + + + + @@ -24,7 +60,8 @@ {{ $t('encrypt_generate_secret_key') }} - + + @@ -33,6 +70,7 @@ import crypto from "crypto-js" import heightResize from "./components/heightResize"; import autoHeightTextarea from "./components/autoHeightTextarea"; +import { CryptoJS } from 'jsrsasign'; export default { components: { @@ -55,15 +93,32 @@ export default { case "RC4": case "Rabbit": case "TripleDES": + let key = this.current.password; + if(this.current.keyFormat !== "Password") { + key = crypto.enc[this.current.keyFormat].parse(this.current.password); + } if (v === "encrypt") { output = crypto[this.current.type].encrypt( this.current.input, - this.current.password - ).toString(); + key, + { + iv: crypto.enc.Hex.parse(this.current.iv), + mode: crypto.mode[this.current.mode], + padding: crypto.pad[this.current.padding] + } + ).ciphertext; } else { + let cipherParams = CryptoJS.lib.CipherParams.create({ + ciphertext: crypto.enc.Hex.parse(this.current.input) + }); output = crypto[this.current.type].decrypt( - this.current.input, - this.current.password + cipherParams, + key, + { + iv: crypto.enc.Hex.parse(this.current.iv), + mode: crypto.mode[this.current.mode], + padding: crypto.pad[this.current.padding] + } ).toString(crypto.enc.Utf8); } break; @@ -86,14 +141,34 @@ export default { } break; case "SM4": + let sm4Key = this.current.password; + if(this.current.keyFormat === "Base64") { + sm4Key = crypto.enc.Hex.stringify(crypto.enc[this.current.keyFormat].parse(this.current.password)); + } else if(this.current.keyFormat === "Password") { + sm4Key = crypto.enc.Hex.stringify(crypto.enc.Utf8.parse(this.current.password)); + } if(v === "encrypt") { - // SM4 加密,将输出转换为 base64 格式,与 AES 对齐 - output = sm4.encrypt(this.current.input, this.current.password); - output = crypto.enc.Base64.stringify(crypto.enc.Hex.parse(output)) + // SM4 加密 + output = sm4.encrypt( + this.current.input, + sm4Key, + { + mode: this.current.mode.toLowerCase(), + iv: this.current.iv, + padding: this.current.padding + } + ); } else { - // SM4 解密,sm-crypto 要求输入为 hex,将 base64 转换为 hex 作为输入 - let inputHex = crypto.enc.Hex.stringify(crypto.enc.Base64.parse(this.current.input)); - output = sm4.decrypt(inputHex, this.current.password); + // SM4 解密 + output = sm4.decrypt( + this.current.input, + sm4Key, + { + mode: this.current.mode.toLowerCase(), + iv: this.current.iv, + padding: this.current.padding + } + ); } } if (!output) { @@ -144,6 +219,10 @@ export default { current: { input: "", password: "", + keyFormat: "Hex", + iv: "", + mode:"ECB", + padding:"Pkcs7", sm2CipherMode: "C1C3C2", output: "", type: "AES",