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