This commit is contained in:
2023-05-17 13:57:50 +08:00
parent aa0fb37da2
commit 110c5088cc
4 changed files with 208 additions and 0 deletions

102
mycrypto/aes.go Normal file
View File

@@ -0,0 +1,102 @@
package mycrypto
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/hex"
"fmt"
)
var (
defaultAes256Cbc *Aes256Cbc
)
type Aes256Cbc struct {
Iv []byte // iv向量 (key 32字节 256位)
Key []byte // 加密密钥 (iv 16字节 128位)
}
func NewAes256Cbc(key, iv string) *Aes256Cbc {
if len(key) != 32 {
panic("密钥key长度应为32")
}
if len(iv) != aes.BlockSize {
panic("iv长度应为16")
}
return &Aes256Cbc{
Iv: []byte(iv),
Key: []byte(key),
}
}
func InitAes256Cbc(key, iv string) {
defaultAes256Cbc = NewAes256Cbc(key, iv)
}
func Aes256CbcEncrypt(plainText string) (string, error) {
return defaultAes256Cbc.Encrypt(plainText)
}
func Aes256CbcDecrypt(cipherText string) (string, error) {
return defaultAes256Cbc.Decrypt(cipherText)
}
// Encrypt 加密
func (a *Aes256Cbc) Encrypt(plainText string) (res string, err error) {
defer func() {
if err2 := recover(); err2 != nil {
err = fmt.Errorf("panic: %s", err2)
}
}()
// PKCS5填充补齐数据块
bPlaintext := a.PKCS5Padding([]byte(plainText), aes.BlockSize)
block, err := aes.NewCipher(a.Key)
if err != nil {
return plainText, err
}
ciphertext := make([]byte, len(bPlaintext))
mode := cipher.NewCBCEncrypter(block, a.Iv)
mode.CryptBlocks(ciphertext, bPlaintext)
return hex.EncodeToString(ciphertext), nil
}
// Decrypt 解密
func (a *Aes256Cbc) Decrypt(cipherText string) (res string, err error) {
defer func() {
if err2 := recover(); err2 != nil {
err = fmt.Errorf("panic: %s", err2)
}
}()
block, err := aes.NewCipher(a.Key)
if err != nil {
return "", err
}
decodeString, err := hex.DecodeString(cipherText)
if err != nil {
return "", err
}
mode := cipher.NewCBCDecrypter(block, a.Iv)
mode.CryptBlocks(decodeString, decodeString)
// 移除多余填充的补充位
return string(a.PKCS5UnPadding(decodeString)), nil
}
func (a *Aes256Cbc) PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func (a *Aes256Cbc) PKCS5UnPadding(src []byte) []byte {
length := len(src)
unpadding := int(src[length-1])
return src[:(length - unpadding)]
}

83
mycrypto/aes_test.go Normal file
View File

@@ -0,0 +1,83 @@
package mycrypto
import (
"fmt"
"github.com/stretchr/testify/assert"
"testing"
)
func TestAes256Cbc(t *testing.T) {
key := "iYWKp8yz11iAzdSrGdYAhaW82Kdw209c"
iv := "QsHZn2hacbZ5A7PT"
InitAes256Cbc(key, iv)
str := "1234567890111213"
encrypt, err := Aes256CbcEncrypt(str)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("---%+v---\n", encrypt)
decrypt, err := Aes256CbcDecrypt(encrypt)
if err != nil {
fmt.Println(err)
return
}
as := assert.New(t)
fmt.Printf("%+v\n", as.Equal(str, decrypt))
fmt.Printf("%s %s\n", str, decrypt)
}
func BenchmarkAes256Cbc(b *testing.B) {
key := "7zlx6MoTL76B9BiYuO4nytGBUk0HnSJ1"
iv := "1234567890123456"
InitAes256Cbc(key, iv)
for i := 0; i < b.N; i++ {
str := fmt.Sprintf("440123456789%d10111213", i)
encrypt, err := Aes256CbcEncrypt(str)
if err != nil {
fmt.Println(err)
return
}
//fmt.Printf("%+v%s\n", encrypt, "---")
_, err = Aes256CbcDecrypt(encrypt)
if err != nil {
fmt.Println(err)
return
}
}
}
func BenchmarkAes256CbcCheck(b *testing.B) {
key := "iYWKp8yz11iAzdSrGdYAhaW82Kdw209c"
iv := "QsHZn2hacbZ5A7PT"
InitAes256Cbc(key, iv)
as := assert.New(b)
for i := 0; i < b.N; i++ {
str := fmt.Sprintf("440123456789%d10111213", i)
encrypt, err := Aes256CbcEncrypt(str)
if err != nil {
fmt.Println(err)
return
}
//fmt.Printf("%+v%s\n", encrypt, "---")
decrypt, err := Aes256CbcDecrypt(encrypt)
if err != nil {
fmt.Println(err)
return
}
if !as.Equal(str, decrypt) {
b.Fail()
}
}
}

20
mycrypto/hash.go Normal file
View File

@@ -0,0 +1,20 @@
package mycrypto
import (
"crypto/md5"
"crypto/sha1"
"encoding/hex"
)
func Md5(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}
func Sha1(str string) string {
h := sha1.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}