ag_tools/cmd/tdes.go

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