使用go 写一个非对称加密
时间: 2023-09-05 14:15:16 浏览: 42
下面是一个使用Go语言实现RSA非对称加密和解密的示例:
```go
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
)
func main() {
// 生成RSA密钥对
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
publicKey := &privateKey.PublicKey
// 加密数据
msg := []byte("hello world!")
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, msg)
if err != nil {
panic(err)
}
fmt.Printf("加密后的数据:%x\n", ciphertext)
// 解密数据
plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
if err != nil {
panic(err)
}
fmt.Printf("解密后的数据:%s\n", plaintext)
// 保存公钥和私钥到文件
privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
panic(err)
}
privateKeyPem := pem.EncodeToMemory(&pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: privateKeyBytes,
})
publicKeyPem := pem.EncodeToMemory(&pem.Block{
Type: "PUBLIC KEY",
Bytes: publicKeyBytes,
})
if err := WriteFile("private_key.pem", privateKeyPem); err != nil {
panic(err)
}
if err := WriteFile("public_key.pem", publicKeyPem); err != nil {
panic(err)
}
}
// WriteFile 将数据写入指定文件
func WriteFile(filename string, data []byte) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
if _, err := file.Write(data); err != nil {
return err
}
return nil
}
```
说明:
1. 通过调用`rsa.GenerateKey`函数生成RSA密钥对,其中第二个参数指定密钥长度为2048位;
2. 使用`rsa.EncryptPKCS1v15`函数加密数据,其中第二个参数为公钥;
3. 使用`rsa.DecryptPKCS1v15`函数解密数据,其中第二个参数为私钥;
4. 使用`x509.MarshalPKCS1PrivateKey`和`x509.MarshalPKIXPublicKey`函数将密钥序列化为字节数组;
5. 使用`pem.EncodeToMemory`函数将字节数组编码为PEM格式;
6. 使用`WriteFile`函数将PEM格式的密钥保存到文件。