提交 56b66e8c 编写于 作者: 常浩然 提交者: ninecents

cipher support select mode and padding

上级 c09d7c97
...@@ -2,21 +2,57 @@ ...@@ -2,21 +2,57 @@
<heightResize ignore :append="['.page-option-block']" @resize="resize"> <heightResize ignore :append="['.page-option-block']" @resize="resize">
<autoHeightTextarea v-model="current.input" :height="inputHeight" :placeholder="$t('encrypt_input')"/> <autoHeightTextarea v-model="current.input" :height="inputHeight" :placeholder="$t('encrypt_input')"/>
<option-block class="page-option-block"> <option-block class="page-option-block">
<FormItem> <Form :model="formItem" label-position="top">
<Select v-model="current.type" style="width:200px"> <Form-item label="算法: ">
<Select v-model="current.type">
<Option v-for="v in type" :value="v" :key="v">{{ v }}</Option> <Option v-for="v in type" :value="v" :key="v">{{ v }}</Option>
</Select> </Select>
</FormItem> </Form-item>
<FormItem> <Form-item label="密钥: ">
<Input v-model="current.password" :placeholder="$t('encrypt_password')"></Input> <Select v-model="current.keyFormat">
</FormItem> <Option value="Hex">Hex</Option>
<FormItem v-if="current.type === 'SM2'"> <Option value="Base64">Base64</Option>
<Select v-model="current.sm2CipherMode" style="width:100px"> <Option value="Password">Password</Option>
</Select>
<Input v-model="current.password" :placeholder="$t('encrypt_password')" type="textarea" :autosize="{minRows: 2, maxRows: 5}"></Input>
</Form-item>
<Form-item label="IV 向量(Hex 格式): ">
<Input v-model="current.iv" :placeholder="$t('iv')" type="textarea" :autosize="{minRows: 3, maxRows: 5}"></Input>
</Form-item>
<Form-item label="加密模式: " v-if="current.type === 'SM2'">
<Select v-model="current.sm2CipherMode">
<Option value="C1C3C2">C1C3C2</Option> <Option value="C1C3C2">C1C3C2</Option>
<Option value="C1C2C3">C1C2C3</Option> <Option value="C1C2C3">C1C2C3</Option>
</Select> </Select>
</FormItem> </Form-item>
<FormItem> <Form-item label="加密模式: " v-else-if="current.type === 'SM4'">
<Select v-model="current.mode">
<Option value="ecb">ECB</Option>
<Option value="cbc">CBC</Option>
</Select>
<Select v-model="current.padding">
<Option value="pkcs#7">Pkcs7</Option>
<Option value="none">NoPadding</Option>
</Select>
</Form-item>
<Form-item label="加密模式: " v-else>
<Select v-model="current.mode">
<Option value="ECB">ECB</Option>
<Option value="CBC">CBC</Option>
<Option value="CFB">CFB</Option>
<Option value="OFB">OFB</Option>
<Option value="CTR">CTR</Option>
</Select>
<Select v-model="current.padding">
<Option value="Pkcs7">Pkcs7</Option>
<Option value="Iso97971">Iso97971</Option>
<Option value="AnsiX923">AnsiX923</Option>
<Option value="Iso10126">Iso10126</Option>
<Option value="ZeroPadding">ZeroPadding</Option>
<Option value="NoPadding">NoPadding</Option>
</Select>
</Form-item>
<Form-item>
<ButtonGroup> <ButtonGroup>
<Button type="primary" @click="handle('encrypt')">{{ $t('encrypt_encrypt') }}</Button> <Button type="primary" @click="handle('encrypt')">{{ $t('encrypt_encrypt') }}</Button>
<Button type="primary" @click="handle('decrypt')">{{ $t('encrypt_decrypt') }}</Button> <Button type="primary" @click="handle('decrypt')">{{ $t('encrypt_decrypt') }}</Button>
...@@ -24,7 +60,8 @@ ...@@ -24,7 +60,8 @@
{{ $t('encrypt_generate_secret_key') }} {{ $t('encrypt_generate_secret_key') }}
</Button> </Button>
</ButtonGroup> </ButtonGroup>
</FormItem> </Form-item>
</Form>
</option-block> </option-block>
<autoHeightTextarea :value="current.output" :height="outputHeight" :placeholder="$t('encrypt_output')"/> <autoHeightTextarea :value="current.output" :height="outputHeight" :placeholder="$t('encrypt_output')"/>
</heightResize> </heightResize>
...@@ -33,6 +70,7 @@ ...@@ -33,6 +70,7 @@
import crypto from "crypto-js" import crypto from "crypto-js"
import heightResize from "./components/heightResize"; import heightResize from "./components/heightResize";
import autoHeightTextarea from "./components/autoHeightTextarea"; import autoHeightTextarea from "./components/autoHeightTextarea";
import { CryptoJS } from 'jsrsasign';
export default { export default {
components: { components: {
...@@ -55,15 +93,32 @@ export default { ...@@ -55,15 +93,32 @@ export default {
case "RC4": case "RC4":
case "Rabbit": case "Rabbit":
case "TripleDES": 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") { if (v === "encrypt") {
output = crypto[this.current.type].encrypt( output = crypto[this.current.type].encrypt(
this.current.input, this.current.input,
this.current.password key,
).toString(); {
iv: crypto.enc.Hex.parse(this.current.iv),
mode: crypto.mode[this.current.mode],
padding: crypto.pad[this.current.padding]
}
).ciphertext;
} else { } else {
let cipherParams = CryptoJS.lib.CipherParams.create({
ciphertext: crypto.enc.Hex.parse(this.current.input)
});
output = crypto[this.current.type].decrypt( output = crypto[this.current.type].decrypt(
this.current.input, cipherParams,
this.current.password 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); ).toString(crypto.enc.Utf8);
} }
break; break;
...@@ -86,14 +141,34 @@ export default { ...@@ -86,14 +141,34 @@ export default {
} }
break; break;
case "SM4": 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") { if(v === "encrypt") {
// SM4 加密,将输出转换为 base64 格式,与 AES 对齐 // SM4 加密
output = sm4.encrypt(this.current.input, this.current.password); output = sm4.encrypt(
output = crypto.enc.Base64.stringify(crypto.enc.Hex.parse(output)) this.current.input,
sm4Key,
{
mode: this.current.mode.toLowerCase(),
iv: this.current.iv,
padding: this.current.padding
}
);
} else { } else {
// SM4 解密,sm-crypto 要求输入为 hex,将 base64 转换为 hex 作为输入 // SM4 解密
let inputHex = crypto.enc.Hex.stringify(crypto.enc.Base64.parse(this.current.input)); output = sm4.decrypt(
output = sm4.decrypt(inputHex, this.current.password); this.current.input,
sm4Key,
{
mode: this.current.mode.toLowerCase(),
iv: this.current.iv,
padding: this.current.padding
}
);
} }
} }
if (!output) { if (!output) {
...@@ -144,6 +219,10 @@ export default { ...@@ -144,6 +219,10 @@ export default {
current: { current: {
input: "", input: "",
password: "", password: "",
keyFormat: "Hex",
iv: "",
mode:"ECB",
padding:"Pkcs7",
sm2CipherMode: "C1C3C2", sm2CipherMode: "C1C3C2",
output: "", output: "",
type: "AES", type: "AES",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册