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