Files
web_ylsa/api_iris/utils/rsa.go
2025-07-11 16:54:11 +08:00

128 lines
3.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package utils
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"github.com/sirupsen/logrus"
"main/database"
"main/model"
"reflect"
"time"
)
func GetPrivateKeys(user string, date string) (model.DayKeys, error) {
var resKey model.DayKeys
//today := time.Now().Format("2006-01-02")
db := database.GetInstance().GetMysqlDb()
if err := db.Where("date = ? and user = ?", date, user).Order("id").First(&resKey).Error; err != nil {
logrus.Errorln("sql执行失败", err)
}
if reflect.DeepEqual(resKey, model.DayKeys{}) {
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return model.DayKeys{}, err
}
x509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
base64PrivateKey := base64.StdEncoding.EncodeToString(x509PrivateKey)
resKey = model.DayKeys{
Date: date,
Key: base64PrivateKey,
AesKey: NewKey(32),
User: user,
}
if err1 := db.Create(&resKey).Error; err1 != nil {
logrus.Errorln("sql执行失败", err1)
}
logrus.Warnln(date + "resKey为空创建resKey")
return resKey, nil
} else {
if err := db.Where("date = ? and user = ? and id <> ?", date, user, resKey.ID).Delete(&model.DayKeys{}).Error; err != nil {
logrus.Errorln("sql执行失败", err)
}
}
logrus.Infoln("resKey存在返回私钥")
return resKey, nil
}
func GetPublicKey(user string) (string, error) {
var userLogin model.User
db := database.GetInstance().GetMysqlDb()
if err := db.Where("username = ?", user).First(&userLogin).Error; err != nil {
logrus.Errorln("sql执行失败", err)
}
if userLogin.Date == "" {
logrus.Infoln(user + ":用户之前未登录系统")
userLogin.Date = time.Now().Format("2006-01-02")
}
sPrivateKey, err := GetPrivateKeys(user, userLogin.Date)
if err != nil {
return "", err
}
deBase64privateKey, err := base64.StdEncoding.DecodeString(sPrivateKey.Key)
if err != nil {
return "", err
}
privateKey, err := x509.ParsePKCS1PrivateKey(deBase64privateKey)
if err != nil {
return "", err
}
publicKey := privateKey.PublicKey
x509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
if err != nil {
return "", err
}
base64PublicKey := base64.StdEncoding.EncodeToString(x509PublicKey)
logrus.Infoln(user + ":获取公钥成功")
return base64PublicKey, nil
}
func RsaEncrypt(s string, user string) (string, error) {
sPublicKey, err := GetPublicKey(user)
if err != nil {
return "", err
}
deBase64Public, err := base64.StdEncoding.DecodeString(sPublicKey)
if err != nil {
return "", err
}
publicKey, err := x509.ParsePKIXPublicKey(deBase64Public)
if err != nil {
return "", err
}
res, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey.(*rsa.PublicKey), []byte(s))
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(res), nil
}
func RsaDecrypt(s string, sPrivateKey string) (string, error) {
//sPrivateKey, err := GetPrivateKeys(user)
//if err != nil {
// return "", err
//}
deBase64Private, err := base64.StdEncoding.DecodeString(sPrivateKey)
if err != nil {
logrus.Errorln("rsa私钥: base64 decode err:", err)
return "", err
}
privateKey, err := x509.ParsePKCS1PrivateKey(deBase64Private)
if err != nil {
logrus.Errorln("rsa私钥: x509 decode err:", err)
return "", err
}
des, err := base64.StdEncoding.DecodeString(s)
if err != nil {
logrus.Errorln("rsa: base64 decode err:", err)
return "", err
}
res, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, des)
if err != nil {
logrus.Errorln("rsa: 解密失败:", err)
return "", err
}
return string(res), nil
}