Update crypto
1. Add Md5 encrypt 2. Add NewKeyRSA 3. Update aes with key, ivtags/v1.3.1 v1.3.1
parent
066f6829bd
commit
b9fe8c9ef2
@ -0,0 +1,47 @@
|
|||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/aes"
|
||||||
|
"crypto/cipher"
|
||||||
|
)
|
||||||
|
|
||||||
|
func paddingPKCS7(ciphertext []byte, blockSize int) []byte {
|
||||||
|
padding := blockSize - len(ciphertext)%blockSize
|
||||||
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
||||||
|
return append(ciphertext, padtext...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unpaddingPKCS7(origData []byte) []byte {
|
||||||
|
length := len(origData)
|
||||||
|
unpadding := int(origData[length-1])
|
||||||
|
return origData[:(length - unpadding)]
|
||||||
|
}
|
||||||
|
|
||||||
|
//EncryptAES 加密函式
|
||||||
|
func EncryptAES(plaintext, key, iv []byte) ([]byte, error) {
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
blockSize := block.BlockSize()
|
||||||
|
plaintext = paddingPKCS7(plaintext, blockSize)
|
||||||
|
blockMode := cipher.NewCBCEncrypter(block, iv)
|
||||||
|
crypted := make([]byte, len(plaintext))
|
||||||
|
blockMode.CryptBlocks(crypted, plaintext)
|
||||||
|
return crypted, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecryptAES 解密函式
|
||||||
|
func DecryptAES(ciphertext, key, iv []byte) ([]byte, error) {
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
blockSize := block.BlockSize()
|
||||||
|
blockMode := cipher.NewCBCDecrypter(block, iv[:blockSize])
|
||||||
|
origData := make([]byte, len(ciphertext))
|
||||||
|
blockMode.CryptBlocks(origData, ciphertext)
|
||||||
|
origData = unpaddingPKCS7(origData)
|
||||||
|
return origData, nil
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EncryptPassword 加密密碼
|
||||||
|
func EncryptPassword(pwd string) (string, error) {
|
||||||
|
hash, err := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(hash), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckPassword 檢查密碼
|
||||||
|
func CheckPassword(pwd, hash string) error {
|
||||||
|
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(pwd))
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/x509"
|
||||||
|
"encoding/pem"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewKeyRSA(bitSize int) (pubPEM []byte, keyPEM []byte, err error) {
|
||||||
|
// Generate RSA key.
|
||||||
|
key, err := rsa.GenerateKey(rand.Reader, bitSize)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract public component.
|
||||||
|
pubBytes, err := x509.MarshalPKIXPublicKey(key.Public())
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
pubPEM = pem.EncodeToMemory(
|
||||||
|
&pem.Block{
|
||||||
|
Type: "RSA PUBLIC KEY",
|
||||||
|
Bytes: pubBytes,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
// Encode private key to PKCS#1 ASN.1 PEM.
|
||||||
|
keyPEM = pem.EncodeToMemory(
|
||||||
|
&pem.Block{
|
||||||
|
Type: "RSA PRIVATE KEY",
|
||||||
|
Bytes: x509.MarshalPKCS1PrivateKey(key),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
return pubPEM, keyPEM, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncryptRSA rsa加密
|
||||||
|
func EncryptRSA(value, publicKey []byte) ([]byte, error) {
|
||||||
|
block, _ := pem.Decode(publicKey)
|
||||||
|
if block == nil {
|
||||||
|
return nil, errors.New("public key error")
|
||||||
|
}
|
||||||
|
|
||||||
|
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pub := pubInterface.(*rsa.PublicKey)
|
||||||
|
return rsa.EncryptPKCS1v15(rand.Reader, pub, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecryptRSA rsa解密
|
||||||
|
func DecryptRSA(ciphertext, privateKey []byte) ([]byte, error) {
|
||||||
|
block, _ := pem.Decode(privateKey)
|
||||||
|
if block == nil {
|
||||||
|
return nil, errors.New("private key error")
|
||||||
|
}
|
||||||
|
|
||||||
|
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
|
||||||
|
}
|
Loading…
Reference in New Issue