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 ( rsaSignFile bool rsaSignInputFile string rsaSignEncoding types.ResultEncoding = types.ResultInHex ) var rsaSignCmd = &cobra.Command{ Use: "sign", Short: `使用RSA算法对给定的内容进行签名`, Long: `使用RSA算法对给定的内容进行签名,生成RSA密钥。如果指定了输入文件,则从输入文件中读取内容进行签名,否则从命令行读取内容进行签名。`, Args: cobra.MaximumNArgs(1), Run: rsaSignExecute, } func rsaSignExecute(cmd *cobra.Command, args []string) { var ( content []byte cert []byte keys *rsa.KeyPair err error ) 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 rsaSignFile { if len(rsaSignInputFile) == 0 { fmt.Println("必须指定输入文件名。") return } file, err := os.Open(rsaSignInputFile) 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) == 0 { fmt.Println("必须指定输入内容。") return } content = []byte(args[0]) } signature, err := keys.Sign(content) if err != nil { fmt.Printf("无法签名:%s\n", err) return } switch rsaSignEncoding { case types.ResultInHex: fmt.Printf("签名为:%s\n", hex.ToHex(signature)) case types.ResultInBase64: fmt.Printf("签名为:%s\n", base64.ToBase64(signature)) } } func init() { rsaSignCmd.Flags().BoolVarP(&rsaSignFile, "file", "f", false, "指定对文件内容进行签名") rsaSignCmd.Flags().StringVarP(&rsaSignInputFile, "input", "i", "", "指定读入内容的文件名") rsaSignCmd.Flags().VarP(&rsaSignEncoding, "encoding", "e", "指定签名输出编码方式,可选值为hex或base64") rsaCmd.AddCommand(rsaSignCmd) }