crypto.go

This commit is contained in:
ZhuoQinghui 2024-10-30 18:22:10 +08:00
parent ee6ef8dde3
commit f20645d1d2
5 changed files with 187 additions and 46 deletions

View File

@ -1,6 +1,7 @@
package src package src
import ( import (
"acme-mana/src/crypto"
"github.com/go-acme/lego/v4/log" "github.com/go-acme/lego/v4/log"
"github.com/go-acme/lego/v4/platform/config/env" "github.com/go-acme/lego/v4/platform/config/env"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
@ -50,7 +51,8 @@ func InitConfig() {
} }
func defaultConf() *AppConfig { func defaultConf() *AppConfig {
priKey, pubKey, err := GenRsa() //priKey, pubKey, err := GenRsa()
priKey, pubKey, err := crypto.GenRSA()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

96
src/crypto/crypto.go Normal file
View File

@ -0,0 +1,96 @@
package crypto
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"io"
)
func EncryptAES(key []byte, plaintext []byte) []byte {
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
return ciphertext
}
func DecryptAES(key []byte, ciphertext []byte) []byte {
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
if len(ciphertext) < aes.BlockSize {
panic("ciphertext too short")
}
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(ciphertext, ciphertext)
return ciphertext
}
func EncryptRSA(publicKey *rsa.PublicKey, message []byte) ([]byte, error) {
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, message)
if err != nil {
return nil, err
}
return ciphertext, nil
}
func EncryptRSABase64(publicKey string, content []byte) ([]byte, error) {
pubKey, err := base64.StdEncoding.DecodeString(publicKey)
if err != nil {
return nil, err
}
key, err := x509.ParsePKCS1PublicKey(pubKey)
if err != nil {
return nil, err
}
return EncryptRSA(key, content)
}
func DecryptRSA(privateKey *rsa.PrivateKey, ciphertext []byte) ([]byte, error) {
plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
if err != nil {
return nil, err
}
return plaintext, nil
}
func DecryptRSABase64(privateKey string, ciphertext []byte) ([]byte, error) {
priKey, err := base64.StdEncoding.DecodeString(privateKey)
if err != nil {
return nil, err
}
key, err := x509.ParsePKCS1PrivateKey(priKey)
if err != nil {
return nil, err
}
return DecryptRSA(key, ciphertext)
}
func GenRSA() (priKey string, pubKey string, err error) {
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return "", "", err
}
priKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
publicKey := &privateKey.PublicKey
publicKeyBytes := x509.MarshalPKCS1PublicKey(publicKey)
pubKey = base64.StdEncoding.EncodeToString(publicKeyBytes)
priKey = base64.StdEncoding.EncodeToString(priKeyBytes)
err = nil
return
}

View File

@ -21,7 +21,8 @@ func Start() {
log.Println("Run Acme Mana...") log.Println("Run Acme Mana...")
args := os.Args args := os.Args
if len(args) <= 1 { if len(args) <= 1 {
daemonStart() //daemonStart()
doTask()
return return
} }
command := args[1] command := args[1]

View File

@ -1,17 +1,12 @@
package src package src
import ( import (
"acme-mana/src/crypto"
"bytes" "bytes"
"crypto/cipher"
"crypto/des"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64" "encoding/base64"
"encoding/hex"
"encoding/json" "encoding/json"
"encoding/pem"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"io"
"log" "log"
"os" "os"
"path" "path"
@ -111,51 +106,66 @@ func refreshCert(c *gin.Context) {
} }
func getToken(c *gin.Context) (token string) { func getToken(c *gin.Context) (token string) {
token = decryptParam(c.Param("token")) token = c.Query("token")
token = decryptParam(token)
return return
} }
func decryptParam(param string) string { func decryptParam(param string) string {
priKey := GetAppConfig().Encrypt.PriKey priKey := GetAppConfig().Encrypt.PriKey
tokenBytes, err := hex.DecodeString(param)
//tokenBytes, err := base64.StdEncoding.DecodeString(param)
//if err != nil {
// log.Fatalln(err)
//}
tokenPlain, err := crypto.DecryptRSABase64(priKey, tokenBytes)
if err != nil {
log.Fatal(err)
}
return string(tokenPlain)
// 使用RSA解密 // 使用RSA解密
block, _ := pem.Decode([]byte(priKey)) //block, _ := pem.Decode([]byte(priKey))
if block == nil { //if block == nil {
log.Fatal("failed to parse PEM block containing the private key") // log.Fatal("failed to parse PEM block containing the private key")
} //}
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) //privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil { //if err != nil {
log.Fatal(err) // log.Fatal(err)
} //}
paramData := []byte(param) //paramData := []byte(param)
plaintext, err := rsa.DecryptPKCS1v15(nil, privateKey, paramData) //plaintext, err := rsa.DecryptPKCS1v15(nil, privateKey, paramData)
if err != nil { //if err != nil {
log.Fatal(err) // log.Fatal(err)
} //}
return string(plaintext) //return string(plaintext)
} }
func encryptResult(content string, token string) string { func encryptResult(content string, token string) string {
key := []byte(token) result := crypto.EncryptAES([]byte(token), []byte(content))
plaintext := []byte(content) return base64.StdEncoding.EncodeToString(result)
block, err := des.NewCipher(key) //key := []byte(token)
if err != nil { //plaintext := []byte(content)
log.Fatal(err) //
} //block, err := des.NewCipher(key)
//if err != nil {
plaintext = pad(plaintext, block.BlockSize()) // log.Fatal(err)
//}
iv := make([]byte, block.BlockSize()) //
if _, err := io.ReadFull(rand.Reader, iv); err != nil { //plaintext = pad(plaintext, block.BlockSize())
log.Fatal("Error generating random IV:", err) //
} //iv := make([]byte, block.BlockSize())
mode := cipher.NewCBCEncrypter(block, iv) //if _, err := io.ReadFull(rand.Reader, iv); err != nil {
// log.Fatal("Error generating random IV:", err)
ciphertext := make([]byte, len(plaintext)) //}
mode.CryptBlocks(ciphertext, plaintext) //mode := cipher.NewCBCEncrypter(block, iv)
//
return base64.StdEncoding.EncodeToString(ciphertext) //ciphertext := make([]byte, len(plaintext))
//mode.CryptBlocks(ciphertext, plaintext)
//
//return base64.StdEncoding.EncodeToString(ciphertext)
} }
func pad(src []byte, blockSize int) []byte { func pad(src []byte, blockSize int) []byte {

View File

@ -1,6 +1,7 @@
package test package test
import ( import (
"acme-mana/src/crypto"
"crypto/rand" "crypto/rand"
"crypto/rsa" "crypto/rsa"
"crypto/x509" "crypto/x509"
@ -20,12 +21,43 @@ func TestGenRsa(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
pubKey := base64.StdEncoding.EncodeToString(publicKeyBytes) pubKey := base64.StdEncoding.EncodeToString(publicKeyBytes)
//publicKey := &privateKey.PublicKey
//publicKeyBytes := x509.MarshalPKCS1PublicKey(publicKey)
//pubKey := base64.StdEncoding.EncodeToString(publicKeyBytes)
key := x509.MarshalPKCS1PrivateKey(privateKey) key := x509.MarshalPKCS1PrivateKey(privateKey)
priKey := base64.StdEncoding.EncodeToString(key) priKey := base64.StdEncoding.EncodeToString(key)
fmt.Println(pubKey) fmt.Println(pubKey)
fmt.Println() fmt.Println()
fmt.Println(priKey) fmt.Println(priKey)
} }
func TestAesEncrypt(t *testing.T) {
key := []byte("12345678901234561234567890123456")
encryptd := crypto.EncryptAES(key, []byte("hello"))
fmt.Println(base64.StdEncoding.EncodeToString(encryptd))
content := crypto.DecryptAES(key, encryptd)
fmt.Println(string(content))
}
func TestRSA(t *testing.T) {
priKey, pubKey, err := crypto.GenRSA()
if err != nil {
log.Fatal(err)
}
fmt.Println("---- pri key ---")
fmt.Println(priKey)
fmt.Println("---- pub key ---")
fmt.Println(pubKey)
fmt.Println("---- encrypt ---")
content := "hello"
encrypted, err := crypto.EncryptRSABase64(pubKey, []byte(content))
if err != nil {
log.Fatal(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(encrypted))
fmt.Println("---- decrypt ---")
decryptd, err := crypto.DecryptRSABase64(priKey, encrypted)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(decryptd))
}