package rsa import ( "fmt" "io" "os" "archgrid.xyz/ag/tools/types" "archgrid.xyz/ag/toolsbox/encryption/rsa" "archgrid.xyz/ag/toolsbox/serialize/base64" "archgrid.xyz/ag/toolsbox/serialize/hex" "github.com/spf13/cobra" ) var ( rsaVerifyFile bool rsaVerifyInputFile string rsaVerifyEncoding types.ResultEncoding = types.ResultInHex ) var rsaVerifyCmd = &cobra.Command{ Use: "verify", Short: `使用RSA算法对给定的内容进行验证`, Long: `使用RSA算法对给定的内容进行验证,生成RSA密钥。如果指定了输入文件,则从输入文件中读取内容进行验证,否则从命令行读取内容进行验证。`, Args: cobra.MaximumNArgs(2), Run: rsaVerifyExecute, } func rsaVerifyExecute(cmd *cobra.Command, args []string) { var ( content []byte cert []byte keys *rsa.KeyPair err error ) if len(publicKeyFile) > 0 { file, err := os.Open(publicKeyFile) if err != nil { fmt.Printf("无法打开RSA公钥文件:%s\n", err) return } cert, err = io.ReadAll(file) if err != nil { fmt.Printf("无法读取RSA公钥文件:%s\n", err) return } } else if len(privateKeyFile) > 0 { file, err := os.Open(privateKeyFile) if err != nil { fmt.Printf("无法打开RSA私钥文件:%s\n", err) return } cert, err = io.ReadAll(file) if err != nil { fmt.Printf("无法读取RSA私钥文件:%s\n", err) return } } else { fmt.Println("必须提供RSA密钥文件才能够验证。") return } keys, err = rsa.NewFromPEM(cert) if err != nil { fmt.Printf("无法解析RSA密钥:%s\n", err) return } if rsaVerifyFile { if len(rsaVerifyInputFile) == 0 { fmt.Println("必须指定输入文件名。") return } file, err := os.Open(rsaVerifyInputFile) if err != nil { fmt.Printf("无法打开输入文件:%s\n", err) return } content, err = io.ReadAll(file) if err != nil { fmt.Printf("无法读取输入文件:%s\n", err) return } } else { if len(args) < 1 { fmt.Println("必须指定待验证内容。") return } content = []byte(args[0]) } var signature []byte switch rsaVerifyEncoding { case types.ResultInHex: signature, err = hex.FromHex(args[len(args)-1]) if err != nil { fmt.Printf("无法解析签名内容:%s\n", err) return } case types.ResultInBase64: signature, err = base64.FromBase64(args[len(args)-1]) if err != nil { fmt.Printf("无法解析签名内容:%s\n", err) return } default: fmt.Println("不支持的签名内容编码方式。") return } if err = keys.Verify(content, signature); err != nil { fmt.Printf("验证失败,%s\n", err) } else { fmt.Println("验证成功。") } } func init() { rsaVerifyCmd.Flags().BoolVarP(&rsaVerifyFile, "file", "f", false, "指定从文件中读入待验证内容") rsaVerifyCmd.Flags().StringVarP(&rsaVerifyInputFile, "input", "i", "", "指定读入内容的文件名") rsaVerifyCmd.Flags().VarP(&rsaVerifyEncoding, "encoding", "e", "指定签名内容的编码方式,可选值为hex和base64,默认为hex") rsaCmd.AddCommand(rsaVerifyCmd) }