commit
da76ca3a12
@ -0,0 +1 @@
|
||||
.idea
|
@ -0,0 +1,126 @@
|
||||
package rsa
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
//Secret defines the private key type
|
||||
type Secret uint
|
||||
|
||||
const (
|
||||
PKCS1 Secret = iota
|
||||
PKCS8
|
||||
)
|
||||
|
||||
// SignWithSha1Base64 @Title 签名 采用sha1算法进行签名并输出为Base64格式
|
||||
func SignWithSha1Base64(data string, privateKey *rsa.PrivateKey) (string, error) {
|
||||
h := sha1.New()
|
||||
h.Write([]byte(data))
|
||||
hash := h.Sum(nil)
|
||||
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hash[:])
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
out := base64.StdEncoding.EncodeToString(signature)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// EncryptWithSha1Base64 @Title 加密 采用sha1算法加密后转base64格式
|
||||
func EncryptWithSha1Base64(originalData string, publicKey *rsa.PublicKey) (string, error) {
|
||||
partLen := publicKey.N.BitLen()/8 - 11
|
||||
chunks := split([]byte(originalData), partLen)
|
||||
buff := bytes.NewBufferString("")
|
||||
for _, chunk := range chunks {
|
||||
encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, chunk)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
buff.Write(encryptedData)
|
||||
}
|
||||
return base64.StdEncoding.EncodeToString(buff.Bytes()), nil
|
||||
}
|
||||
|
||||
// DecryptWithSha1Base64 @Title 解密 对采用sha1算法加密后转base64格式的数据进行解密
|
||||
func DecryptWithSha1Base64(encryptedData string, privateKey *rsa.PrivateKey) (string, error) {
|
||||
encryptedDecodeBytes, err := base64.StdEncoding.DecodeString(encryptedData)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
partLen := privateKey.PublicKey.N.BitLen() / 8
|
||||
chunks := split(encryptedDecodeBytes, partLen)
|
||||
buffer := bytes.NewBufferString("")
|
||||
for _, chunk := range chunks {
|
||||
decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, chunk)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
buffer.Write(decrypted)
|
||||
}
|
||||
return buffer.String(), err
|
||||
}
|
||||
|
||||
func split(buf []byte, lim int) [][]byte {
|
||||
var chunk []byte
|
||||
chunks := make([][]byte, 0, len(buf)/lim+1)
|
||||
for len(buf) >= lim {
|
||||
chunk, buf = buf[:lim], buf[lim:]
|
||||
chunks = append(chunks, chunk)
|
||||
}
|
||||
if len(buf) > 0 {
|
||||
chunks = append(chunks, buf[:len(buf)])
|
||||
}
|
||||
return chunks
|
||||
}
|
||||
|
||||
//ParsePrivateKey parses private key bytes to rsa privateKey
|
||||
func ParsePrivateKey(privateKeyDecoded string, keyType Secret) (*rsa.PrivateKey, error) {
|
||||
decodeString, err := base64.StdEncoding.DecodeString(privateKeyDecoded)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
switch keyType {
|
||||
case PKCS1:
|
||||
return x509.ParsePKCS1PrivateKey(decodeString)
|
||||
case PKCS8:
|
||||
keyParsed, err := x509.ParsePKCS8PrivateKey(decodeString)
|
||||
return keyParsed.(*rsa.PrivateKey), err
|
||||
default:
|
||||
return &rsa.PrivateKey{}, fmt.Errorf("secretInfo PrivateKeyDataType unsupport")
|
||||
}
|
||||
}
|
||||
|
||||
//ParsePublicKey parses public key bytes to rsa publicKey
|
||||
func ParsePublicKey(privateKeyDecoded string) (*rsa.PublicKey, error) {
|
||||
decodeString, err := base64.StdEncoding.DecodeString(privateKeyDecoded)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
publicKey, err := x509.ParsePKIXPublicKey(decodeString)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return publicKey.(*rsa.PublicKey), nil
|
||||
}
|
||||
|
||||
// ParseCertificate 解析证书
|
||||
func ParseCertificate(certString string) (*x509.Certificate, error) {
|
||||
decodeString, _ := base64.StdEncoding.DecodeString(certString)
|
||||
return x509.ParseCertificate(decodeString)
|
||||
}
|
||||
|
||||
// RsaEncrypt @Title Rsa加密
|
||||
func RsaEncrypt(origData []byte, publicKey *rsa.PublicKey) ([]byte, error) {
|
||||
return rsa.EncryptPKCS1v15(rand.Reader, publicKey, origData)
|
||||
}
|
||||
|
||||
// RsaDecrypt @Title Rsa解密
|
||||
func RsaDecrypt(ciphertext []byte, privateKey *rsa.PrivateKey) ([]byte, error) {
|
||||
return rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
|
||||
}
|
Loading…
Reference in new issue