114 lines
3.2 KiB
Go
114 lines
3.2 KiB
Go
package cmd
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"archgrid.xyz/ag/tools/types"
|
||
"archgrid.xyz/ag/toolsbox/encryption"
|
||
"archgrid.xyz/ag/toolsbox/encryption/aes"
|
||
"archgrid.xyz/ag/toolsbox/serialize/base64"
|
||
"archgrid.xyz/ag/toolsbox/serialize/hex"
|
||
"github.com/spf13/cobra"
|
||
)
|
||
|
||
var (
|
||
aesKey string
|
||
aesResult types.ResultEncoding = types.ResultInHex
|
||
aesPadding types.EncryptionPadding = types.PKCS7Padding
|
||
)
|
||
|
||
var aesCommand = &cobra.Command{
|
||
Use: "aes",
|
||
Short: "AES加密算法工具",
|
||
Long: `使用AES加密算法加密或解密数据,在使用的时候注意明文和密文中如果包含空格或特殊字符,需要使用双引号包裹起来。`,
|
||
}
|
||
|
||
var aesEncryptCmd = &cobra.Command{
|
||
Use: "encrypt",
|
||
Short: "使用AES加密算法加密",
|
||
Long: "使用AES加密算法加密,支持三种填充方式:PKCS7、Zero和无填充。默认输出十六进制编码字符串。",
|
||
Args: cobra.MinimumNArgs(1),
|
||
Run: aesEncryptExecute,
|
||
}
|
||
|
||
func aesEncryptExecute(cmd *cobra.Command, args []string) {
|
||
var pad encryption.PaddingMode
|
||
switch aesPadding {
|
||
case types.PKCS7Padding:
|
||
pad = encryption.PKCS7Padding
|
||
case types.ZeroPadding:
|
||
pad = encryption.ZeroPadding
|
||
case types.NoPadding:
|
||
pad = encryption.NoPadding
|
||
default:
|
||
fmt.Printf("不支持的填充方式:%s\n", aesPadding)
|
||
return
|
||
}
|
||
encodedResult, err := aes.Encrypt([]byte(args[0]), []byte(aesKey), pad)
|
||
if err != nil {
|
||
fmt.Printf("加密失败:%s\n", err)
|
||
return
|
||
}
|
||
switch aesResult {
|
||
case types.ResultInBase64:
|
||
fmt.Printf("加密结果:%s\n", base64.ToBase64(encodedResult))
|
||
case types.ResultInHex:
|
||
fallthrough
|
||
default:
|
||
fmt.Printf("加密结果:%s\n", hex.ToHex(encodedResult))
|
||
}
|
||
}
|
||
|
||
var aesDecryptCmd = &cobra.Command{
|
||
Use: "decrypt",
|
||
Short: "使用AES加密算法解密",
|
||
Long: "使用AES加密算法解密,支持三种填充方式:PKCS7、Zero和无填充。默认输入十六进制编码字符串。",
|
||
Args: cobra.MinimumNArgs(1),
|
||
Run: aesDecryptExecute,
|
||
}
|
||
|
||
func aesDecryptExecute(cmd *cobra.Command, args []string) {
|
||
var pad encryption.PaddingMode
|
||
switch aesPadding {
|
||
case types.PKCS7Padding:
|
||
pad = encryption.PKCS7Padding
|
||
case types.ZeroPadding:
|
||
pad = encryption.ZeroPadding
|
||
case types.NoPadding:
|
||
pad = encryption.NoPadding
|
||
default:
|
||
fmt.Printf("不支持的填充方式:%s\n", aesPadding)
|
||
return
|
||
}
|
||
var (
|
||
data []byte
|
||
err error
|
||
)
|
||
switch aesResult {
|
||
case types.ResultInBase64:
|
||
data, err = base64.FromBase64(args[0])
|
||
case types.ResultInHex:
|
||
fallthrough
|
||
default:
|
||
data, err = hex.FromHex(args[0])
|
||
}
|
||
if err != nil {
|
||
fmt.Printf("解密失败,提供的密文无法解析,%s\n", err)
|
||
return
|
||
}
|
||
decodeResult, err := aes.Decrypt(data, []byte(aesKey), pad)
|
||
if err != nil {
|
||
fmt.Printf("解密失败:%s\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("解密结果:%s\n", decodeResult)
|
||
}
|
||
|
||
func init() {
|
||
aesCommand.PersistentFlags().StringVarP(&aesKey, "key", "k", "", "密钥")
|
||
aesCommand.PersistentFlags().VarP(&aesResult, "output", "o", "输入或输出使用Base64编码或者Hex编码,默认为Hex编码。")
|
||
aesCommand.PersistentFlags().VarP(&aesPadding, "padding", "p", "填充方式,可选值:pkcs7、zero、none,默认使用pkcs7。")
|
||
aesCommand.AddCommand(aesEncryptCmd, aesDecryptCmd)
|
||
rootCmd.AddCommand(aesCommand)
|
||
}
|