97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
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)
|
||
}
|