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

cipher support select mode and padding

上级 c09d7c97
......@@ -2,21 +2,57 @@
<heightResize ignore :append="['.page-option-block']" @resize="resize">
<autoHeightTextarea v-model="current.input" :height="inputHeight" :placeholder="$t('encrypt_input')"/>
<option-block class="page-option-block">
<FormItem>
<Select v-model="current.type" style="width:200px">
<Form :model="formItem" label-position="top">
<Form-item label="算法: ">
<Select v-model="current.type">
<Option v-for="v in type" :value="v" :key="v">{{ v }}</Option>
</Select>
</FormItem>
<FormItem>
<Input v-model="current.password" :placeholder="$t('encrypt_password')"></Input>
</FormItem>
<FormItem v-if="current.type === 'SM2'">
<Select v-model="current.sm2CipherMode" style="width:100px">
</Form-item>
<Form-item label="密钥: ">
<Select v-model="current.keyFormat">
<Option value="Hex">Hex</Option>
<Option value="Base64">Base64</Option>
<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="C1C2C3">C1C2C3</Option>
</Select>
</FormItem>
<FormItem>
</Form-item>
<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>
<Button type="primary" @click="handle('encrypt')">{{ $t('encrypt_encrypt') }}</Button>
<Button type="primary" @click="handle('decrypt')">{{ $t('encrypt_decrypt') }}</Button>
......@@ -24,7 +60,8 @@
{{ $t('encrypt_generate_secret_key') }}
</Button>
</ButtonGroup>
</FormItem>
</Form-item>
</Form>
</option-block>
<autoHeightTextarea :value="current.output" :height="outputHeight" :placeholder="$t('encrypt_output')"/>
</heightResize>
......@@ -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",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册