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