114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
package cmd
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"archgrid.xyz/ag/tools/types"
|
||
"archgrid.xyz/ag/toolsbox/encryption"
|
||
"archgrid.xyz/ag/toolsbox/encryption/des"
|
||
"archgrid.xyz/ag/toolsbox/serialize/base64"
|
||
"archgrid.xyz/ag/toolsbox/serialize/hex"
|
||
"github.com/spf13/cobra"
|
||
)
|
||
|
||
var (
|
||
desKey string
|
||
desResult types.ResultEncoding = types.ResultInHex
|
||
desPadding types.EncryptionPadding = types.PKCS7Padding
|
||
)
|
||
|
||
var desCommand = &cobra.Command{
|
||
Use: "des",
|
||
Short: "DES加密算法工具",
|
||
Long: `使用DES加密算法加密或解密数据,在使用的时候注意明文和密文中如果包含空格或特殊字符,需要使用双引号包裹起来。`,
|
||
}
|
||
|
||
var desEncryptCmd = &cobra.Command{
|
||
Use: "encrypt",
|
||
Short: "使用DES加密算法加密",
|
||
Long: `使用DES加密算法加密,支持三种填充方式:PKCS7、Zero和无填充。默认输出十六进制编码字符串。`,
|
||
Args: cobra.MinimumNArgs(1),
|
||
Run: desEncryptExecute,
|
||
}
|
||
|
||
var desDecryptCmd = &cobra.Command{
|
||
Use: "decrypt",
|
||
Short: "使用DES加密算法解密",
|
||
Long: `使用DES加密算法解密,支持三种填充方式:PKCS7、Zero和无填充。默认输入十六进制编码字符串。`,
|
||
Args: cobra.MinimumNArgs(1),
|
||
Run: desDecryptExecute,
|
||
}
|
||
|
||
func desEncryptExecute(cmd *cobra.Command, args []string) {
|
||
var pad encryption.PaddingMode
|
||
switch desPadding {
|
||
case types.PKCS7Padding:
|
||
pad = encryption.PKCS7Padding
|
||
case types.ZeroPadding:
|
||
pad = encryption.ZeroPadding
|
||
case types.NoPadding:
|
||
pad = encryption.NoPadding
|
||
default:
|
||
fmt.Printf("不支持的填充方式:%s\n", desPadding)
|
||
return
|
||
}
|
||
encodedResult, err := des.Encrypt([]byte(args[0]), []byte(desKey), pad)
|
||
if err != nil {
|
||
fmt.Printf("加密失败:%s\n", err)
|
||
return
|
||
}
|
||
switch desResult {
|
||
case types.ResultInBase64:
|
||
fmt.Printf("加密结果:%s\n", base64.ToBase64URLEncoded(encodedResult))
|
||
case types.ResultInHex:
|
||
fallthrough
|
||
default:
|
||
fmt.Printf("加密结果:%s\n", hex.ToHex(encodedResult))
|
||
}
|
||
}
|
||
|
||
func desDecryptExecute(cmd *cobra.Command, args []string) {
|
||
var pad encryption.PaddingMode
|
||
switch desPadding {
|
||
case types.PKCS7Padding:
|
||
pad = encryption.PKCS7Padding
|
||
case types.ZeroPadding:
|
||
pad = encryption.ZeroPadding
|
||
case types.NoPadding:
|
||
pad = encryption.NoPadding
|
||
default:
|
||
fmt.Printf("不支持的填充方式:%s\n", desPadding)
|
||
return
|
||
}
|
||
var (
|
||
data []byte
|
||
err error
|
||
)
|
||
switch desResult {
|
||
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
|
||
}
|
||
decodedResult, err := des.Decrypt(data, []byte(desKey), pad)
|
||
if err != nil {
|
||
fmt.Printf("解密失败,%s\n", err)
|
||
return
|
||
}
|
||
fmt.Printf("解密结果:%s\n", decodedResult)
|
||
}
|
||
|
||
func init() {
|
||
desCommand.PersistentFlags().VarP(&desResult, "output", "o", "密文的编码方式,可选Base64或者Hex,同时对加密和解密过程有效,默认使用Hex编码。")
|
||
desCommand.PersistentFlags().StringVarP(&desKey, "key", "k", "", "密钥。")
|
||
desCommand.PersistentFlags().VarP(&desPadding, "padding", "p", "填充方式,支持pkcs7、zero和none,默认为pkcs7。")
|
||
desCommand.AddCommand(desEncryptCmd, desDecryptCmd)
|
||
rootCmd.AddCommand(desCommand)
|
||
}
|