mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-07-14 05:12:36 +08:00
perf: 优化Base.go的代码,添加注释,规范输出
This commit is contained in:
parent
66125a3a2d
commit
8d5806e456
134
Plugins/Base.go
134
Plugins/Base.go
@ -5,79 +5,123 @@ import (
|
|||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ReadBytes(conn net.Conn) (result []byte, err error) {
|
// ReadBytes 从连接读取数据直到EOF或错误
|
||||||
size := 4096
|
func ReadBytes(conn net.Conn) ([]byte, error) {
|
||||||
|
size := 4096 // 缓冲区大小
|
||||||
buf := make([]byte, size)
|
buf := make([]byte, size)
|
||||||
|
var result []byte
|
||||||
|
var lastErr error
|
||||||
|
|
||||||
|
// 循环读取数据
|
||||||
for {
|
for {
|
||||||
count, err := conn.Read(buf)
|
count, err := conn.Read(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
lastErr = err
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
result = append(result, buf[0:count]...)
|
result = append(result, buf[0:count]...)
|
||||||
|
|
||||||
|
// 如果读取的数据小于缓冲区,说明已经读完
|
||||||
if count < size {
|
if count < size {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果读到了数据,则忽略错误
|
||||||
if len(result) > 0 {
|
if len(result) > 0 {
|
||||||
err = nil
|
return result, nil
|
||||||
}
|
}
|
||||||
return result, err
|
|
||||||
|
return result, lastErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 默认AES加密密钥
|
||||||
var key = "0123456789abcdef"
|
var key = "0123456789abcdef"
|
||||||
|
|
||||||
func AesEncrypt(orig string, key string) string {
|
// AesEncrypt 使用AES-CBC模式加密字符串
|
||||||
// 转成字节数组
|
func AesEncrypt(orig string, key string) (string, error) {
|
||||||
|
// 转为字节数组
|
||||||
origData := []byte(orig)
|
origData := []byte(orig)
|
||||||
k := []byte(key)
|
keyBytes := []byte(key)
|
||||||
// 分组秘钥
|
|
||||||
// NewCipher该函数限制了输入k的长度必须为16, 24或者32
|
// 创建加密块,要求密钥长度必须为16/24/32字节
|
||||||
block, _ := aes.NewCipher(k)
|
block, err := aes.NewCipher(keyBytes)
|
||||||
// 获取秘钥块的长度
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("创建加密块失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取块大小并填充数据
|
||||||
blockSize := block.BlockSize()
|
blockSize := block.BlockSize()
|
||||||
// 补全码
|
|
||||||
origData = PKCS7Padding(origData, blockSize)
|
origData = PKCS7Padding(origData, blockSize)
|
||||||
// 加密模式
|
|
||||||
blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
|
// 创建CBC加密模式
|
||||||
// 创建数组
|
blockMode := cipher.NewCBCEncrypter(block, keyBytes[:blockSize])
|
||||||
cryted := make([]byte, len(origData))
|
|
||||||
// 加密
|
// 加密数据
|
||||||
blockMode.CryptBlocks(cryted, origData)
|
encrypted := make([]byte, len(origData))
|
||||||
return base64.StdEncoding.EncodeToString(cryted)
|
blockMode.CryptBlocks(encrypted, origData)
|
||||||
|
|
||||||
|
// base64编码
|
||||||
|
return base64.StdEncoding.EncodeToString(encrypted), nil
|
||||||
}
|
}
|
||||||
func AesDecrypt(cryted string, key string) string {
|
|
||||||
// 转成字节数组
|
// AesDecrypt 使用AES-CBC模式解密字符串
|
||||||
crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
|
func AesDecrypt(crypted string, key string) (string, error) {
|
||||||
k := []byte(key)
|
// base64解码
|
||||||
// 分组秘钥
|
cryptedBytes, err := base64.StdEncoding.DecodeString(crypted)
|
||||||
block, _ := aes.NewCipher(k)
|
if err != nil {
|
||||||
// 获取秘钥块的长度
|
return "", fmt.Errorf("base64解码失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
keyBytes := []byte(key)
|
||||||
|
|
||||||
|
// 创建解密块
|
||||||
|
block, err := aes.NewCipher(keyBytes)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("创建解密块失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建CBC解密模式
|
||||||
blockSize := block.BlockSize()
|
blockSize := block.BlockSize()
|
||||||
// 加密模式
|
blockMode := cipher.NewCBCDecrypter(block, keyBytes[:blockSize])
|
||||||
blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
|
|
||||||
// 创建数组
|
// 解密数据
|
||||||
orig := make([]byte, len(crytedByte))
|
origData := make([]byte, len(cryptedBytes))
|
||||||
// 解密
|
blockMode.CryptBlocks(origData, cryptedBytes)
|
||||||
blockMode.CryptBlocks(orig, crytedByte)
|
|
||||||
// 去补全码
|
// 去除填充
|
||||||
orig = PKCS7UnPadding(orig)
|
origData, err = PKCS7UnPadding(origData)
|
||||||
return string(orig)
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("去除PKCS7填充失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(origData), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 补码
|
// PKCS7Padding 对数据进行PKCS7填充
|
||||||
// AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
|
func PKCS7Padding(data []byte, blockSize int) []byte {
|
||||||
func PKCS7Padding(ciphertext []byte, blocksize int) []byte {
|
padding := blockSize - len(data)%blockSize
|
||||||
padding := blocksize - len(ciphertext)%blocksize
|
|
||||||
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
||||||
return append(ciphertext, padtext...)
|
return append(data, padtext...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 去码
|
// PKCS7UnPadding 去除PKCS7填充
|
||||||
func PKCS7UnPadding(origData []byte) []byte {
|
func PKCS7UnPadding(data []byte) ([]byte, error) {
|
||||||
length := len(origData)
|
length := len(data)
|
||||||
unpadding := int(origData[length-1])
|
if length == 0 {
|
||||||
return origData[:(length - unpadding)]
|
return nil, errors.New("数据长度为0")
|
||||||
|
}
|
||||||
|
|
||||||
|
padding := int(data[length-1])
|
||||||
|
if padding > length {
|
||||||
|
return nil, errors.New("填充长度无效")
|
||||||
|
}
|
||||||
|
|
||||||
|
return data[:length-padding], nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user