173 lines
4.0 KiB
Go
173 lines
4.0 KiB
Go
package encrypt
|
|
|
|
import (
|
|
"crypto"
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/sha1"
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
)
|
|
|
|
func RSA_Gen(bits int) {
|
|
//get current path
|
|
_, currentpath, _, _ := runtime.Caller(0)
|
|
currentpath = filepath.Dir(currentpath)
|
|
|
|
//----------------------------------------------private key
|
|
|
|
// GenerateKey generates an RSA keypair of the given bit size using the
|
|
// random source random (for example, crypto/rand.Reader).
|
|
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
//serialize privatekey to ASN.1 der by x509.MarshalPKCS8PrivateKey
|
|
x509privatekey, err := x509.MarshalPKCS8PrivateKey(privateKey)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
//encode x509 to pem and save to file
|
|
//1. create privatefile
|
|
privatekeyfile, err := os.Create(currentpath + "/privatekey.pem")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer privatekeyfile.Close()
|
|
//2. new a pem block struct object
|
|
privatekeyblock := pem.Block{
|
|
Type: "PRIVATE KEY",
|
|
Headers: nil,
|
|
Bytes: x509privatekey,
|
|
}
|
|
//3. save to file
|
|
pem.Encode(privatekeyfile, &privatekeyblock)
|
|
|
|
//----------------------------------------------public key
|
|
|
|
//get public key
|
|
publickey := privateKey.PublicKey
|
|
//serialize publickey to ASN.1 der by x509.MarshalPKCS8PublicKey
|
|
x509publickey, _ := x509.MarshalPKIXPublicKey(&publickey)
|
|
|
|
//encode x509 to pem and save to file
|
|
//1. create publickeyfile
|
|
publickeyfile, err := os.Create(currentpath + "/publickey.pem")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer publickeyfile.Close()
|
|
|
|
//2. new a pem block struct object
|
|
publickeyblock := pem.Block{
|
|
Type: "PUBLIC KEY",
|
|
Headers: nil,
|
|
Bytes: x509publickey,
|
|
}
|
|
|
|
//3. save to file
|
|
pem.Encode(publickeyfile, &publickeyblock)
|
|
}
|
|
func RSA_Encrypt(plainText []byte, publickeypath string) []byte {
|
|
//open publickeyfile
|
|
publickeyfile, err := os.Open(publickeypath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer publickeyfile.Close()
|
|
|
|
//get publickeyfile info
|
|
publickeyfileInfo, _ := publickeyfile.Stat()
|
|
|
|
//read publickeyfile content
|
|
//1. make size
|
|
buf := make([]byte, publickeyfileInfo.Size())
|
|
//2. read file to buf
|
|
publickeyfile.Read(buf)
|
|
//3. decode pem
|
|
publickeyDecodeBlock, _ := pem.Decode(buf)
|
|
//4. x509 decode
|
|
publicKeyInterface, err := x509.ParsePKIXPublicKey(publickeyDecodeBlock.Bytes)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
//assert
|
|
publicKey := publicKeyInterface.(*rsa.PublicKey)
|
|
|
|
//encrypt plainText
|
|
cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return cipherText
|
|
}
|
|
|
|
func RSA_Decrypt(cipherText []byte, privatekeypath string) []byte {
|
|
//open privatekeyfile
|
|
privatekeyfile, err := os.Open(privatekeypath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer privatekeyfile.Close()
|
|
//get privatekeyfile content
|
|
privatekeyinfo, _ := privatekeyfile.Stat()
|
|
buf := make([]byte, privatekeyinfo.Size())
|
|
privatekeyfile.Read(buf)
|
|
//pem decode
|
|
privatekeyblock, _ := pem.Decode(buf)
|
|
//X509 decode
|
|
parseKey, err := x509.ParsePKCS8PrivateKey(privatekeyblock.Bytes)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
privateKey := parseKey.(*rsa.PrivateKey)
|
|
//decrypt the cipher
|
|
plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return plainText
|
|
}
|
|
|
|
func RSA_Sign_SHA1(cipherText []byte, privatekeypath string) []byte {
|
|
//open privatekeyfile
|
|
privatekeyfile, err := os.Open(privatekeypath)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer privatekeyfile.Close()
|
|
//get privatekeyfile content
|
|
privatekeyinfo, _ := privatekeyfile.Stat()
|
|
buf := make([]byte, privatekeyinfo.Size())
|
|
privatekeyfile.Read(buf)
|
|
//pem decode
|
|
privatekeyblock, _ := pem.Decode(buf)
|
|
//X509 decode
|
|
parseKey, err := x509.ParsePKCS8PrivateKey(privatekeyblock.Bytes)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
privateKey := parseKey.(*rsa.PrivateKey)
|
|
|
|
msgHash := sha1.New()
|
|
_, err = msgHash.Write(cipherText)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
msgHashSum := msgHash.Sum(nil)
|
|
|
|
signature, err := rsa.SignPSS(rand.Reader, privateKey, crypto.SHA1, msgHashSum, nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return signature
|
|
}
|