ag_tools/cmd/des.go

114 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}