2025-10-16 13:28:24 +08:00

93 lines
2.2 KiB
Go

package cryptorsa
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
)
// GenerateKey 生成一个 2048 位的 RSA 密钥对
func GenerateKey() {
// 生成一个 2048 位的 RSA 密钥对
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
// 获取私钥的字节表示
privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
// 将私钥字节放入 PEM 块中
privateKeyPEM := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: privateKeyBytes,
}
// 将 PEM 块编码为字符串
privateKeyStr := string(pem.EncodeToMemory(privateKeyPEM))
// 获取公钥的字节表示
publicKeyBytes, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
if err != nil {
panic(err)
}
// 将公钥字节放入 PEM 块中
publicKeyPEM := &pem.Block{
Type: "PUBLIC KEY",
Bytes: publicKeyBytes,
}
// 将 PEM 块编码为字符串
publicKeyStr := string(pem.EncodeToMemory(publicKeyPEM))
fmt.Println(fmt.Sprintf("RSA 公钥:\n%s", publicKeyStr))
fmt.Println(fmt.Sprintf("RSA 私钥:\n%s", privateKeyStr))
fmt.Println("你可以将这些字符串保存到文件中或传递给其他程序使用,记得妥善保管私钥,避免泄露!")
}
// PublicKeyEncrypt 公钥加密
func PublicKeyEncrypt(publicKey, plaintext string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(publicKey))
// x509 解码
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return "", err
}
//对明文进行加密
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKeyInterface.(*rsa.PublicKey), []byte(plaintext))
if err != nil {
return "", err
}
//返回密文
return base64.URLEncoding.EncodeToString(ciphertext), nil
}
// PrivateKeyDecrypt 私钥解密
func PrivateKeyDecrypt(privateKey, ciphertext string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(privateKey))
// X509 解码
rsaPrivateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
ciphertextBytes, err := base64.URLEncoding.DecodeString(ciphertext)
//对密文进行解密
plaintext, _ := rsa.DecryptPKCS1v15(rand.Reader, rsaPrivateKey, ciphertextBytes)
//返回明文
return string(plaintext), nil
}