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