golang使用RSA加密和解密的实现示例
作者:幸享龙枫
在Golang中RSA加密和解密是一个常见的操作,本文主要介绍了golang使用RSA加密和解密的实现示例,具有一定的参考价值,感兴趣的可以了解一下
前提
本文章我们是先读取的RSA文件,所以需要先生成RSA,并且保存在文件中,再进行加密
生成RSA公钥和密钥
如果没有公钥和密钥,可以先看看我上一篇文章
读取文件
在加密前,我们需要读取RSA文件内容,关于读取文件内容,我封装了一个"获取文件内容"的方法:
// GetFileContent 获取文件内容 func GetFileContent(filePath string) (string, error) { file, err := os.Open(filePath) if err != nil { return "", err } defer file.Close() inputReader := bufio.NewReader(file) s := "" for { inputString, readerError := inputReader.ReadString('\n') s = fmt.Sprintf("%s%s", s, inputString) if readerError == io.EOF { break } } return s, nil }
因为我们要读取 公钥 和 密钥 两个文件,所以避免重复的代码,我们封装了这么个方法,避免重复的代码。
加密
package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "demo-mall-api-user/internal/utils" "encoding/base64" "encoding/pem" "fmt" ) func main() { // 定义目录和文件 dirPath := "/app/rsa" fileName := "public.pem" filePath := fmt.Sprintf("%s/%s", dirPath, fileName) // 拼接成完整的文件地址 publicContent, err := utils.GetFileContent(filePath) // 读取文件内容 if err != nil { fmt.Println("读取公钥文件错误:", err.Error()) return } // 解析PEM格式的数据 block, _ := pem.Decode([]byte(publicContent)) if block == nil || block.Type != "PUBLIC KEY" { fmt.Println("公钥类型错误") return } // 解析公钥 publicKey, _ := x509.ParsePKIXPublicKey(block.Bytes) // 类型断言为*rsa.PublicKey rsaPub, ok := publicKey.(*rsa.PublicKey) if !ok { fmt.Println("public key is not RSA") return } // 待加密的字符串 message := []byte("Lucky") // 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值 label := []byte("") ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, rsaPub, message, label) // 转换为base64编码的字符串 hexStr := base64.StdEncoding.EncodeToString(ciphertext) fmt.Println("加密前的数据:", string(message)) fmt.Println("加密后:", hexStr) }
运行程序:
go run main.go
会打印出:
以上,我们就得到了加密后的数据
解密
package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "demo-mall-api-user/internal/utils" "encoding/base64" "encoding/pem" "fmt" "log" ) func main() { // 定义目录和文件 dirPath := "/app/rsa" fileName := "private.key" filePath := fmt.Sprintf("%s/%s", dirPath, fileName) // 拼接成完整的文件地址 privateContent, err := utils.GetFileContent(filePath) // 读取文件内容 if err != nil { fmt.Println("读取密钥文件错误:", err.Error()) return } // 解析PEM格式的数据 block, _ := pem.Decode([]byte(privateContent)) if block == nil || block.Type != "RSA PRIVATE KEY" { fmt.Println("私钥类型错误") return } // 解析密钥 privateKey, _ := x509.ParsePKCS1PrivateKey(block.Bytes) // 待解密的字符串 encodedCiphertext := "BR8ixCEoG4/EW63VEf/lnBiATAaPIdH6OzxB96vSGewR+Dm98e1KcpPvvRoggw7GJfdk2gxlDN8kuk4BeoSxuKdIe9FupbY+V58k83ZWpyCY2anDYmFkBIog9dVddTR41ktxRp3+lr1+ztoZUivJMUerbqmarNvCwf/2ALQ/4Qn7bBZo4c0OPXHij9bOfaN+elBmqLMFB4DrCYdoNbU49i95XjziUv9wdLRLSTD+xnMxjc3jDAFTyhDgw9abdrqJgilAcPjXmsZhyqkcEOwCm16ZjGn+OmzarvC6O6aCClRYiTcGOg2utt4c5fDDRSoGqmeULu1971b7DpETThey3g==" // 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值 label := []byte("") // Base64编码的字符串解码 ciphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext) if err != nil { log.Fatalf("failed to decode base64 ciphertext: %v", err) return } // 使用私钥进行解密 plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, label) if err != nil { log.Fatalf("Error decrypting message: %s", err) return } fmt.Println("解密前的数据:", encodedCiphertext) fmt.Println("解密后:", string(plaintext)) }
运行程序:
go run main.go
会打印出:
到此这篇关于golang使用RSA加密和解密的实现示例的文章就介绍到这了,更多相关golang RSA加密和解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!