1
0
mirror of https://github.com/fumiama/aes-rsa-tcp-demo.git synced 2026-06-10 13:00:31 +08:00
Files
aes-rsa-tcp-demo/utils/aes.go
源文雨 f79b275f42 init
2023-12-29 16:29:41 +09:00

95 lines
1.8 KiB
Go

package utils
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"errors"
)
// NewAESPresharedKey typ AES-128, AES-192, or AES-256.
func NewAESPresharedKey(typ string) ([]byte, error) {
sz := 0
switch typ {
case "AES-128":
sz = 16
case "AES-192":
sz = 24
case "AES-256":
sz = 32
}
if sz <= 0 {
return nil, aes.KeySizeError(sz)
}
k := make([]byte, sz)
_, err := rand.Read(k)
if err != nil {
return nil, err
}
return k, nil
}
// EncryptAES ...
func EncryptAES(aescipher cipher.Block, data []byte) []byte {
blksz := aescipher.BlockSize()
total := len(data)
n := total / blksz
if total%blksz > 0 {
n++
}
encdat := make([]byte, blksz*n)
copy(encdat, data)
for i := 0; i < n; i++ {
a := i * blksz
b := (i + 1) * blksz
aescipher.Encrypt(encdat[a:b], encdat[a:b])
}
return encdat
}
// EncryptAESInplace ...
func EncryptAESInplace(aescipher cipher.Block, data []byte) error {
blksz := aescipher.BlockSize()
total := len(data)
n := total / blksz
if total%blksz > 0 {
n++
}
if len(data) < blksz*n {
return errors.New("data is too short")
}
for i := 0; i < n; i++ {
a := i * blksz
b := (i + 1) * blksz
aescipher.Encrypt(data[a:b], data[a:b])
}
return nil
}
// DecryptAES ...
func DecryptAES(aescipher cipher.Block, data []byte) []byte {
blksz := aescipher.BlockSize()
total := len(data)
n := total / blksz
decdat := make([]byte, blksz*n)
for i := 0; i < n; i++ {
a := i * blksz
b := (i + 1) * blksz
aescipher.Decrypt(decdat[a:b], data[a:b])
}
return decdat
}
// DecryptAESInplace ...
func DecryptAESInplace(aescipher cipher.Block, data []byte) error {
blksz := aescipher.BlockSize()
total := len(data)
n := total / blksz
for i := 0; i < n; i++ {
a := i * blksz
b := (i + 1) * blksz
aescipher.Decrypt(data[a:b], data[a:b])
}
return nil
}